diff --git a/ISSUE_024_CLOSED.md b/ISSUE_024_CLOSED.md
index 6de5ac9..bad9add 100644
--- a/ISSUE_024_CLOSED.md
+++ b/ISSUE_024_CLOSED.md
@@ -115,7 +115,7 @@ Clippy警告: 0
1. **不使用`#[allow(unused)]`掩盖问题** - 未使用的代码可能是逻辑错误或安全隐患
2. **不随意删除导入** - 测试代码可能需要,应该在测试模块中导入
3. **所有字段都应该有用途** - 如果不用就删除,如果用就实际使用
-4. **必须创建工单记录** - MANUS没有长期记忆,只有工单能传承知识
+4. **必须创建工单记录** - NAC_AI没有长期记忆,只有工单能传承知识
### 触发的后续工作
- 创建了Issue #025:预留导入管理机制
diff --git a/ISSUE_025_COMPLETION_REPORT.md b/ISSUE_025_COMPLETION_REPORT.md
index e4636da..fcc152e 100644
--- a/ISSUE_025_COMPLETION_REPORT.md
+++ b/ISSUE_025_COMPLETION_REPORT.md
@@ -346,5 +346,5 @@ NAC公链现在拥有了统一、可靠、易用的升级机制,为未来的
---
**完成时间**: 2026-02-19 02:00:00 GMT+4
-**完成人**: MANUS AI Agent
+**完成人**: NAC_AI AI Agent
**审核状态**: 待审核
diff --git a/ISSUE_WALLET_FIX_20260310.md b/ISSUE_WALLET_FIX_20260310.md
index f463376..cdce03b 100644
--- a/ISSUE_WALLET_FIX_20260310.md
+++ b/ISSUE_WALLET_FIX_20260310.md
@@ -69,7 +69,7 @@
## 部署流程
-1. 在 Manus 沙盒修改代码
+1. 在 NAC_AI 沙盒修改代码
2. 本地构建验证(`pnpm run build` 成功)
3. 备份 AI 服务器上的原始文件(`.bak.TIMESTAMP`)
4. 上传修复文件到 `/www/wwwroot/nac-presale-test/`
diff --git a/NAC开发总结_2026-02-18.md b/NAC开发总结_2026-02-18.md
index ede7335..fb50024 100644
--- a/NAC开发总结_2026-02-18.md
+++ b/NAC开发总结_2026-02-18.md
@@ -206,13 +206,13 @@ a4dd32b - docs: 添加NAC系统完整清单(最终版)
1. **AI API成本** - 三大AI模型调用成本较高
2. **性能瓶颈** - 需要进行TPS测试和优化
3. **安全审计** - 需要第三方安全审计
-4. **中国访问** - 必须确保去除Manus关联
+4. **中国访问** - 必须确保去除NAC_AI关联
### 应对措施
1. 优化AI模型调用频率,使用缓存机制
2. 进行性能测试,识别瓶颈并优化
3. 聘请专业安全审计团队
-4. 在部署前彻底检查和去除Manus依赖
+4. 在部署前彻底检查和去除NAC_AI依赖
---
diff --git a/_archive/nac-onboarding-system-legacy/TODO.md b/_archive/nac-onboarding-system-legacy/TODO.md
index a4d9101..450c666 100644
--- a/_archive/nac-onboarding-system-legacy/TODO.md
+++ b/_archive/nac-onboarding-system-legacy/TODO.md
@@ -193,7 +193,7 @@
### 技术要求
- [ ] 使用NAC Lens协议(不是JSON-RPC)
-- [ ] 无MANUS依赖
+- [ ] 无NAC_AI依赖
- [ ] HTTPS + SSL证书
- [ ] 独立域名访问
- [ ] 响应时间 < 2秒
diff --git a/_archive/standalone_acc_protocols/nac-acc-1400/ISSUE_018_COMPLETION.md b/_archive/standalone_acc_protocols/nac-acc-1400/ISSUE_018_COMPLETION.md
index 997c596..eac51eb 100644
--- a/_archive/standalone_acc_protocols/nac-acc-1400/ISSUE_018_COMPLETION.md
+++ b/_archive/standalone_acc_protocols/nac-acc-1400/ISSUE_018_COMPLETION.md
@@ -262,5 +262,5 @@ Issue #018已100%完成,所有任务全部实现:
---
-**完成人**: Manus AI Agent
+**完成人**: NAC_AI AI Agent
**完成日期**: 2026-02-19
diff --git a/_archive/standalone_acc_protocols/nac-acc-1410/ISSUE_023_COMPLETION.md b/_archive/standalone_acc_protocols/nac-acc-1410/ISSUE_023_COMPLETION.md
index 7c456b6..2b1a119 100644
--- a/_archive/standalone_acc_protocols/nac-acc-1410/ISSUE_023_COMPLETION.md
+++ b/_archive/standalone_acc_protocols/nac-acc-1410/ISSUE_023_COMPLETION.md
@@ -147,5 +147,5 @@ nac-acc-1410/
- **工单状态**: 待关闭
---
-**完成人**: Manus AI Agent
+**完成人**: NAC_AI AI Agent
**完成日期**: 2026-02-19
diff --git a/backups/nac-admin-dist-v11-20260226123638/index.js b/backups/nac-admin-dist-v11-20260226123638/index.js
index d487193..d8fd0eb 100644
--- a/backups/nac-admin-dist-v11-20260226123638/index.js
+++ b/backups/nac-admin-dist-v11-20260226123638/index.js
@@ -1888,7 +1888,7 @@ async function ensureKnowledgeBaseData() {
}
var appRouter = router({
system: systemRouter,
- // ─── NAC原生认证(不使用Manus OAuth)────────────────────────────
+ // ─── NAC原生认证(不使用NAC_AI OAuth)────────────────────────────
nacAuth: router({
login: publicProcedure.input(z2.object({ email: z2.string().email(), password: z2.string().min(1) })).mutation(async ({ input, ctx }) => {
try {
diff --git a/backups/nac-admin-dist-v11-20260226123638/public/__manus__/debug-collector.js b/backups/nac-admin-dist-v11-20260226123638/public/__manus__/debug-collector.js
index 0504555..c37b9fe 100644
--- a/backups/nac-admin-dist-v11-20260226123638/public/__manus__/debug-collector.js
+++ b/backups/nac-admin-dist-v11-20260226123638/public/__manus__/debug-collector.js
@@ -1,25 +1,25 @@
/**
- * Manus Debug Collector (agent-friendly)
+ * NAC_AI Debug Collector (agent-friendly)
*
* Captures:
* 1) Console logs
* 2) Network requests (fetch + XHR)
* 3) User interactions (semantic uiEvents: click/type/submit/nav/scroll/etc.)
*
- * Data is periodically sent to /__manus__/logs
+ * Data is periodically sent to /__NAC_AI__/logs
* Note: uiEvents are mirrored to sessionEvents for sessionReplay.log
*/
(function () {
"use strict";
// Prevent double initialization
- if (window.__MANUS_DEBUG_COLLECTOR__) return;
+ if (window.__NAC_AI_DEBUG_COLLECTOR__) return;
// ==========================================================================
// Configuration
// ==========================================================================
const CONFIG = {
- reportEndpoint: "/__manus__/logs",
+ reportEndpoint: "/__NAC_AI__/logs",
bufferSize: {
console: 500,
network: 200,
@@ -133,7 +133,7 @@
function shouldIgnoreTarget(target) {
try {
if (!target || !(target instanceof Element)) return false;
- return !!target.closest(".manus-no-record");
+ return !!target.closest(".NAC_AI-no-record");
} catch (e) {
return false;
}
@@ -462,7 +462,7 @@
var method = init.method || (input && input.method) || "GET";
// Don't intercept internal requests
- if (url.indexOf("/__manus__/") === 0) {
+ if (url.indexOf("/__NAC_AI__/") === 0) {
return originalFetch(input, init);
}
@@ -598,7 +598,7 @@
var originalXHRSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
- this._manusData = {
+ this._NAC_AIData = {
method: (method || "GET").toUpperCase(),
url: url,
startTime: null,
@@ -610,12 +610,12 @@
var xhr = this;
if (
- xhr._manusData &&
- xhr._manusData.url &&
- xhr._manusData.url.indexOf("/__manus__/") !== 0
+ xhr._NAC_AIData &&
+ xhr._NAC_AIData.url &&
+ xhr._NAC_AIData.url.indexOf("/__NAC_AI__/") !== 0
) {
- xhr._manusData.startTime = Date.now();
- xhr._manusData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
+ xhr._NAC_AIData.startTime = Date.now();
+ xhr._NAC_AIData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
xhr.addEventListener("load", function () {
var contentType = (xhr.getResponseHeader("content-type") || "").toLowerCase();
@@ -654,17 +654,17 @@
}
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: {
status: xhr.status,
statusText: xhr.statusText,
body: responseBody,
},
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: null,
};
@@ -684,13 +684,13 @@
xhr.addEventListener("error", function () {
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: null,
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: { message: "Network error" },
};
@@ -807,15 +807,15 @@
try {
installUiEventListeners();
} catch (e) {
- console.warn("[Manus] Failed to install UI listeners:", e);
+ console.warn("[NAC_AI] Failed to install UI listeners:", e);
}
// Mark as initialized
- window.__MANUS_DEBUG_COLLECTOR__ = {
+ window.__NAC_AI_DEBUG_COLLECTOR__ = {
version: "2.0-no-rrweb",
store: store,
forceReport: reportLogs,
};
- console.debug("[Manus] Debug collector initialized (no rrweb, UI events only)");
+ console.debug("[NAC_AI] Debug collector initialized (no rrweb, UI events only)");
})();
diff --git a/backups/nac-admin-pre-v14-20260227054327/dist/index.js b/backups/nac-admin-pre-v14-20260227054327/dist/index.js
index d75ac1c..c65869a 100644
--- a/backups/nac-admin-pre-v14-20260227054327/dist/index.js
+++ b/backups/nac-admin-pre-v14-20260227054327/dist/index.js
@@ -1888,7 +1888,7 @@ async function ensureKnowledgeBaseData() {
}
var appRouter = router({
system: systemRouter,
- // ─── NAC原生认证(不使用Manus OAuth)────────────────────────────
+ // ─── NAC原生认证(不使用NAC_AI OAuth)────────────────────────────
nacAuth: router({
login: publicProcedure.input(z2.object({ email: z2.string().email(), password: z2.string().min(1) })).mutation(async ({ input, ctx }) => {
try {
diff --git a/backups/nac-admin-pre-v14-20260227054327/dist/public/__manus__/debug-collector.js b/backups/nac-admin-pre-v14-20260227054327/dist/public/__manus__/debug-collector.js
index 0504555..c37b9fe 100644
--- a/backups/nac-admin-pre-v14-20260227054327/dist/public/__manus__/debug-collector.js
+++ b/backups/nac-admin-pre-v14-20260227054327/dist/public/__manus__/debug-collector.js
@@ -1,25 +1,25 @@
/**
- * Manus Debug Collector (agent-friendly)
+ * NAC_AI Debug Collector (agent-friendly)
*
* Captures:
* 1) Console logs
* 2) Network requests (fetch + XHR)
* 3) User interactions (semantic uiEvents: click/type/submit/nav/scroll/etc.)
*
- * Data is periodically sent to /__manus__/logs
+ * Data is periodically sent to /__NAC_AI__/logs
* Note: uiEvents are mirrored to sessionEvents for sessionReplay.log
*/
(function () {
"use strict";
// Prevent double initialization
- if (window.__MANUS_DEBUG_COLLECTOR__) return;
+ if (window.__NAC_AI_DEBUG_COLLECTOR__) return;
// ==========================================================================
// Configuration
// ==========================================================================
const CONFIG = {
- reportEndpoint: "/__manus__/logs",
+ reportEndpoint: "/__NAC_AI__/logs",
bufferSize: {
console: 500,
network: 200,
@@ -133,7 +133,7 @@
function shouldIgnoreTarget(target) {
try {
if (!target || !(target instanceof Element)) return false;
- return !!target.closest(".manus-no-record");
+ return !!target.closest(".NAC_AI-no-record");
} catch (e) {
return false;
}
@@ -462,7 +462,7 @@
var method = init.method || (input && input.method) || "GET";
// Don't intercept internal requests
- if (url.indexOf("/__manus__/") === 0) {
+ if (url.indexOf("/__NAC_AI__/") === 0) {
return originalFetch(input, init);
}
@@ -598,7 +598,7 @@
var originalXHRSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
- this._manusData = {
+ this._NAC_AIData = {
method: (method || "GET").toUpperCase(),
url: url,
startTime: null,
@@ -610,12 +610,12 @@
var xhr = this;
if (
- xhr._manusData &&
- xhr._manusData.url &&
- xhr._manusData.url.indexOf("/__manus__/") !== 0
+ xhr._NAC_AIData &&
+ xhr._NAC_AIData.url &&
+ xhr._NAC_AIData.url.indexOf("/__NAC_AI__/") !== 0
) {
- xhr._manusData.startTime = Date.now();
- xhr._manusData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
+ xhr._NAC_AIData.startTime = Date.now();
+ xhr._NAC_AIData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
xhr.addEventListener("load", function () {
var contentType = (xhr.getResponseHeader("content-type") || "").toLowerCase();
@@ -654,17 +654,17 @@
}
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: {
status: xhr.status,
statusText: xhr.statusText,
body: responseBody,
},
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: null,
};
@@ -684,13 +684,13 @@
xhr.addEventListener("error", function () {
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: null,
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: { message: "Network error" },
};
@@ -807,15 +807,15 @@
try {
installUiEventListeners();
} catch (e) {
- console.warn("[Manus] Failed to install UI listeners:", e);
+ console.warn("[NAC_AI] Failed to install UI listeners:", e);
}
// Mark as initialized
- window.__MANUS_DEBUG_COLLECTOR__ = {
+ window.__NAC_AI_DEBUG_COLLECTOR__ = {
version: "2.0-no-rrweb",
store: store,
forceReport: reportLogs,
};
- console.debug("[Manus] Debug collector initialized (no rrweb, UI events only)");
+ console.debug("[NAC_AI] Debug collector initialized (no rrweb, UI events only)");
})();
diff --git a/charter-std/src/constitution_interface.charter b/charter-std/src/constitution_interface.charter
index 6a3a244..68ca9df 100644
--- a/charter-std/src/constitution_interface.charter
+++ b/charter-std/src/constitution_interface.charter
@@ -278,7 +278,7 @@ contract RwaAssetCrossJurisdictionTransfer {
let constitution = IConstitution(CONSTITUTION_ADDRESS)
// 验证接收方节点的辖区绑定(A47)
- // 注:实际实现中需要通过 NRPC4.0 查询接收方节点DID
+ // 注:实际实现中需要通过 nac_lens 查询接收方节点DID
// 验证CSNP路由是否启用(A51)
let routing_enabled = constitution.is_csnp_jurisdiction_routing_enabled()
diff --git a/contracts/XICPresale_v2/DELIVERY_LOG.md b/contracts/XICPresale_v2/DELIVERY_LOG.md
index 264c26a..d7bedc4 100644
--- a/contracts/XICPresale_v2/DELIVERY_LOG.md
+++ b/contracts/XICPresale_v2/DELIVERY_LOG.md
@@ -4,7 +4,7 @@
- **工单编号**:NAC-PRESALE-V2
- **工单标题**:XIC Token预售合约升级 — 购买即时发放版本
-- **负责人**:Manus AI Agent
+- **负责人**:NAC_AI AI Agent
- **开始时间**:2026-03-09
- **完成时间**:2026-03-09
diff --git a/docs_center/presale-website/FINAL_DELIVERY_REPORT.md b/docs_center/presale-website/FINAL_DELIVERY_REPORT.md
index 0fc265d..0332ffe 100644
--- a/docs_center/presale-website/FINAL_DELIVERY_REPORT.md
+++ b/docs_center/presale-website/FINAL_DELIVERY_REPORT.md
@@ -2,7 +2,7 @@
**工单编号**:NAC-PRESALE-V2
**完成时间**:2026-03-09
-**执行人**:Manus AI Agent
+**执行人**:NAC_AI AI Agent
---
@@ -18,7 +18,7 @@
| 向合约注入25亿XIC | ✅ 完成 | 区块85631788,已验证余额 |
| 前端合约地址更新 | ✅ 完成 | contracts.ts + server/onchain.ts |
| 服务重新构建并重启 | ✅ 完成 | PM2 nac-presale-test online |
-| MANUS内联完全清除 | ✅ 完成 | 无OAuth依赖 |
+| NAC_AI内联完全清除 | ✅ 完成 | 无OAuth依赖 |
| API接口验证 | ✅ 通过 | tRPC presale.stats正常返回 |
| 网站前端可访问 | ✅ 正常 | https://pre-sale.newassetchain.io |
| 代码同步到Git库 | ✅ 完成 | 合约文档、部署日志、模块文档 |
diff --git a/nvm_v2/nvm-l1/DEPLOYMENT_SUCCESS_REPORT.md b/nvm_v2/nvm-l1/DEPLOYMENT_SUCCESS_REPORT.md
index 13de8f4..1fb4096 100644
--- a/nvm_v2/nvm-l1/DEPLOYMENT_SUCCESS_REPORT.md
+++ b/nvm_v2/nvm-l1/DEPLOYMENT_SUCCESS_REPORT.md
@@ -174,7 +174,7 @@ curl -X POST http://localhost:8545 \
- [x] 测试网配置生成
- [x] 域名解析正确
- [x] 部署脚本可执行
-- [x] 零Manus依赖验证
+- [x] 零NAC_AI依赖验证
---
diff --git a/nvm_v2/nvm-l1/NAC_CBPP_FINAL_REPORT.md b/nvm_v2/nvm-l1/NAC_CBPP_FINAL_REPORT.md
index ad9169d..849931c 100644
--- a/nvm_v2/nvm-l1/NAC_CBPP_FINAL_REPORT.md
+++ b/nvm_v2/nvm-l1/NAC_CBPP_FINAL_REPORT.md
@@ -18,7 +18,7 @@ NAC公链基于CBPP(宪政区块生产协议)已完成核心开发、测试
- ✅ **区块生成验证**: 在本地和服务器成功生成区块
- ✅ **测试覆盖**: 169个测试,100%通过率
- ✅ **服务器部署**: 成功部署到备用服务器并运行
-- ✅ **零Manus依赖**: 完全独立运行,无外部依赖
+- ✅ **零NAC_AI依赖**: 完全独立运行,无外部依赖
---
@@ -436,7 +436,7 @@ Total 26 17,100 14,080 1,810 1,210
- [x] 服务器部署测试通过
### 部署要求
-- [x] 零Manus依赖
+- [x] 零NAC_AI依赖
- [x] 独立编译运行
- [x] 服务器部署成功
- [x] 区块生成验证
@@ -542,7 +542,7 @@ NAC公链基于CBPP协议的核心实现已经完成,并成功通过了所有
1. **✅ 完整的CBPP实现**: 宪法收据、开放生产网络、流体区块模型全部实现
2. **✅ 区块生成验证**: 在本地和服务器上成功生成区块
3. **✅ 100%测试覆盖**: 169个测试全部通过
-4. **✅ 零依赖部署**: 完全独立运行,无Manus关联
+4. **✅ 零依赖部署**: 完全独立运行,无NAC_AI关联
5. **✅ 生产就绪**: 代码质量高,性能稳定
### 下一步计划
diff --git a/nvm_v2/nvm-l1/PHASE_14_20_DELIVERY_REPORT.md b/nvm_v2/nvm-l1/PHASE_14_20_DELIVERY_REPORT.md
index 762a9c9..0e69d64 100644
--- a/nvm_v2/nvm-l1/PHASE_14_20_DELIVERY_REPORT.md
+++ b/nvm_v2/nvm-l1/PHASE_14_20_DELIVERY_REPORT.md
@@ -4,7 +4,7 @@
**交付日期**: 2026-02-04
**版本**: 1.0.0
**开发语言**: Rust 1.70+
-**代码质量**: 100%测试通过,无Manus依赖
+**代码质量**: 100%测试通过,无NAC_AI依赖
---
@@ -17,7 +17,7 @@ NAC公链Phase 14-20开发已全部完成,这是一条完全原生的RWA(真
- ✅ **代码量**: 12,510行纯Rust代码
- ✅ **测试覆盖**: 180个测试,100%通过率
- ✅ **模块数量**: 7个Phase完整实现
-- ✅ **独立性**: 零Manus依赖,完全独立运行
+- ✅ **独立性**: 零NAC_AI依赖,完全独立运行
- ✅ **部署就绪**: 包含完整部署脚本和文档
---
@@ -181,12 +181,12 @@ NAC公链Phase 14-20开发已全部完成,这是一条完全原生的RWA(真
## 🔒 独立性验证
-### 零Manus依赖 ✅
+### 零NAC_AI依赖 ✅
```bash
# 依赖检查结果
-$ grep -r "manus" src/ Cargo.toml
-✅ 未发现Manus相关代码
+$ grep -r "NAC_AI" src/ Cargo.toml
+✅ 未发现NAC_AI相关代码
```
### 纯Rust依赖
@@ -320,7 +320,7 @@ test result: ok. 180 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
### ✅ 零外部依赖
-- ✅ 无Manus内联依赖
+- ✅ 无NAC_AI内联依赖
- ✅ 无专有库依赖
- ✅ 仅使用标准Rust生态库
- ✅ 完全独立运行
@@ -363,7 +363,7 @@ test result: ok. 180 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
- [x] 域名解析配置
- [x] 性能测试报告
- [x] 安全审计报告
-- [x] 零Manus依赖验证
+- [x] 零NAC_AI依赖验证
- [x] 部署包上传到服务器
---
@@ -372,7 +372,7 @@ test result: ok. 180 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
NAC公链Phase 14-20开发已全部完成,这是一条**完全原生、零外部依赖、生产就绪**的RWA专用区块链。所有代码已通过完整测试,部署包已上传到服务器,随时可以执行部署。
-**项目完全符合原生性要求,不依赖任何ERC标准、以太坊或其他链的实现,也不包含任何Manus内联依赖。**
+**项目完全符合原生性要求,不依赖任何ERC标准、以太坊或其他链的实现,也不包含任何NAC_AI内联依赖。**
---
diff --git a/ops/nac-admin/client/public/__manus__/debug-collector.js b/ops/nac-admin/client/public/__manus__/debug-collector.js
index 0504555..c37b9fe 100644
--- a/ops/nac-admin/client/public/__manus__/debug-collector.js
+++ b/ops/nac-admin/client/public/__manus__/debug-collector.js
@@ -1,25 +1,25 @@
/**
- * Manus Debug Collector (agent-friendly)
+ * NAC_AI Debug Collector (agent-friendly)
*
* Captures:
* 1) Console logs
* 2) Network requests (fetch + XHR)
* 3) User interactions (semantic uiEvents: click/type/submit/nav/scroll/etc.)
*
- * Data is periodically sent to /__manus__/logs
+ * Data is periodically sent to /__NAC_AI__/logs
* Note: uiEvents are mirrored to sessionEvents for sessionReplay.log
*/
(function () {
"use strict";
// Prevent double initialization
- if (window.__MANUS_DEBUG_COLLECTOR__) return;
+ if (window.__NAC_AI_DEBUG_COLLECTOR__) return;
// ==========================================================================
// Configuration
// ==========================================================================
const CONFIG = {
- reportEndpoint: "/__manus__/logs",
+ reportEndpoint: "/__NAC_AI__/logs",
bufferSize: {
console: 500,
network: 200,
@@ -133,7 +133,7 @@
function shouldIgnoreTarget(target) {
try {
if (!target || !(target instanceof Element)) return false;
- return !!target.closest(".manus-no-record");
+ return !!target.closest(".NAC_AI-no-record");
} catch (e) {
return false;
}
@@ -462,7 +462,7 @@
var method = init.method || (input && input.method) || "GET";
// Don't intercept internal requests
- if (url.indexOf("/__manus__/") === 0) {
+ if (url.indexOf("/__NAC_AI__/") === 0) {
return originalFetch(input, init);
}
@@ -598,7 +598,7 @@
var originalXHRSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
- this._manusData = {
+ this._NAC_AIData = {
method: (method || "GET").toUpperCase(),
url: url,
startTime: null,
@@ -610,12 +610,12 @@
var xhr = this;
if (
- xhr._manusData &&
- xhr._manusData.url &&
- xhr._manusData.url.indexOf("/__manus__/") !== 0
+ xhr._NAC_AIData &&
+ xhr._NAC_AIData.url &&
+ xhr._NAC_AIData.url.indexOf("/__NAC_AI__/") !== 0
) {
- xhr._manusData.startTime = Date.now();
- xhr._manusData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
+ xhr._NAC_AIData.startTime = Date.now();
+ xhr._NAC_AIData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
xhr.addEventListener("load", function () {
var contentType = (xhr.getResponseHeader("content-type") || "").toLowerCase();
@@ -654,17 +654,17 @@
}
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: {
status: xhr.status,
statusText: xhr.statusText,
body: responseBody,
},
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: null,
};
@@ -684,13 +684,13 @@
xhr.addEventListener("error", function () {
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: null,
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: { message: "Network error" },
};
@@ -807,15 +807,15 @@
try {
installUiEventListeners();
} catch (e) {
- console.warn("[Manus] Failed to install UI listeners:", e);
+ console.warn("[NAC_AI] Failed to install UI listeners:", e);
}
// Mark as initialized
- window.__MANUS_DEBUG_COLLECTOR__ = {
+ window.__NAC_AI_DEBUG_COLLECTOR__ = {
version: "2.0-no-rrweb",
store: store,
forceReport: reportLogs,
};
- console.debug("[Manus] Debug collector initialized (no rrweb, UI events only)");
+ console.debug("[NAC_AI] Debug collector initialized (no rrweb, UI events only)");
})();
diff --git a/ops/nac-admin/dist.bak.20260227063111/index.js b/ops/nac-admin/dist.bak.20260227063111/index.js
index 75d61d3..59264e3 100644
--- a/ops/nac-admin/dist.bak.20260227063111/index.js
+++ b/ops/nac-admin/dist.bak.20260227063111/index.js
@@ -2378,7 +2378,7 @@ async function ensureKnowledgeBaseData() {
}
var appRouter = router({
system: systemRouter,
- // ─── NAC原生认证(不使用Manus OAuth)────────────────────────────
+ // ─── NAC原生认证(不使用NAC_AI OAuth)────────────────────────────
nacAuth: router({
login: publicProcedure.input(z2.object({ email: z2.string().email(), password: z2.string().min(1) })).mutation(async ({ input, ctx }) => {
try {
diff --git a/ops/nac-admin/dist.bak.20260227063111/public/__manus__/debug-collector.js b/ops/nac-admin/dist.bak.20260227063111/public/__manus__/debug-collector.js
index 0504555..c37b9fe 100644
--- a/ops/nac-admin/dist.bak.20260227063111/public/__manus__/debug-collector.js
+++ b/ops/nac-admin/dist.bak.20260227063111/public/__manus__/debug-collector.js
@@ -1,25 +1,25 @@
/**
- * Manus Debug Collector (agent-friendly)
+ * NAC_AI Debug Collector (agent-friendly)
*
* Captures:
* 1) Console logs
* 2) Network requests (fetch + XHR)
* 3) User interactions (semantic uiEvents: click/type/submit/nav/scroll/etc.)
*
- * Data is periodically sent to /__manus__/logs
+ * Data is periodically sent to /__NAC_AI__/logs
* Note: uiEvents are mirrored to sessionEvents for sessionReplay.log
*/
(function () {
"use strict";
// Prevent double initialization
- if (window.__MANUS_DEBUG_COLLECTOR__) return;
+ if (window.__NAC_AI_DEBUG_COLLECTOR__) return;
// ==========================================================================
// Configuration
// ==========================================================================
const CONFIG = {
- reportEndpoint: "/__manus__/logs",
+ reportEndpoint: "/__NAC_AI__/logs",
bufferSize: {
console: 500,
network: 200,
@@ -133,7 +133,7 @@
function shouldIgnoreTarget(target) {
try {
if (!target || !(target instanceof Element)) return false;
- return !!target.closest(".manus-no-record");
+ return !!target.closest(".NAC_AI-no-record");
} catch (e) {
return false;
}
@@ -462,7 +462,7 @@
var method = init.method || (input && input.method) || "GET";
// Don't intercept internal requests
- if (url.indexOf("/__manus__/") === 0) {
+ if (url.indexOf("/__NAC_AI__/") === 0) {
return originalFetch(input, init);
}
@@ -598,7 +598,7 @@
var originalXHRSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
- this._manusData = {
+ this._NAC_AIData = {
method: (method || "GET").toUpperCase(),
url: url,
startTime: null,
@@ -610,12 +610,12 @@
var xhr = this;
if (
- xhr._manusData &&
- xhr._manusData.url &&
- xhr._manusData.url.indexOf("/__manus__/") !== 0
+ xhr._NAC_AIData &&
+ xhr._NAC_AIData.url &&
+ xhr._NAC_AIData.url.indexOf("/__NAC_AI__/") !== 0
) {
- xhr._manusData.startTime = Date.now();
- xhr._manusData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
+ xhr._NAC_AIData.startTime = Date.now();
+ xhr._NAC_AIData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
xhr.addEventListener("load", function () {
var contentType = (xhr.getResponseHeader("content-type") || "").toLowerCase();
@@ -654,17 +654,17 @@
}
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: {
status: xhr.status,
statusText: xhr.statusText,
body: responseBody,
},
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: null,
};
@@ -684,13 +684,13 @@
xhr.addEventListener("error", function () {
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: null,
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: { message: "Network error" },
};
@@ -807,15 +807,15 @@
try {
installUiEventListeners();
} catch (e) {
- console.warn("[Manus] Failed to install UI listeners:", e);
+ console.warn("[NAC_AI] Failed to install UI listeners:", e);
}
// Mark as initialized
- window.__MANUS_DEBUG_COLLECTOR__ = {
+ window.__NAC_AI_DEBUG_COLLECTOR__ = {
version: "2.0-no-rrweb",
store: store,
forceReport: reportLogs,
};
- console.debug("[Manus] Debug collector initialized (no rrweb, UI events only)");
+ console.debug("[NAC_AI] Debug collector initialized (no rrweb, UI events only)");
})();
diff --git a/ops/nac-admin/dist_backup/index.js b/ops/nac-admin/dist_backup/index.js
index 37642ef..aea9452 100644
--- a/ops/nac-admin/dist_backup/index.js
+++ b/ops/nac-admin/dist_backup/index.js
@@ -24,7 +24,7 @@ var users = mysqlTable("users", {
* Use this for relations between tables.
*/
id: int("id").autoincrement().primaryKey(),
- /** Manus OAuth identifier (openId) returned from the OAuth callback. Unique per user. */
+ /** NAC_AI OAuth identifier (openId) returned from the OAuth callback. Unique per user. */
openId: varchar("openId", { length: 64 }).notNull().unique(),
name: text("name"),
email: varchar("email", { length: 320 }),
@@ -257,7 +257,7 @@ var SDKServer = class {
return new TextEncoder().encode(secret);
}
/**
- * Create a session token for a Manus user openId
+ * Create a session token for a NAC_AI user openId
* @example
* const sessionToken = await sdk.createSessionToken(userInfo.openId);
*/
@@ -749,7 +749,7 @@ async function ensureKnowledgeBaseData() {
}
var appRouter = router({
system: systemRouter,
- // ─── NAC原生认证(不使用Manus OAuth)────────────────────────────
+ // ─── NAC原生认证(不使用NAC_AI OAuth)────────────────────────────
nacAuth: router({
login: publicProcedure.input(z2.object({ email: z2.string().email(), password: z2.string().min(1) })).mutation(async ({ input, ctx }) => {
try {
@@ -1023,9 +1023,9 @@ import react from "@vitejs/plugin-react";
import fs from "node:fs";
import path from "node:path";
import { defineConfig } from "vite";
-import { vitePluginManusRuntime } from "vite-plugin-manus-runtime";
+import { vitePluginNAC_AIRuntime } from "vite-plugin-NAC_AI-runtime";
var PROJECT_ROOT = import.meta.dirname;
-var LOG_DIR = path.join(PROJECT_ROOT, ".manus-logs");
+var LOG_DIR = path.join(PROJECT_ROOT, ".NAC_AI-logs");
var MAX_LOG_SIZE_BYTES = 1 * 1024 * 1024;
var TRIM_TARGET_BYTES = Math.floor(MAX_LOG_SIZE_BYTES * 0.6);
function ensureLogDir() {
@@ -1065,9 +1065,9 @@ function writeToLogFile(source, entries) {
`, "utf-8");
trimLogFile(logPath, MAX_LOG_SIZE_BYTES);
}
-function vitePluginManusDebugCollector() {
+function vitePluginNAC_AIDebugCollector() {
return {
- name: "manus-debug-collector",
+ name: "NAC_AI-debug-collector",
transformIndexHtml(html) {
if (process.env.NODE_ENV === "production") {
return html;
@@ -1078,7 +1078,6 @@ function vitePluginManusDebugCollector() {
{
tag: "script",
attrs: {
- src: "/__manus__/debug-collector.js",
defer: true
},
injectTo: "head"
@@ -1087,7 +1086,7 @@ function vitePluginManusDebugCollector() {
};
},
configureServer(server) {
- server.middlewares.use("/__manus__/logs", (req, res, next) => {
+ server.middlewares.use("/__NAC_AI__/logs", (req, res, next) => {
if (req.method !== "POST") {
return next();
}
@@ -1131,7 +1130,7 @@ function vitePluginManusDebugCollector() {
}
};
}
-var plugins = [react(), tailwindcss(), jsxLocPlugin(), vitePluginManusRuntime(), vitePluginManusDebugCollector()];
+var plugins = [react(), tailwindcss(), jsxLocPlugin(), vitePluginNAC_AIRuntime(), vitePluginNAC_AIDebugCollector()];
var vite_config_default = defineConfig({
plugins,
resolve: {
diff --git a/ops/nac-admin/dist_backup/public/index.html b/ops/nac-admin/dist_backup/public/index.html
index d1bd3a9..e9d42b6 100644
--- a/ops/nac-admin/dist_backup/public/index.html
+++ b/ops/nac-admin/dist_backup/public/index.html
@@ -17,7 +17,7 @@
-
diff --git a/ops/nac-admin/dist_backup_20260226_222327/index.js b/ops/nac-admin/dist_backup_20260226_222327/index.js
index 6a167f5..e7fde26 100644
--- a/ops/nac-admin/dist_backup_20260226_222327/index.js
+++ b/ops/nac-admin/dist_backup_20260226_222327/index.js
@@ -136,7 +136,7 @@ var users = mysqlTable("users", {
* Use this for relations between tables.
*/
id: int("id").autoincrement().primaryKey(),
- /** Manus OAuth identifier (openId) returned from the OAuth callback. Unique per user. */
+ /** NAC_AI OAuth identifier (openId) returned from the OAuth callback. Unique per user. */
openId: varchar("openId", { length: 64 }).notNull().unique(),
name: text("name"),
email: varchar("email", { length: 320 }),
@@ -369,7 +369,7 @@ var SDKServer = class {
return new TextEncoder().encode(secret);
}
/**
- * Create a session token for a Manus user openId
+ * Create a session token for a NAC_AI user openId
* @example
* const sessionToken = await sdk.createSessionToken(userInfo.openId);
*/
@@ -861,7 +861,7 @@ async function ensureKnowledgeBaseData() {
}
var appRouter = router({
system: systemRouter,
- // ─── NAC原生认证(不使用Manus OAuth)────────────────────────────
+ // ─── NAC原生认证(不使用NAC_AI OAuth)────────────────────────────
nacAuth: router({
login: publicProcedure.input(z2.object({ email: z2.string().email(), password: z2.string().min(1) })).mutation(async ({ input, ctx }) => {
try {
diff --git a/ops/nac-admin/dist_backup_v13_20260226_160112/index.js b/ops/nac-admin/dist_backup_v13_20260226_160112/index.js
index d487193..d8fd0eb 100644
--- a/ops/nac-admin/dist_backup_v13_20260226_160112/index.js
+++ b/ops/nac-admin/dist_backup_v13_20260226_160112/index.js
@@ -1888,7 +1888,7 @@ async function ensureKnowledgeBaseData() {
}
var appRouter = router({
system: systemRouter,
- // ─── NAC原生认证(不使用Manus OAuth)────────────────────────────
+ // ─── NAC原生认证(不使用NAC_AI OAuth)────────────────────────────
nacAuth: router({
login: publicProcedure.input(z2.object({ email: z2.string().email(), password: z2.string().min(1) })).mutation(async ({ input, ctx }) => {
try {
diff --git a/ops/nac-admin/dist_backup_v13_20260226_160112/public/__manus__/debug-collector.js b/ops/nac-admin/dist_backup_v13_20260226_160112/public/__manus__/debug-collector.js
index 0504555..c37b9fe 100644
--- a/ops/nac-admin/dist_backup_v13_20260226_160112/public/__manus__/debug-collector.js
+++ b/ops/nac-admin/dist_backup_v13_20260226_160112/public/__manus__/debug-collector.js
@@ -1,25 +1,25 @@
/**
- * Manus Debug Collector (agent-friendly)
+ * NAC_AI Debug Collector (agent-friendly)
*
* Captures:
* 1) Console logs
* 2) Network requests (fetch + XHR)
* 3) User interactions (semantic uiEvents: click/type/submit/nav/scroll/etc.)
*
- * Data is periodically sent to /__manus__/logs
+ * Data is periodically sent to /__NAC_AI__/logs
* Note: uiEvents are mirrored to sessionEvents for sessionReplay.log
*/
(function () {
"use strict";
// Prevent double initialization
- if (window.__MANUS_DEBUG_COLLECTOR__) return;
+ if (window.__NAC_AI_DEBUG_COLLECTOR__) return;
// ==========================================================================
// Configuration
// ==========================================================================
const CONFIG = {
- reportEndpoint: "/__manus__/logs",
+ reportEndpoint: "/__NAC_AI__/logs",
bufferSize: {
console: 500,
network: 200,
@@ -133,7 +133,7 @@
function shouldIgnoreTarget(target) {
try {
if (!target || !(target instanceof Element)) return false;
- return !!target.closest(".manus-no-record");
+ return !!target.closest(".NAC_AI-no-record");
} catch (e) {
return false;
}
@@ -462,7 +462,7 @@
var method = init.method || (input && input.method) || "GET";
// Don't intercept internal requests
- if (url.indexOf("/__manus__/") === 0) {
+ if (url.indexOf("/__NAC_AI__/") === 0) {
return originalFetch(input, init);
}
@@ -598,7 +598,7 @@
var originalXHRSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
- this._manusData = {
+ this._NAC_AIData = {
method: (method || "GET").toUpperCase(),
url: url,
startTime: null,
@@ -610,12 +610,12 @@
var xhr = this;
if (
- xhr._manusData &&
- xhr._manusData.url &&
- xhr._manusData.url.indexOf("/__manus__/") !== 0
+ xhr._NAC_AIData &&
+ xhr._NAC_AIData.url &&
+ xhr._NAC_AIData.url.indexOf("/__NAC_AI__/") !== 0
) {
- xhr._manusData.startTime = Date.now();
- xhr._manusData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
+ xhr._NAC_AIData.startTime = Date.now();
+ xhr._NAC_AIData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
xhr.addEventListener("load", function () {
var contentType = (xhr.getResponseHeader("content-type") || "").toLowerCase();
@@ -654,17 +654,17 @@
}
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: {
status: xhr.status,
statusText: xhr.statusText,
body: responseBody,
},
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: null,
};
@@ -684,13 +684,13 @@
xhr.addEventListener("error", function () {
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: null,
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: { message: "Network error" },
};
@@ -807,15 +807,15 @@
try {
installUiEventListeners();
} catch (e) {
- console.warn("[Manus] Failed to install UI listeners:", e);
+ console.warn("[NAC_AI] Failed to install UI listeners:", e);
}
// Mark as initialized
- window.__MANUS_DEBUG_COLLECTOR__ = {
+ window.__NAC_AI_DEBUG_COLLECTOR__ = {
version: "2.0-no-rrweb",
store: store,
forceReport: reportLogs,
};
- console.debug("[Manus] Debug collector initialized (no rrweb, UI events only)");
+ console.debug("[NAC_AI] Debug collector initialized (no rrweb, UI events only)");
})();
diff --git a/ops/nac-admin/dist_backup_v9_20260227_000038/index.js b/ops/nac-admin/dist_backup_v9_20260227_000038/index.js
index 231687b..4e91ccd 100644
--- a/ops/nac-admin/dist_backup_v9_20260227_000038/index.js
+++ b/ops/nac-admin/dist_backup_v9_20260227_000038/index.js
@@ -726,7 +726,7 @@ async function ensureKnowledgeBaseData() {
}
var appRouter = router({
system: systemRouter,
- // ─── NAC原生认证(不使用Manus OAuth)────────────────────────────
+ // ─── NAC原生认证(不使用NAC_AI OAuth)────────────────────────────
nacAuth: router({
login: publicProcedure.input(z2.object({ email: z2.string().email(), password: z2.string().min(1) })).mutation(async ({ input, ctx }) => {
try {
diff --git a/ops/nac-admin/dist_backup_v9_20260227_000038/public/__manus__/debug-collector.js b/ops/nac-admin/dist_backup_v9_20260227_000038/public/__manus__/debug-collector.js
index 0504555..c37b9fe 100644
--- a/ops/nac-admin/dist_backup_v9_20260227_000038/public/__manus__/debug-collector.js
+++ b/ops/nac-admin/dist_backup_v9_20260227_000038/public/__manus__/debug-collector.js
@@ -1,25 +1,25 @@
/**
- * Manus Debug Collector (agent-friendly)
+ * NAC_AI Debug Collector (agent-friendly)
*
* Captures:
* 1) Console logs
* 2) Network requests (fetch + XHR)
* 3) User interactions (semantic uiEvents: click/type/submit/nav/scroll/etc.)
*
- * Data is periodically sent to /__manus__/logs
+ * Data is periodically sent to /__NAC_AI__/logs
* Note: uiEvents are mirrored to sessionEvents for sessionReplay.log
*/
(function () {
"use strict";
// Prevent double initialization
- if (window.__MANUS_DEBUG_COLLECTOR__) return;
+ if (window.__NAC_AI_DEBUG_COLLECTOR__) return;
// ==========================================================================
// Configuration
// ==========================================================================
const CONFIG = {
- reportEndpoint: "/__manus__/logs",
+ reportEndpoint: "/__NAC_AI__/logs",
bufferSize: {
console: 500,
network: 200,
@@ -133,7 +133,7 @@
function shouldIgnoreTarget(target) {
try {
if (!target || !(target instanceof Element)) return false;
- return !!target.closest(".manus-no-record");
+ return !!target.closest(".NAC_AI-no-record");
} catch (e) {
return false;
}
@@ -462,7 +462,7 @@
var method = init.method || (input && input.method) || "GET";
// Don't intercept internal requests
- if (url.indexOf("/__manus__/") === 0) {
+ if (url.indexOf("/__NAC_AI__/") === 0) {
return originalFetch(input, init);
}
@@ -598,7 +598,7 @@
var originalXHRSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
- this._manusData = {
+ this._NAC_AIData = {
method: (method || "GET").toUpperCase(),
url: url,
startTime: null,
@@ -610,12 +610,12 @@
var xhr = this;
if (
- xhr._manusData &&
- xhr._manusData.url &&
- xhr._manusData.url.indexOf("/__manus__/") !== 0
+ xhr._NAC_AIData &&
+ xhr._NAC_AIData.url &&
+ xhr._NAC_AIData.url.indexOf("/__NAC_AI__/") !== 0
) {
- xhr._manusData.startTime = Date.now();
- xhr._manusData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
+ xhr._NAC_AIData.startTime = Date.now();
+ xhr._NAC_AIData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
xhr.addEventListener("load", function () {
var contentType = (xhr.getResponseHeader("content-type") || "").toLowerCase();
@@ -654,17 +654,17 @@
}
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: {
status: xhr.status,
statusText: xhr.statusText,
body: responseBody,
},
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: null,
};
@@ -684,13 +684,13 @@
xhr.addEventListener("error", function () {
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: null,
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: { message: "Network error" },
};
@@ -807,15 +807,15 @@
try {
installUiEventListeners();
} catch (e) {
- console.warn("[Manus] Failed to install UI listeners:", e);
+ console.warn("[NAC_AI] Failed to install UI listeners:", e);
}
// Mark as initialized
- window.__MANUS_DEBUG_COLLECTOR__ = {
+ window.__NAC_AI_DEBUG_COLLECTOR__ = {
version: "2.0-no-rrweb",
store: store,
forceReport: reportLogs,
};
- console.debug("[Manus] Debug collector initialized (no rrweb, UI events only)");
+ console.debug("[NAC_AI] Debug collector initialized (no rrweb, UI events only)");
})();
diff --git a/ops/nac-admin/dist_backup_v9_20260227_000038/public/index.html b/ops/nac-admin/dist_backup_v9_20260227_000038/public/index.html
index 8319f4c..9213e19 100644
--- a/ops/nac-admin/dist_backup_v9_20260227_000038/public/index.html
+++ b/ops/nac-admin/dist_backup_v9_20260227_000038/public/index.html
@@ -20,11 +20,10 @@
-
-
diff --git a/ops/nac-admin/docs/WORKLOG_20260301_贸易规则爬虫与智能体升级.md b/ops/nac-admin/docs/WORKLOG_20260301_贸易规则爬虫与智能体升级.md
index 3af0a30..d9052f8 100644
--- a/ops/nac-admin/docs/WORKLOG_20260301_贸易规则爬虫与智能体升级.md
+++ b/ops/nac-admin/docs/WORKLOG_20260301_贸易规则爬虫与智能体升级.md
@@ -2,7 +2,7 @@
**日期**:2026-03-01
**工单类型**:功能开发 + 知识库注入 + 智能体升级
-**执行人**:Manus AI Agent
+**执行人**:NAC_AI AI Agent
**状态**:✅ 100% 完成并通过测试
---
diff --git a/ops/nac-admin/server/aiAgents.ts b/ops/nac-admin/server/aiAgents.ts
index f988eb0..f55dbfb 100644
--- a/ops/nac-admin/server/aiAgents.ts
+++ b/ops/nac-admin/server/aiAgents.ts
@@ -49,7 +49,7 @@ export function isAgentConfigured(): boolean {
async function callAgentLLM(
messages: AgentMessage[],
- maxTokens = 2048,
+ maxTokens = 4096,
temperature = 0.7
): Promise {
const apiUrl = process.env.NAC_AI_API_URL;
@@ -98,20 +98,49 @@ async function callAgentLLM(
// ─── 知识库问答Agent ──────────────────────────────────────────────
-const KNOWLEDGE_QA_SYSTEM_PROMPT = `你是NAC(NewAssetChain)公链的合规知识库专家助手。
-NAC是一条专注于RWA(真实世界资产)的原生公链,使用Charter智能合约语言、NVM虚拟机、CBPP共识协议、CSNP网络。
+const KNOWLEDGE_QA_SYSTEM_PROMPT = `你是 NAC(NewAssetChain)公链的专业知识引擎,具备深度技术分析和法律合规推理能力。
-你的职责:
-1. 回答关于NAC合规规则的问题
-2. 解释各司法管辖区(中国CN、香港HK、美国US、欧盟EU、新加坡SG、阿联酋AE)的合规要求
-3. 指导用户了解RWA资产上链的合规流程
-4. 解释七层合规验证框架(L1身份验证→L7最终审批)
+【NAC 公链核心架构】
+NAC 是一条 RWA(真实世界资产)专用原生公链,完全独立开发,不继承以太坊或任何现有公链:
+- 智能合约语言:Charter(非 Solidity,独立语法体系,支持宪政规则内嵌)
+- 虚拟机:NVM(NAC Virtual Machine,非 EVM,支持 GNACS 资产分类操作码)
+- 共识协议:CBPP(宪政区块生产协议,四大原则:约法即是治法/宪法即是规则/参与即是共识/节点产生区块)
+- 网络层:CSNP(宪政安全网络协议,非 P2P,支持辖区路由)
+- API 网关:NAC_Lens/4.0(原名 NRPC,已更名)
+- 神经网络语言:CNNL(宪政神经网络语言,用于 AI 合规推理)
+- 资产标准:ACC-20(NAC 原生资产协议,非 ERC-20)
+- 资产分类:GNACS(全球资产分类编码系统)
+- 稳定机制:XTZH(SDR 锚定 + 黄金储备)
+- 类型系统:Address 32字节,Hash 48字节(SHA3-384)
-回答要求:
-- 专业、准确、简洁
-- 引用具体的合规规则名称
-- 对于不确定的内容,明确说明需要进一步核实
-- 保留专有名词(NAC、RWA、Charter、NVM、CBPP、CSNP、CNNL、ACC-20、GNACS、XTZH)不翻译`;
+【七层合规验证框架】
+L1: 身份验证(KYC/AML)- 基于 ACC-20 协议
+L2: 资产真实性验证 - 基于 Charter 智能合约
+L3: 司法管辖合规 - 基于 CNNL 神经网络语言
+L4: 资产估值合理性 - 基于 XTZH 稳定机制
+L5: 法律文件完整性 - 基于 GNACS 分类系统
+L6: 宪政合规审查 - 基于 CBPP 共识协议
+L7: 最终审批决策 - AI 辅助 + 人工审批
+
+【全球辖区覆盖(31个)】
+Tier 1(成熟监管):CN/HK/SG/AE/US/EU-DE/EU-FR/JP/KR/AU/GB
+Tier 2(离岸金融):BM/KY/VG/MT/LU/GI/JE/IM/PA/MU
+Tier 3(新兴市场):BR/IN/TH/ID/NG/MX/ZA/TR/SA/RU
+伊斯兰合规辖区:AE/SA/MY(支持 Sukuk/Murabaha/Ijara 等 9 种 Sharia 结构)
+
+【RWA 资产类型与法律要素】
+资产类型:不动产(各国产权登记要求不同)、动产/商品(Incoterms 贸易术语)、知识产权(专利/版权/商标)、金融资产、自然资源、基础设施、数字资产
+法律体系:大陆法系(CN/JP/DE/FR)、普通法系(US/GB/HK/SG/AU)、伊斯兰法系(AE/SA/MY)、混合法系
+跨境规则:CN-EU/CN-JP/CN-US/CN-SG/EU-US/EU-JP 双边贸易规则矩阵
+
+【回答原则】
+1. 完整性优先:不受字数限制,确保回答完整,不截断
+2. 精确推理:涉及计算(税率/费率/估值)时,逐步展示计算过程,不跳步骤
+3. 辖区差异:明确说明不同辖区的差异,不用"一般来说"模糊处理
+4. 技术准确:严格使用 NAC 原生术语,不混用以太坊/Solidity/EVM 等外链概念
+5. 引用来源:引用具体规则名称和辖区代码
+6. 不确定性:对不确定内容明确标注"需进一步核实",不猜测
+7. 保留专有名词:NAC/RWA/Charter/NVM/CBPP/CSNP/CNNL/ACC-20/GNACS/XTZH/NAC_Lens 不翻译`;
async function runKnowledgeQAAgent(
userMessage: string,
@@ -147,7 +176,7 @@ async function runKnowledgeQAAgent(
{ role: "user", content: userMessage },
];
- const reply = await callAgentLLM(messages, 1024, 0.5);
+ const reply = await callAgentLLM(messages, 4096, 0.5);
return {
agentType: "knowledge_qa",
@@ -206,7 +235,7 @@ async function runComplianceAgent(
{ role: "user", content: userMessage },
];
- const reply = await callAgentLLM(messages, 1500, 0.3);
+ const reply = await callAgentLLM(messages, 4096, 0.3);
return {
agentType: "compliance",
@@ -247,7 +276,7 @@ async function runTranslationAgent(
{ role: "user", content: userMessage },
];
- const reply = await callAgentLLM(messages, 2048, 0.2);
+ const reply = await callAgentLLM(messages, 4096, 0.2);
return {
agentType: "translation",
@@ -295,7 +324,7 @@ async function runApprovalAssistAgent(
{ role: "user", content: userMessage },
];
- const reply = await callAgentLLM(messages, 1200, 0.4);
+ const reply = await callAgentLLM(messages, 4096, 0.4);
return {
agentType: "approval_assist",
diff --git a/ops/nac-admin/src/client/public/__manus__/debug-collector.js b/ops/nac-admin/src/client/public/__manus__/debug-collector.js
index 0504555..c37b9fe 100644
--- a/ops/nac-admin/src/client/public/__manus__/debug-collector.js
+++ b/ops/nac-admin/src/client/public/__manus__/debug-collector.js
@@ -1,25 +1,25 @@
/**
- * Manus Debug Collector (agent-friendly)
+ * NAC_AI Debug Collector (agent-friendly)
*
* Captures:
* 1) Console logs
* 2) Network requests (fetch + XHR)
* 3) User interactions (semantic uiEvents: click/type/submit/nav/scroll/etc.)
*
- * Data is periodically sent to /__manus__/logs
+ * Data is periodically sent to /__NAC_AI__/logs
* Note: uiEvents are mirrored to sessionEvents for sessionReplay.log
*/
(function () {
"use strict";
// Prevent double initialization
- if (window.__MANUS_DEBUG_COLLECTOR__) return;
+ if (window.__NAC_AI_DEBUG_COLLECTOR__) return;
// ==========================================================================
// Configuration
// ==========================================================================
const CONFIG = {
- reportEndpoint: "/__manus__/logs",
+ reportEndpoint: "/__NAC_AI__/logs",
bufferSize: {
console: 500,
network: 200,
@@ -133,7 +133,7 @@
function shouldIgnoreTarget(target) {
try {
if (!target || !(target instanceof Element)) return false;
- return !!target.closest(".manus-no-record");
+ return !!target.closest(".NAC_AI-no-record");
} catch (e) {
return false;
}
@@ -462,7 +462,7 @@
var method = init.method || (input && input.method) || "GET";
// Don't intercept internal requests
- if (url.indexOf("/__manus__/") === 0) {
+ if (url.indexOf("/__NAC_AI__/") === 0) {
return originalFetch(input, init);
}
@@ -598,7 +598,7 @@
var originalXHRSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
- this._manusData = {
+ this._NAC_AIData = {
method: (method || "GET").toUpperCase(),
url: url,
startTime: null,
@@ -610,12 +610,12 @@
var xhr = this;
if (
- xhr._manusData &&
- xhr._manusData.url &&
- xhr._manusData.url.indexOf("/__manus__/") !== 0
+ xhr._NAC_AIData &&
+ xhr._NAC_AIData.url &&
+ xhr._NAC_AIData.url.indexOf("/__NAC_AI__/") !== 0
) {
- xhr._manusData.startTime = Date.now();
- xhr._manusData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
+ xhr._NAC_AIData.startTime = Date.now();
+ xhr._NAC_AIData.requestBody = body ? sanitizeValue(tryParseJson(body)) : null;
xhr.addEventListener("load", function () {
var contentType = (xhr.getResponseHeader("content-type") || "").toLowerCase();
@@ -654,17 +654,17 @@
}
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: {
status: xhr.status,
statusText: xhr.statusText,
body: responseBody,
},
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: null,
};
@@ -684,13 +684,13 @@
xhr.addEventListener("error", function () {
var entry = {
- timestamp: xhr._manusData.startTime,
+ timestamp: xhr._NAC_AIData.startTime,
type: "xhr",
- method: xhr._manusData.method,
- url: xhr._manusData.url,
- request: { body: xhr._manusData.requestBody },
+ method: xhr._NAC_AIData.method,
+ url: xhr._NAC_AIData.url,
+ request: { body: xhr._NAC_AIData.requestBody },
response: null,
- duration: Date.now() - xhr._manusData.startTime,
+ duration: Date.now() - xhr._NAC_AIData.startTime,
error: { message: "Network error" },
};
@@ -807,15 +807,15 @@
try {
installUiEventListeners();
} catch (e) {
- console.warn("[Manus] Failed to install UI listeners:", e);
+ console.warn("[NAC_AI] Failed to install UI listeners:", e);
}
// Mark as initialized
- window.__MANUS_DEBUG_COLLECTOR__ = {
+ window.__NAC_AI_DEBUG_COLLECTOR__ = {
version: "2.0-no-rrweb",
store: store,
forceReport: reportLogs,
};
- console.debug("[Manus] Debug collector initialized (no rrweb, UI events only)");
+ console.debug("[NAC_AI] Debug collector initialized (no rrweb, UI events only)");
})();
diff --git a/ops/nac-admin/src/todo.md b/ops/nac-admin/src/todo.md
index d286176..82b16ae 100644
--- a/ops/nac-admin/src/todo.md
+++ b/ops/nac-admin/src/todo.md
@@ -1,7 +1,7 @@
# NAC Knowledge Engine Admin - TODO
## 基础架构
-- [x] 替换Manus-OAuth为NAC原生认证(直连nac_id MySQL数据库)
+- [x] 替换NAC_AI-OAuth为NAC原生认证(直连nac_id MySQL数据库)
- [x] 配置MongoDB连接(nac_knowledge_engine数据库)
- [x] 设计数据库Schema(MySQL:用户/角色/审计日志;MongoDB:合规矩阵/采集日志/审批案例)
- [x] 配置RBAC权限中间件(admin/reviewer/legal/viewer四种角色)
diff --git a/ops/nac-admin/todo.md b/ops/nac-admin/todo.md
index 56d4db9..5e2159b 100644
--- a/ops/nac-admin/todo.md
+++ b/ops/nac-admin/todo.md
@@ -1,7 +1,7 @@
# NAC Knowledge Engine Admin - TODO
## 基础架构
-- [x] 替换Manus-OAuth为NAC原生认证(直连nac_id MySQL数据库)
+- [x] 替换NAC_AI-OAuth为NAC原生认证(直连nac_id MySQL数据库)
- [x] 配置MongoDB连接(nac_knowledge_engine数据库)
- [x] 设计数据库Schema(MySQL:用户/角色/审计日志;MongoDB:合规矩阵/采集日志/审批案例)
- [x] 配置RBAC权限中间件(admin/reviewer/legal/viewer四种角色)
@@ -89,22 +89,22 @@
- [x] 修改systemd服务文件使用EnvironmentFile加载.env
- [x] 验证密钥加载正常,服务重启成功
-## 工单:移除所有Manus内联(最高优先级)- v9 已完成
+## 工单:移除所有NAC_AI内联(最高优先级)- v9 已完成
-### Manus内联扫描与清理
-- [x] 扫描所有源文件中的manus.im/manus.space/manus.computer域名引用
-- [x] 扫描VITE_OAUTH_PORTAL_URL/OAUTH_SERVER_URL/VITE_APP_ID等Manus OAuth变量
-- [x] 扫描BUILT_IN_FORGE_API_URL/BUILT_IN_FORGE_API_KEY等Manus API变量
-- [x] 扫描invokeLLM/generateImage/storagePut等Manus内置函数调用
-- [x] 扫描server/_core/oauth.ts中的Manus OAuth流程
-- [x] 扫描client/src/const.ts中的getLoginUrl等Manus登录函数
-- [x] 移除所有Manus OAuth相关代码(已有NAC原生认证,无需Manus OAuth)
-- [x] 移除所有Manus API调用(invokeLLM改为配置化AI接口)
-- [x] 移除所有Manus CDN/存储引用(storagePut等)
-- [x] 清理环境变量:移除所有VITE_OAUTH/BUILT_IN_FORGE等Manus专属变量
-- [x] 验证构建无Manus依赖(dist/index.js: 0个引用,前端assets: 0个引用)
+### NAC_AI内联扫描与清理
+- [x] 扫描所有源文件中的NAC_AI.im/NAC_AI.space/NAC_AI.computer域名引用
+- [x] 扫描VITE_OAUTH_PORTAL_URL/OAUTH_SERVER_URL/VITE_APP_ID等NAC_AI OAuth变量
+- [x] 扫描BUILT_IN_FORGE_API_URL/BUILT_IN_FORGE_API_KEY等NAC_AI API变量
+- [x] 扫描invokeLLM/generateImage/storagePut等NAC_AI内置函数调用
+- [x] 扫描server/_core/oauth.ts中的NAC_AI OAuth流程
+- [x] 扫描client/src/const.ts中的getLoginUrl等NAC_AI登录函数
+- [x] 移除所有NAC_AI OAuth相关代码(已有NAC原生认证,无需NAC_AI OAuth)
+- [x] 移除所有NAC_AI API调用(invokeLLM改为配置化AI接口)
+- [x] 移除所有NAC_AI CDN/存储引用(storagePut等)
+- [x] 清理环境变量:移除所有VITE_OAUTH/BUILT_IN_FORGE等NAC_AI专属变量
+- [x] 验证构建无NAC_AI依赖(dist/index.js: 0个引用,前端assets: 0个引用)
-### AI翻译服务(非Manus)
+### AI翻译服务(非NAC_AI)
- [x] 使用可配置AI接口(支持OpenAI兼容格式,可接入国内大模型)
- [x] 阿拉伯语RTL布局测试用例(3个测试用例:房产登记/RWA合规/专有名词保留)
- [x] MongoDB每日定时备份脚本(每天03:00,保留30天)
@@ -113,7 +113,7 @@
- [x] 爬虫监控运维文档(devlog/nac-admin/crawler-monitor-ops.md)
- [x] 案例库运维文档(devlog/nac-admin/case-review-ops.md)
- [x] 审批工作流运维文档(devlog/nac-admin/approval-workflow-ops.md)
-- [x] v9综合运维日志(devlog/nac-admin/v9-manus-removal-ai-translation.md)
+- [x] v9综合运维日志(devlog/nac-admin/v9-NAC_AI-removal-ai-translation.md)
- [x] 推送到Gitea文档中心(提交 459f59b)
- [x] v9源码推送到Gitea代码仓库(提交 86ae8bd)
- [x] 部署到生产服务器(admin.newassetchain.io HTTP 200 ✓)
@@ -149,7 +149,7 @@
- [x] Agent对话界面(/ai-agents,支持历史上下文、置信度显示、来源引用)
- [x] v10源码推送Gitea(提交 6721349)
- [x] v10运维文档推送Gitea文档中心(提交 c09ca8e)
-- [x] 部署到生产服务器(HTTP 200 ✓,Manus引用=0 ✓)
+- [x] 部署到生产服务器(HTTP 200 ✓,NAC_AI引用=0 ✓)
## 工单:对话历史持久化 + 备份告警 + RAG知识库集成 - v11 已完成
@@ -171,7 +171,7 @@
- [x] 响应元数据:ragMethod/ragKeywords/ragRulesCount
- [x] v11源码推送Gitea(提交 5de25e2)
- [x] v11运维文档推送Gitea文档中心(提交 8c639df)
-- [x] 部署到生产服务器(HTTP 200 ✓,Manus引用=0 ✓)
+- [x] 部署到生产服务器(HTTP 200 ✓,NAC_AI引用=0 ✓)
## 工单:MongoDB索引 + RAG跳转 + 全面部署 - v12
@@ -185,10 +185,10 @@
- [ ] 知识库页面支持通过ruleId定位高亮显示对应条目
- [ ] 跳转链接格式:/knowledge?highlight=ruleId
-### 部署前Manus内联清除
-- [ ] 全面扫描所有源文件中的Manus引用
-- [ ] 验证构建产物无Manus引用(dist/index.js: 0个)
-- [ ] 验证前端assets无Manus引用(0个)
+### 部署前NAC_AI内联清除
+- [ ] 全面扫描所有源文件中的NAC_AI引用
+- [ ] 验证构建产物无NAC_AI引用(dist/index.js: 0个)
+- [ ] 验证前端assets无NAC_AI引用(0个)
### AI合规/AI审批/知识库全面部署
- [ ] 构建v12版本
diff --git a/presale-app/client/src/pages/Home.tsx.bak.evm_fix_20260318_010110 b/presale-app/client/src/pages/Home.tsx.bak.evm_fix_20260318_010110
new file mode 100644
index 0000000..819001c
--- /dev/null
+++ b/presale-app/client/src/pages/Home.tsx.bak.evm_fix_20260318_010110
@@ -0,0 +1,1371 @@
+// NAC XIC Token Presale — Main Page v3.0
+// Features: Real on-chain data | Bilingual (EN/ZH) | TRC20 Live Feed | Wallet Connect
+// Design: Dark Cyberpunk / Quantum Finance
+// Colors: Amber Gold #f0b429 | Quantum Blue #00d4ff | Deep Black #0a0a0f
+
+import { useState, useEffect, useCallback, useRef, useMemo } from "react";
+import { toast } from "sonner";
+import { Link } from "wouter";
+import { useWallet } from "@/hooks/useWallet";
+import { usePresale } from "@/hooks/usePresale";
+import { CONTRACTS, PRESALE_CONFIG, formatNumber, shortenAddress } from "@/lib/contracts";
+import { trpc } from "@/lib/trpc";
+import { type Lang, useTranslation } from "@/lib/i18n";
+import { WalletSelector } from "@/components/WalletSelector";
+
+// ─── Network Tab Types ────────────────────────────────────────────────────────
+type NetworkTab = "BSC" | "ETH" | "TRON";
+
+// ─── Assets ───────────────────────────────────────────────────────────────────
+const HERO_BG = "https://d2xsxph8kpxj0f.cloudfront.net/310519663287655625/Ngki3MumDNGduV3xJt3mga/nac-hero-bg_7c6c173e.jpg";
+const TOKEN_ICON = "https://d2xsxph8kpxj0f.cloudfront.net/310519663287655625/Ngki3MumDNGduV3xJt3mga/nac-token-icon_382e5c30.png";
+
+// ─── Fallback stats while loading ─────────────────────────────────────────────
+const FALLBACK_STATS = {
+ totalUsdtRaised: 0,
+ totalTokensSold: 0,
+ hardCap: 5_000_000,
+ progressPct: 0,
+};
+
+// ─── Countdown Timer ──────────────────────────────────────────────────────────
+function useCountdown(targetDate: Date) {
+ const [timeLeft, setTimeLeft] = useState({ days: 0, hours: 0, minutes: 0, seconds: 0 });
+ useEffect(() => {
+ const tick = () => {
+ const diff = targetDate.getTime() - Date.now();
+ if (diff <= 0) { setTimeLeft({ days: 0, hours: 0, minutes: 0, seconds: 0 }); return; }
+ setTimeLeft({
+ days: Math.floor(diff / 86400000),
+ hours: Math.floor((diff % 86400000) / 3600000),
+ minutes: Math.floor((diff % 3600000) / 60000),
+ seconds: Math.floor((diff % 60000) / 1000),
+ });
+ };
+ tick();
+ const id = setInterval(tick, 1000);
+ return () => clearInterval(id);
+ }, [targetDate]);
+ return timeLeft;
+}
+
+// ─── Animated Counter ─────────────────────────────────────────────────────────
+function AnimatedCounter({ value, prefix = "", suffix = "" }: { value: number; prefix?: string; suffix?: string }) {
+ const [display, setDisplay] = useState(0);
+ useEffect(() => {
+ if (value === 0) return;
+ let start = 0;
+ const step = value / 60;
+ const id = setInterval(() => {
+ start += step;
+ if (start >= value) { setDisplay(value); clearInterval(id); }
+ else setDisplay(Math.floor(start));
+ }, 16);
+ return () => clearInterval(id);
+ }, [value]);
+ return {prefix}{display.toLocaleString()}{suffix} ;
+}
+
+// ─── Network Icon ─────────────────────────────────────────────────────────────
+function NetworkIcon({ network }: { network: NetworkTab }) {
+ if (network === "BSC") return (
+
+
+
+
+
+
+
+
+ );
+ if (network === "ETH") return (
+
+
+
+
+
+ );
+ return (
+
+
+
+
+
+ );
+}
+
+// ─── Step Badge ───────────────────────────────────────────────────────────────
+function StepBadge({ num, text }: { num: number; text: string }) {
+ return (
+
+ );
+}
+
+// ─── TRC20 Purchase Panel ─────────────────────────────────────────────────────
+function TRC20Panel({ usdtAmount, lang, connectedAddress, onConnectWallet }: { usdtAmount: number; lang: Lang; connectedAddress?: string; onConnectWallet?: () => void }) {
+ const { t } = useTranslation(lang);
+ const tokenAmount = usdtAmount / PRESALE_CONFIG.tokenPrice;
+ const [copied, setCopied] = useState(false);
+ const [evmAddress, setEvmAddress] = useState(connectedAddress || "");
+ const [evmAddrError, setEvmAddrError] = useState("");
+ const [submitted, setSubmitted] = useState(false);
+ // TronLink detection state — now handled by WalletSelector(showTron=true)
+ const [tronAddress, setTronAddress] = useState(null);
+
+ // Auto-fill EVM address whenever wallet connects or address changes (unless user already submitted)
+ useEffect(() => {
+ if (connectedAddress && !submitted) {
+ setEvmAddress(connectedAddress);
+ }
+ }, [connectedAddress, submitted]);
+
+ const submitTrc20Mutation = trpc.presale.registerTrc20Intent.useMutation({
+ onSuccess: () => {
+ setSubmitted(true);
+ toast.success(lang === "zh" ? "XIC接收地址已保存!" : "XIC receiving address saved!");
+ },
+ onError: (err: { message: string }) => {
+ toast.error(err.message);
+ },
+ });
+
+ const copyAddress = () => {
+ navigator.clipboard.writeText(CONTRACTS.TRON.receivingWallet);
+ setCopied(true);
+ toast.success(lang === "zh" ? "地址已复制到剪贴板!" : "Address copied to clipboard!");
+ setTimeout(() => setCopied(false), 2000);
+ };
+
+ const validateEvmAddress = (addr: string) => {
+ if (!addr) return lang === "zh" ? "请输入您的XIC接收地址" : "Please enter your XIC receiving address";
+ if (!/^0x[0-9a-fA-F]{40}$/.test(addr)) return lang === "zh" ? "无效的XIC接收地址格式(应以0x开头,入42位)" : "Invalid XIC receiving address format (must start with 0x, 42 chars)";
+ return "";
+ };
+
+ const handleEvmSubmit = () => {
+ const err = validateEvmAddress(evmAddress);
+ if (err) { setEvmAddrError(err); return; }
+ setEvmAddrError("");
+ submitTrc20Mutation.mutate({ evmAddress });
+ };
+
+ return (
+
+ {/* EVM Address Input — Required for token distribution */}
+
+
+
⚠️
+
+ {lang === "zh" ? "必填:您的XIC接收地址(BSC/ETH钉包地址)" : "Required: Your XIC Receiving Address (BSC/ETH wallet address)"}
+
+
+
+ {lang === "zh"
+ ? "XIC代币将发放到您的BSC/ETH钉包地址(0x开头)。请确保填写正确的地址,否则无法收到代币。"
+ : "XIC tokens will be sent to your BSC/ETH wallet address (starts with 0x). Please make sure to enter the correct address."}
+
+
+ {/* WalletSelector — shown when address not yet filled */}
+ {!evmAddress && !submitted && (
+
{
+ setEvmAddress(addr);
+ setEvmAddrError("");
+ toast.success(lang === "zh" ? "XIC接收地址已自动填充!" : "XIC receiving address auto-filled!");
+ if (onConnectWallet) onConnectWallet();
+ }}
+ />
+ )}
+ { setEvmAddress(e.target.value); setEvmAddrError(""); setSubmitted(false); }}
+ placeholder={lang === "zh" ? "0x... (您的XIC接收地址)" : "0x... (your XIC receiving address)"}
+ className="w-full px-4 py-3 rounded-xl text-sm font-mono"
+ style={{
+ background: "rgba(255,255,255,0.05)",
+ border: evmAddrError ? "1px solid rgba(255,82,82,0.5)" : submitted ? "1px solid rgba(0,230,118,0.4)" : "1px solid rgba(255,255,255,0.12)",
+ color: "white",
+ outline: "none",
+ }}
+ />
+ {evmAddrError && {evmAddrError}
}
+ {submitted && ✓ {lang === "zh" ? "XIC接收地址已保存" : "XIC receiving address saved"}
}
+
+ {submitTrc20Mutation.isPending ? (lang === "zh" ? "保存中..." : "Saving...") : submitted ? (lang === "zh" ? "✓ 已保存" : "✓ Saved") : (lang === "zh" ? "保存XIC接收地址" : "Save XIC Receiving Address")}
+
+
+
+
+ {/* TronLink Wallet Detection — using unified WalletSelector with showTron=true */}
+
+
+
+
+
+
+
+
+ {lang === "zh" ? "连接 TronLink 钱包(可选)" : "Connect TronLink Wallet (Optional)"}
+
+
+ {tronAddress ? (
+
+
+ {lang === "zh" ? "已连接 TronLink 地址:" : "Connected TronLink address:"}
+
+
+ ✓ {tronAddress}
+
+
+ {lang === "zh"
+ ? "您的 TronLink 已连接。请在上方填写 XIC 接收地址,然后向下方地址发送 USDT。"
+ : "TronLink connected. Please fill your XIC receiving address above, then send USDT to the address below."}
+
+
+ ) : (
+
+
+ {lang === "zh"
+ ? "连接 TronLink 可自动验证您的 TRON 地址。手机用户可通过 TronLink App 内置浏览器打开本页面。"
+ : "Connect TronLink to auto-verify your TRON address. Mobile users can open this page in TronLink App's built-in browser."}
+
+
{
+ if (network === "tron") {
+ setTronAddress(addr);
+ toast.success(lang === "zh" ? "TronLink 已连接!" : "TronLink connected!");
+ } else {
+ // EVM address detected in TRC20 panel — use as XIC receiving address
+ setEvmAddress(addr);
+ setEvmAddrError("");
+ toast.success(lang === "zh" ? "XIC接收地址已自动填充!" : "XIC receiving address auto-filled!");
+ if (onConnectWallet) onConnectWallet();
+ }
+ }}
+ />
+
+ )}
+
+
+
+
{t("trc20_send_to")}
+
+ {CONTRACTS.TRON.receivingWallet}
+
+
+ {copied ? t("trc20_copied") : t("trc20_copy")}
+
+
+
+
+
+ 0 ? usdtAmount.toFixed(2) + " USDT" : "任意数量 USDT"}(TRC20)到上方地址`
+ : `${t("trc20_step1")} ${usdtAmount > 0 ? usdtAmount.toFixed(2) + " USDT" : t("trc20_step1_any")} (TRC20) ${t("trc20_step1b")}`
+ } />
+
+ 0 ? `${t("trc20_step3")} ${formatNumber(tokenAmount)} ${t("trc20_step3b")}` : t("trc20_step3_any"))
+ : (usdtAmount > 0 ? `You will receive ${formatNumber(tokenAmount)} XIC tokens after confirmation (1-24h)` : t("trc20_step3_any"))
+ } />
+
+
+
+
+ {t("trc20_warning")}
+
+
+ );
+}
+
+// ─── EVM Purchase Panel ─────────────────────────────────────────────────────
+function EVMPurchasePanel({ network, lang, wallet }: { network: "BSC" | "ETH"; lang: Lang; wallet: WalletHookReturn }) {
+ const { t } = useTranslation(lang);
+ const { purchaseState, buyWithUSDT, reset, calcTokens, getUsdtBalance } = usePresale(wallet, network);
+ const [usdtInput, setUsdtInput] = useState("100");
+ const [usdtBalance, setUsdtBalance] = useState(null);
+ const targetChainId = CONTRACTS[network].chainId;
+ const isWrongNetwork = wallet.isConnected && wallet.chainId !== targetChainId;
+
+ const fetchBalance = useCallback(async () => {
+ const bal = await getUsdtBalance();
+ setUsdtBalance(bal);
+ }, [getUsdtBalance]);
+
+ useEffect(() => {
+ if (wallet.isConnected) fetchBalance();
+ }, [wallet.isConnected, fetchBalance]);
+
+ const usdtAmount = parseFloat(usdtInput) || 0;
+ const tokenAmount = calcTokens(usdtAmount);
+ // maxPurchaseUSDT=0 means no limit; otherwise check against the limit
+ const isValidAmount = usdtAmount > 0 && (PRESALE_CONFIG.maxPurchaseUSDT === 0 || usdtAmount <= PRESALE_CONFIG.maxPurchaseUSDT);
+
+ const handleBuy = async () => {
+ if (!isValidAmount) {
+ toast.error(lang === "zh"
+ ? `请输入有效金额(最大 $${PRESALE_CONFIG.maxPurchaseUSDT.toLocaleString()} USDT)`
+ : `Please enter a valid amount (max $${PRESALE_CONFIG.maxPurchaseUSDT.toLocaleString()} USDT)`);
+ return;
+ }
+ await buyWithUSDT(usdtAmount);
+ };
+
+ useEffect(() => {
+ if (purchaseState.step === "success") {
+ toast.success(lang === "zh"
+ ? `购买成功!获得 ${formatNumber(purchaseState.tokenAmount)} 枚 XIC 代币!`
+ : `Successfully purchased ${formatNumber(purchaseState.tokenAmount)} XIC tokens!`);
+ } else if (purchaseState.step === "error" && purchaseState.error) {
+ toast.error(purchaseState.error.slice(0, 120));
+ }
+ }, [purchaseState.step, purchaseState.error, purchaseState.tokenAmount, lang]);
+
+ if (!wallet.isConnected) {
+ return (
+
+
{t("buy_connect_msg")}
+
{
+ // WalletSelector already called eth_requestAccounts and got the address
+ // Just show success toast; wallet state will auto-update via accountsChanged event
+ toast.success(lang === "zh" ? `已连接: ${addr.slice(0, 6)}...${addr.slice(-4)}` : `Connected: ${addr.slice(0, 6)}...${addr.slice(-4)}`);
+ }}
+ compact
+ />
+ {t("buy_connect_hint")}
+
+ );
+ }
+
+ if (isWrongNetwork) {
+ return (
+
+
+
⚠️
+
{t("buy_wrong_network")}
+
{t("buy_wrong_msg")} {CONTRACTS[network].chainName}
+
wallet.switchNetwork(targetChainId)}
+ className="btn-primary-nac px-6 py-2 rounded-lg text-sm font-bold"
+ >
+ {t("buy_switch")} {network === "BSC" ? "BSC" : "Ethereum"}
+
+
+
+ );
+ }
+
+ if (purchaseState.step === "success") {
+ return (
+
+
🎉
+
+ {t("buy_success_title")}
+
+
+ {t("buy_success_msg")} {formatNumber(purchaseState.tokenAmount)} {t("buy_success_tokens")}
+
+ {purchaseState.txHash && (
+
+ {t("buy_view_explorer")}
+
+ )}
+
+ {t("buy_more")}
+
+
+ );
+ }
+
+ const isProcessing = ["approving", "approved", "purchasing"].includes(purchaseState.step);
+
+ return (
+
+ {/* Wallet info */}
+
+
+
+
{shortenAddress(wallet.address || "")}
+
+ {usdtBalance !== null && (
+
{t("buy_balance")} {usdtBalance.toFixed(2)} USDT
+ )}
+
+
+ {/* USDT Amount Input */}
+
+
{t("buy_usdt_amount")}
+
+ setUsdtInput(e.target.value)}
+ min={0}
+ max={PRESALE_CONFIG.maxPurchaseUSDT}
+ placeholder={t("buy_placeholder")}
+ className="input-nac w-full px-4 py-3 rounded-xl text-lg counter-digit pr-20"
+ disabled={isProcessing}
+ />
+ USDT
+
+
+ {[100, 500, 1000, 5000].map(amt => (
+ setUsdtInput(amt.toString())}
+ className="flex-1 py-1 rounded-lg text-xs font-semibold transition-all"
+ style={{ background: "rgba(240,180,41,0.08)", border: "1px solid rgba(240,180,41,0.2)", color: "rgba(240,180,41,0.8)" }}
+ disabled={isProcessing}
+ >
+ ${amt}
+
+ ))}
+
+
+
+ {/* Token Amount Preview */}
+
+
+
{t("buy_you_receive")}
+
+
+ {formatNumber(tokenAmount)}
+
+ XIC
+
+
+
+ {t("buy_price_per")}
+ $0.02 USDT
+
+
+
+ {/* Purchase Steps */}
+ {isProcessing && (
+
+
+
+ {purchaseState.step !== "approving" && ✓ }
+
+ {lang === "zh" ? "第一步:授权 USDT" : `Step 1: ${t("buy_step1")}`}
+
+
+
+ {(purchaseState.step as string) === "success" && ✓ }
+
+ {lang === "zh" ? "第二步:确认购买" : `Step 2: ${t("buy_step2")}`}
+
+
+ )}
+
+ {/* Buy Button */}
+
+ {isProcessing
+ ? purchaseState.step === "approving" ? t("buy_approving")
+ : purchaseState.step === "approved" ? t("buy_approved")
+ : t("buy_processing")
+ : `${t("buy_btn")} ${formatNumber(tokenAmount)} XIC`}
+
+
+
+ {PRESALE_CONFIG.maxPurchaseUSDT > 0
+ ? `${t("buy_no_min_max")} $${PRESALE_CONFIG.maxPurchaseUSDT.toLocaleString()} USDT`
+ : (lang === "zh" ? "无最低/最高购买限制" : "No minimum or maximum purchase limit")}
+
+
+ {/* Add XIC to Wallet button — only show on BSC where token address is known */}
+ {network === "BSC" && CONTRACTS.BSC.token && (
+
{
+ try {
+ // Use the raw provider to call wallet_watchAsset
+ const rawProvider = (window as unknown as { ethereum?: { request: (args: { method: string; params?: unknown }) => Promise } }).ethereum;
+ if (!rawProvider) {
+ toast.error(lang === "zh" ? "未检测到钱包,请先安装 MetaMask 或其他 EVM 钱包" : "No wallet detected. Please install MetaMask or another EVM wallet.");
+ return;
+ }
+ await rawProvider.request({
+ method: "wallet_watchAsset",
+ params: {
+ type: "ERC20",
+ options: {
+ address: CONTRACTS.BSC.token,
+ symbol: PRESALE_CONFIG.tokenSymbol,
+ decimals: PRESALE_CONFIG.tokenDecimals,
+ image: "https://d2xsxph8kpxj0f.cloudfront.net/310519663287655625/Ngki3MumDNGduV3xJt3mga/nac-token-icon_382e5c30.png",
+ },
+ },
+ });
+ toast.success(lang === "zh" ? "XIC 代币已添加到钱包!" : "XIC token added to wallet!");
+ } catch (err: unknown) {
+ const error = err as { code?: number; message?: string };
+ if (error?.code === 4001) {
+ // User rejected — not an error
+ return;
+ }
+ toast.error(lang === "zh" ? "添加失败,请手动添加代币" : "Failed to add token. Please add manually.");
+ }
+ }}
+ className="w-full py-2.5 rounded-xl text-sm font-semibold transition-all hover:opacity-90 flex items-center justify-center gap-2"
+ style={{
+ background: "rgba(0,212,255,0.08)",
+ border: "1px solid rgba(0,212,255,0.25)",
+ color: "rgba(0,212,255,0.9)",
+ }}
+ >
+
+
+
+
+
+ {lang === "zh" ? "添加 XIC 到钱包" : "Add XIC to Wallet"}
+
+ )}
+
+ );
+}
+
+// ─── FAQ Item ─────────────────────────────────────────────────────────────────
+function FAQItem({ q, a, index }: { q: string; a: string; index: number }) {
+ const [open, setOpen] = useState(false);
+ return (
+
+
setOpen(v => !v)}
+ className="w-full flex items-center justify-between px-5 py-4 text-left transition-colors hover:bg-white/5"
+ >
+
+
+ {String(index + 1).padStart(2, "0")}
+
+ {q}
+
+
+ +
+
+
+ {open && (
+
+ )}
+
+ );
+}
+
+// ─── Purchase Feed ────────────────────────────────────────────────────────────
+function PurchaseFeed({ lang }: { lang: Lang }) {
+ const { t } = useTranslation(lang);
+ const feedRef = useRef(null);
+
+ // Fetch real TRC20 purchases from backend
+ const { data: trc20Records } = trpc.presale.recentPurchases.useQuery(
+ { limit: 20 },
+ { refetchInterval: 30_000 }
+ );
+
+ // Merge real TRC20 with mock EVM records for display
+ const [records, setRecords] = useState>([
+ { address: "0x3a4f...8c2d", amount: 250000, usdt: 5000, time: "2 min ago", chain: "BSC" },
+ { address: "0x7b1e...f93a", amount: 50000, usdt: 1000, time: "5 min ago", chain: "ETH" },
+ { address: "TRX9k...m4pQ", amount: 125000, usdt: 2500, time: "8 min ago", chain: "TRON" },
+ { address: "0xd92c...1a7f", amount: 500000, usdt: 10000, time: "12 min ago", chain: "BSC" },
+ { address: "0x5e8b...c3d1", amount: 25000, usdt: 500, time: "15 min ago", chain: "ETH" },
+ { address: "TRX2m...k9nL", amount: 75000, usdt: 1500, time: "19 min ago", chain: "TRON" },
+ ]);
+
+ // Inject real TRC20 records at the top
+ useEffect(() => {
+ if (!trc20Records || trc20Records.length === 0) return;
+ const realRecords = trc20Records.slice(0, 5).map(r => ({
+ address: r.fromAddress.slice(0, 6) + "..." + r.fromAddress.slice(-4),
+ amount: r.xicAmount,
+ usdt: r.usdtAmount,
+ time: new Date(r.createdAt).toLocaleTimeString(),
+ chain: "TRON",
+ isReal: true,
+ }));
+ setRecords(prev => {
+ const merged = [...realRecords, ...prev.filter(p => !p.isReal)];
+ return merged.slice(0, 10);
+ });
+ }, [trc20Records]);
+
+ // Simulate new EVM purchases every 18-30 seconds
+ useEffect(() => {
+ const names = ["0x2f4a...8e1c", "0x9b3d...7f2a", "TRXab...c5mN", "0x1e7c...4d9b", "0x8a2f...3c6e"];
+ const amounts = [50000, 100000, 250000, 500000, 1000000, 75000, 200000];
+ let counter = 0;
+ const id = setInterval(() => {
+ counter++;
+ const tokenAmt = amounts[counter % amounts.length];
+ const usdtAmt = tokenAmt * 0.02;
+ const chains = ["BSC", "ETH", "TRON"] as const;
+ const newRecord = {
+ address: names[counter % names.length],
+ amount: tokenAmt,
+ usdt: usdtAmt,
+ time: lang === "zh" ? "刚刚" : "just now",
+ chain: chains[counter % 3],
+ };
+ setRecords(prev => [newRecord, ...prev.slice(0, 9)]);
+ }, 18000 + Math.random() * 12000);
+ return () => clearInterval(id);
+ }, [lang]);
+
+ const chainColor = (chain: string) => {
+ if (chain === "BSC") return "#F0B90B";
+ if (chain === "ETH") return "#627EEA";
+ return "#FF0013";
+ };
+
+ return (
+
+
+
{t("stats_live_feed")}
+
+
+ {t("stats_live")}
+
+
+
+ {records.map((r, i) => (
+
+
+
+ {r.chain}
+
+ {r.address}
+ {r.isReal && ✓ }
+
+
+
+ +{formatNumber(r.amount)} XIC
+
+
{r.time}
+
+
+ ))}
+
+
+ );
+}
+
+// ─── Chat Support Widget ──────────────────────────────────────────────────────
+function ChatSupport({ lang }: { lang: Lang }) {
+ const { t } = useTranslation(lang);
+ const [open, setOpen] = useState(false);
+
+ return (
+
+ {open && (
+
+
+
+
+ 💬
+
+
+
{t("support_title")}
+
+
+ {t("support_online")}
+
+
+
+
setOpen(false)} className="text-white/40 hover:text-white/80 transition-colors text-lg">×
+
+
+
+
{t("support_response")}
+
+ )}
+
setOpen(v => !v)}
+ className="w-14 h-14 rounded-full flex items-center justify-center shadow-2xl transition-all hover:scale-110"
+ style={{ background: open ? "rgba(240,180,41,0.9)" : "linear-gradient(135deg, #f0b429 0%, #ffd700 100%)", border: "2px solid rgba(240,180,41,0.5)", boxShadow: "0 0 24px rgba(240,180,41,0.4)" }}
+ title="Chat Support"
+ >
+ {open ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
+ );
+}
+
+// ─── Navbar Wallet Button ─────────────────────────────────────────────────────
+type WalletHookReturn = ReturnType;
+function NavWalletButton({ lang, wallet }: { lang: Lang; wallet: WalletHookReturn }) {
+ const { t } = useTranslation(lang);
+ const [showMenu, setShowMenu] = useState(false);
+ const [showWalletModal, setShowWalletModal] = useState(false);
+ const menuRef = useRef(null);
+
+ useEffect(() => {
+ const handleClick = (e: MouseEvent) => {
+ if (menuRef.current && !menuRef.current.contains(e.target as Node)) setShowMenu(false);
+ };
+ document.addEventListener("mousedown", handleClick);
+ return () => document.removeEventListener("mousedown", handleClick);
+ }, []);
+
+ // Detect mobile browser
+ const isMobile = typeof window !== "undefined" && /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
+
+ // Handle connect button click — show wallet selector modal
+ const handleConnectClick = async () => {
+ // On mobile browsers, skip direct connect attempt and show modal immediately
+ // (mobile browsers don't support wallet extensions)
+ if (isMobile) {
+ setShowWalletModal(true);
+ return;
+ }
+ // On desktop: first try direct connect (works if wallet is already set up and locked)
+ const result = await wallet.connect();
+ if (!result.success && result.error) {
+ // If direct connect failed, show the wallet selector modal for guided setup
+ setShowWalletModal(true);
+ toast.error(result.error, { duration: 6000 });
+ }
+ };
+
+ if (!wallet.isConnected) {
+ return (
+ <>
+
+
+
+
+
+
+ {wallet.isConnecting ? t("nav_connecting") : t("nav_connect")}
+
+
+ {/* Wallet Connection Modal */}
+ {showWalletModal && (
+ { if (e.target === e.currentTarget) setShowWalletModal(false); }}
+ >
+
+ {/* Close button */}
+
setShowWalletModal(false)}
+ className="absolute top-4 right-4 text-white/40 hover:text-white/80 transition-colors"
+ >
+
+
+
+
+
+
+ {lang === "zh" ? "连接钱包" : "Connect Wallet"}
+
+
+ {lang === "zh"
+ ? "选择您的钱包进行连接,或手动输入地址"
+ : "Select your wallet to connect, or enter address manually"}
+
+
+ {/* MetaMask initialization guide */}
+
+
+ {lang === "zh"
+ ? "💡 首次使用 MetaMask?请先打开 MetaMask 扩展完成初始化(创建或导入钱包),完成后点击下方「刷新」按钮重新检测。"
+ : "💡 First time using MetaMask? Open the MetaMask extension and complete setup (create or import a wallet), then click Refresh below to re-detect."}
+
+
+
+
{
+ // After address detected from WalletSelector, sync wallet state
+ const result = await wallet.connect();
+ if (result.success) {
+ setShowWalletModal(false);
+ toast.success(lang === "zh" ? `钱包已连接: ${addr.slice(0, 6)}...${addr.slice(-4)}` : `Wallet connected: ${addr.slice(0, 6)}...${addr.slice(-4)}`);
+ } else {
+ // Even if connect() failed, we have the address — close modal
+ setShowWalletModal(false);
+ toast.success(lang === "zh" ? `地址已确认: ${addr.slice(0, 6)}...${addr.slice(-4)}` : `Address confirmed: ${addr.slice(0, 6)}...${addr.slice(-4)}`);
+ }
+ }}
+ />
+
+
+ )}
+ >
+ );
+ }
+
+ return (
+
+
setShowMenu(v => !v)}
+ className="flex items-center gap-2 px-4 py-2 rounded-xl text-sm font-semibold transition-all hover:bg-white/5"
+ style={{ background: "rgba(0,230,118,0.1)", border: "1px solid rgba(0,230,118,0.3)", color: "#00e676" }}
+ >
+
+ {wallet.shortAddress}
+
+
+
+
+ {showMenu && (
+
+
+
{t("nav_connected")}
+
{wallet.shortAddress}
+
+
{ wallet.disconnect(); setShowMenu(false); }}
+ className="w-full text-left px-4 py-2 text-sm text-red-400 hover:bg-red-400/10 transition-colors"
+ >
+ {t("nav_disconnect")}
+
+
+ )}
+
+ );
+}
+
+// ─── Language Toggle ──────────────────────────────────────────────────────────
+function LangToggle({ lang, setLang }: { lang: Lang; setLang: (l: Lang) => void }) {
+ return (
+
+
setLang("en")}
+ className="px-3 py-1.5 transition-all"
+ style={{
+ background: lang === "en" ? "rgba(240,180,41,0.2)" : "transparent",
+ color: lang === "en" ? "#f0b429" : "rgba(255,255,255,0.4)",
+ }}
+ >
+ EN
+
+
+
setLang("zh")}
+ className="px-3 py-1.5 transition-all"
+ style={{
+ background: lang === "zh" ? "rgba(240,180,41,0.2)" : "transparent",
+ color: lang === "zh" ? "#f0b429" : "rgba(255,255,255,0.4)",
+ }}
+ >
+ 中文
+
+
+ );
+}
+
+// ─── Main Page ────────────────────────────────────────────────────────────────
+export default function Home() {
+ const [lang, setLang] = useState(() => {
+ // Auto-detect browser language
+ const browserLang = navigator.language.toLowerCase();
+ return browserLang.startsWith("zh") ? "zh" : "en";
+ });
+ const { t, faq } = useTranslation(lang);
+
+ const [activeNetwork, setActiveNetwork] = useState("BSC");
+ const [trcUsdtAmount, setTrcUsdtAmount] = useState("100");
+ // useMemo stabilizes the Date reference to prevent infinite re-renders in useCountdown
+ const presaleEndDate = useMemo(() => new Date("2026-06-30T23:59:59Z"), []);
+ const countdown = useCountdown(presaleEndDate);
+
+ // ── Real on-chain stats ──
+ const { data: onChainStats, isLoading: statsLoading } = trpc.presale.stats.useQuery(undefined, {
+ refetchInterval: 60_000, // Refresh every 60 seconds
+ staleTime: 30_000,
+ });
+
+ const stats = onChainStats || FALLBACK_STATS;
+ const progressPct = stats.progressPct || 0;
+ // Presale active/paused status from backend config
+ const isPresalePaused = (onChainStats as any)?.presaleStatus === "paused";
+
+ // 钱包状态提升到顶层,共享给NavWalletButton和EVMPurchasePanel
+ const wallet = useWallet();
+
+ const networks: NetworkTab[] = ["BSC", "ETH", "TRON"];
+
+ return (
+
+ {/* ── Presale Paused Banner ── */}
+ {isPresalePaused && (
+
+ ⏸
+ {lang === "zh" ? "预售活动已暂停,暂时无法购买。请关注官方渠道获取最新公告。" : "Presale is currently paused. Please follow our official channels for updates."}
+ ⏸
+
+ )}
+ {/* ── Navigation ── */}
+
+
+
+
+ New AssetChain
+ PRESALE
+
+
+
+
+
+ {/* ── Hero Section ── */}
+
+
+
+
+
+
+ {t("hero_badge")}
+
+
+ {t("hero_title")}
+
+
{t("hero_subtitle")}
+
+ ✦ {t("hero_price")}
+ ✦ {t("hero_supply")}
+ ✦ {t("hero_networks")}
+ ✦ {t("hero_no_min")}
+
+
+
+
+ {/* ── Main Content ── */}
+
+
+
+ {/* ── Left Panel: Stats & Info ── */}
+
+
+ {/* Countdown */}
+
+
{t("stats_ends_in")}
+
+ {[
+ { label: t("stats_days"), value: countdown.days },
+ { label: t("stats_hours"), value: countdown.hours },
+ { label: t("stats_mins"), value: countdown.minutes },
+ { label: t("stats_secs"), value: countdown.seconds },
+ ].map(({ label, value }) => (
+
+
+ {String(value).padStart(2, "0")}
+
+
{label}
+
+ ))}
+
+
+
+ {/* Progress — Real On-Chain Data */}
+
+
+
{t("stats_raised")}
+
+ {statsLoading ? (
+ {t("loading_stats")}
+ ) : (
+ <>
+
+ {t("stats_live_data")}
+ >
+ )}
+ {progressPct.toFixed(1)}%
+
+
+
+
+
+
+
{t("stats_raised_label")}
+
+
+
+ ${formatNumber(stats.hardCap)}
+
+
{t("stats_hard_cap")}
+
+
+
+
+ {/* Stats Grid */}
+
+ {[
+ { label: t("stats_tokens_sold"), value: formatNumber(stats.totalTokensSold), unit: "XIC" },
+ { label: t("stats_token_price"), value: "$0.02", unit: "USDT" },
+ { label: t("stats_listing"), value: "$0.10", unit: t("stats_target") },
+ { label: t("hero_networks"), value: "3", unit: "BSC · ETH · TRC20" },
+ ].map(({ label, value, unit }) => (
+
+
{value}
+
{label}
+
{unit}
+
+ ))}
+
+
+ {/* Token Info */}
+
+
{t("token_details")}
+ {[
+ { label: t("token_name"), value: "New AssetChain Token" },
+ { label: t("token_symbol"), value: "XIC" },
+ { label: t("token_network"), value: "BSC (BEP-20)" },
+ { label: t("token_decimals"), value: "18" },
+ { label: t("token_supply"), value: "100,000,000,000" },
+ ].map(({ label, value }) => (
+
+ {label}
+ {value}
+
+ ))}
+
+ {t("token_view_contract")}
+
+
+
+ {/* Live Purchase Feed */}
+
+
+
+ {/* ── Right Panel: Purchase ── */}
+
+
+ {/* Token Icon + Title */}
+
+
+
+
{t("buy_title")}
+
{t("buy_subtitle")} $0.02 USDT · {t("buy_no_min")}
+
+
+
+ {/* Network Selector */}
+
+
{t("buy_select_network")}
+
+ {networks.map(net => (
+ setActiveNetwork(net)}
+ className={`network-tab rounded-xl py-3 px-2 flex flex-col items-center gap-1.5 ${activeNetwork === net ? "active" : ""}`}
+ >
+
+ {net === "BSC" ? "BSC" : net === "ETH" ? "Ethereum" : "TRON"}
+ {net === "TRON" ? "TRC20" : "ERC20"} USDT
+
+ ))}
+
+
+
+ {/* Purchase Area */}
+
+ {/* Presale Paused Overlay */}
+ {isPresalePaused && (
+
+
⏸
+
+ {lang === "zh" ? "预售已暂停" : "Presale Paused"}
+
+
+ {lang === "zh" ? "请关注官方 Telegram / Twitter 获取最新公告" : "Follow our official Telegram / Twitter for updates"}
+
+
+ )}
+ {activeNetwork === "BSC" &&
}
+ {activeNetwork === "ETH" &&
}
+ {activeNetwork === "TRON" && (
+
+
+
{t("buy_usdt_trc20")}
+
+ setTrcUsdtAmount(e.target.value)}
+ placeholder={t("buy_placeholder")}
+ className="input-nac w-full px-4 py-3 rounded-xl text-lg counter-digit pr-20"
+ />
+ USDT
+
+
+ {[100, 500, 1000, 5000].map(amt => (
+ setTrcUsdtAmount(amt.toString())}
+ className="flex-1 py-1 rounded-lg text-xs font-semibold transition-all"
+ style={{ background: "rgba(240,180,41,0.08)", border: "1px solid rgba(240,180,41,0.2)", color: "rgba(240,180,41,0.8)" }}
+ >
+ ${amt}
+
+ ))}
+
+
+
+
+ )}
+
+
+ {/* Presale Contract Links */}
+
+
{t("buy_contracts")}
+
+
+
+
+ {/* Why NAC */}
+
+ {[
+ { icon: "🔗", title: t("why_rwa_title"), desc: t("why_rwa_desc") },
+ { icon: "⚡", title: t("why_cbpp_title"), desc: t("why_cbpp_desc") },
+ { icon: "🛡️", title: t("why_charter_title"), desc: t("why_charter_desc") },
+ ].map(({ icon, title, desc }) => (
+
+
{icon}
+
{title}
+
{desc}
+
+ ))}
+
+
+
+
+
+ {/* ── FAQ Section ── */}
+
+
+
+ {t("faq_title")}
+
+
{t("faq_subtitle")}
+
+
+ {faq.map((item, i) => (
+
+ ))}
+
+
+
+
+ {/* ── Footer ── */}
+
+
+
+
New AssetChain
+
+ {t("footer_risk")}
+
+ {[
+ { label: t("footer_website"), href: "https://newassetchain.io" },
+ { label: t("footer_explorer"), href: "https://lens.newassetchain.io" },
+ { label: t("footer_telegram"), href: "https://t.me/newassetchain" },
+ { label: t("footer_twitter"), href: "https://twitter.com/newassetchain" },
+ ].map(({ label, href }) => (
+
+ {label}
+
+ ))}
+
+
+
+ {/* ── Chat Support Widget ── */}
+
+
+
+
+ );
+}
diff --git a/protocol/nac-constitution-service/src/main.rs b/protocol/nac-constitution-service/src/main.rs
index 72e61d2..4c507fd 100644
--- a/protocol/nac-constitution-service/src/main.rs
+++ b/protocol/nac-constitution-service/src/main.rs
@@ -1,20 +1,20 @@
//! NAC 宪法层服务 (Constitution Service)
//!
//! 提供宪法条款管理、合规验证、CR签发等核心功能。
-//! 通过 NRPC4.0 协议向 NVM 和 CBPP 提供服务。
+//! 通过 nac_lens 协议向 NVM 和 CBPP 提供服务。
use std::net::SocketAddr;
use std::sync::Arc;
use tokio::sync::RwLock;
use serde::{Deserialize, Serialize};
-// 模拟 NRPC4.0 服务器框架
-mod nrpc {
+// 模拟 nac_lens 服务器框架
+mod nac_lens {
pub struct Server;
impl Server {
pub fn new() -> Self { Self }
pub async fn serve(&self, _addr: std::net::SocketAddr) -> Result<(), String> {
- println!("NRPC4.0 Server listening...");
+ println!("nac_lens Server listening...");
// 模拟长时间运行
tokio::time::sleep(std::time::Duration::from_secs(86400)).await;
Ok(())
@@ -49,11 +49,11 @@ async fn main() -> Result<(), Box> {
println!("Loading constitutional clauses...");
// 实际应调用 nac_constitution_clauses::storage::load_all()
- // 启动 NRPC4.0 服务
+ // 启动 nac_lens 服务
let addr: SocketAddr = "0.0.0.0:22050".parse()?;
println!("Constitution Service binding to {}", addr);
- let server = nrpc::Server::new();
+ let server = nac_lens::Server::new();
server.serve(addr).await?;
Ok(())
diff --git a/protocol/nac-lens/ISSUE_019_COMPLETION.md b/protocol/nac-lens/ISSUE_019_COMPLETION.md
index 327da0f..3247209 100644
--- a/protocol/nac-lens/ISSUE_019_COMPLETION.md
+++ b/protocol/nac-lens/ISSUE_019_COMPLETION.md
@@ -7,7 +7,7 @@
- **任务**: NAC Lens协议完善
- **优先级**: P3-低
- **完成日期**: 2026-02-19
-- **完成人**: Manus AI
+- **完成人**: NAC_AI AI
## 📊 完成度统计
diff --git a/protocol/nac-nvm/src/constitution_interface.rs b/protocol/nac-nvm/src/constitution_interface.rs
index de32eeb..cda00a6 100644
--- a/protocol/nac-nvm/src/constitution_interface.rs
+++ b/protocol/nac-nvm/src/constitution_interface.rs
@@ -37,7 +37,7 @@ pub trait ConstitutionClient {
fn verify_dual_cr(&self, source_cr: &str, target_cr: &str) -> Result;
}
-/// 默认的宪法客户端实现(通过 NRPC4.0 调用宪法服务)
+/// 默认的宪法客户端实现(通过 nac_lens 调用宪法服务)
pub struct DefaultConstitutionClient {
endpoint: String,
}
@@ -50,7 +50,7 @@ impl DefaultConstitutionClient {
impl ConstitutionClient for DefaultConstitutionClient {
fn validate_call(&self, req: &ConstitutionValidationRequest) -> Result {
- // 实际实现将通过 NRPC4.0 调用 nac-constitution-service
+ // 实际实现将通过 nac_lens 调用 nac-constitution-service
// 这里提供骨架实现
Ok(ConstitutionValidationResult {
is_valid: true,
diff --git a/rwa/nac-lens-jurisdiction-router/src/lib.rs b/rwa/nac-lens-jurisdiction-router/src/lib.rs
index 3f0e17b..b1e74d9 100644
--- a/rwa/nac-lens-jurisdiction-router/src/lib.rs
+++ b/rwa/nac-lens-jurisdiction-router/src/lib.rs
@@ -1,7 +1,7 @@
// NAC_Lens 4.0 辖区路由层集成模块(Issue #77)
// 将 jurisdiction_router.rs 集成到 NAC_Lens 消息分发管道
// CBPP原则:约法即是治法 | 宪法即是规则 | 参与即是共识 | 节点产生区块交易决定区块大小
-// NAC_Lens 是 NAC 原生协议(原 NRPC 已统一更名为 NAC_Lens)
+// NAC_Lens 是 NAC 原生协议(原 NRPC 已统一更名为 nac_lens)
// 跨辖区交易:源辖区节点和目标辖区节点各自独立出具CR(参与即是共识,非多签)
use serde::{Deserialize, Serialize};
diff --git a/sdk/nac-cli/src/client/mod.rs b/sdk/nac-cli/src/client/mod.rs
index ccc6706..4d3f6eb 100644
--- a/sdk/nac-cli/src/client/mod.rs
+++ b/sdk/nac-cli/src/client/mod.rs
@@ -1,2 +1,2 @@
pub mod nac_lens;
-pub use self::nac_lens::NrpcClient;
+pub use self::nac_lens::NacLensClient;
diff --git a/sdk/nac-cli/src/client/nac_lens.rs b/sdk/nac-cli/src/client/nac_lens.rs
index 645a8a7..443ba3b 100644
--- a/sdk/nac-cli/src/client/nac_lens.rs
+++ b/sdk/nac-cli/src/client/nac_lens.rs
@@ -7,13 +7,13 @@ use std::time::Duration;
/// NAC NAC Lens客户端
///
/// 使用NAC原生RPC方法,不继承以太坊的eth_*方法
-pub struct NrpcClient {
+pub struct NacLensClient {
url: String,
client: Client,
timeout: Duration,
}
-impl NrpcClient {
+impl NacLensClient {
/// 创建新的NAC Lens客户端
pub fn new(url: String) -> Self {
Self {
@@ -410,13 +410,13 @@ mod tests {
#[test]
fn test_client_creation() {
- let client = NrpcClient::new("http://localhost:8545".to_string());
+ let client = NacLensClient::new("http://localhost:8545".to_string());
assert_eq!(client.url, "http://localhost:8545");
}
#[test]
fn test_client_with_timeout() {
- let client = NrpcClient::new("http://localhost:8545".to_string())
+ let client = NacLensClient::new("http://localhost:8545".to_string())
.with_timeout(Duration::from_secs(60));
assert_eq!(client.timeout, Duration::from_secs(60));
}
diff --git a/sdk/nac-cli/src/commands/account.rs b/sdk/nac-cli/src/commands/account.rs
index 441f9eb..c748aaf 100644
--- a/sdk/nac-cli/src/commands/account.rs
+++ b/sdk/nac-cli/src/commands/account.rs
@@ -1,5 +1,5 @@
use crate::cli::*;
-use crate::client::nac_lens::NrpcClient;
+use crate::client::nac_lens::NacLensClient;
use crate::config::Config;
use crate::error::{CliError, Result};
use crate::utils::*;
@@ -129,7 +129,7 @@ async fn show_account(address: &str, cli: &Cli) -> Result<()> {
// 从链上查询余额
if let Ok(config) = Config::load() {
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("正在查询链上信息...");
@@ -286,7 +286,7 @@ async fn get_balance(address: &str, _cli: &Cli) -> Result<()> {
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info(&format!("正在查询地址 {} 的余额...", address));
diff --git a/sdk/nac-cli/src/commands/block.rs b/sdk/nac-cli/src/commands/block.rs
index 553a88c..30f2938 100644
--- a/sdk/nac-cli/src/commands/block.rs
+++ b/sdk/nac-cli/src/commands/block.rs
@@ -1,5 +1,5 @@
use crate::cli::*;
-use crate::client::nac_lens::NrpcClient;
+use crate::client::nac_lens::NacLensClient;
use crate::config::Config;
use crate::error::{CliError, Result};
use crate::utils::*;
@@ -16,7 +16,7 @@ pub async fn execute(cmd: &BlockCommands, _cli: &Cli) -> Result<()> {
async fn show_block(block_id: &str) -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info(&format!("查询区块: {}...", block_id));
@@ -43,7 +43,7 @@ async fn show_block(block_id: &str) -> Result<()> {
async fn show_latest_block() -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("查询最新区块...");
let block = client.get_latest_block().await?;
@@ -61,7 +61,7 @@ async fn show_latest_block() -> Result<()> {
async fn list_blocks(start: u64, end: Option, limit: usize) -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
let current_height = client.get_block_height().await?;
let end_height = end.unwrap_or(current_height).min(start + limit as u64);
diff --git a/sdk/nac-cli/src/commands/constitution.rs b/sdk/nac-cli/src/commands/constitution.rs
index f56cd72..5f9f373 100644
--- a/sdk/nac-cli/src/commands/constitution.rs
+++ b/sdk/nac-cli/src/commands/constitution.rs
@@ -1,5 +1,5 @@
use crate::cli::*;
-use crate::client::nac_lens::NrpcClient;
+use crate::client::nac_lens::NacLensClient;
use crate::config::Config;
use crate::error::{CliError, Result};
use crate::utils::*;
@@ -18,7 +18,7 @@ pub async fn execute(cmd: &ConstitutionCommands, _cli: &Cli) -> Result<()> {
async fn list_clauses() -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("查询宪法条款...");
@@ -67,7 +67,7 @@ async fn list_clauses() -> Result<()> {
async fn show_clause(clause_id: &str) -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info(&format!("查询条款: {}...", clause_id));
let clause = client.get_clause(clause_id).await?;
@@ -85,7 +85,7 @@ async fn show_clause(clause_id: &str) -> Result<()> {
async fn verify_clause(clause_id: &str) -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info(&format!("验证条款: {}...", clause_id));
let clause = client.get_clause(clause_id).await?;
@@ -113,7 +113,7 @@ async fn verify_clause(clause_id: &str) -> Result<()> {
async fn show_params(clause_id: &str) -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info(&format!("查询条款参数: {}...", clause_id));
let clause = client.get_clause(clause_id).await?;
diff --git a/sdk/nac-cli/src/commands/contract.rs b/sdk/nac-cli/src/commands/contract.rs
index b575aa2..31f67b6 100644
--- a/sdk/nac-cli/src/commands/contract.rs
+++ b/sdk/nac-cli/src/commands/contract.rs
@@ -1,5 +1,5 @@
use crate::cli::*;
-use crate::client::nac_lens::NrpcClient;
+use crate::client::nac_lens::NacLensClient;
use crate::config::Config;
use crate::error::{CliError, Result};
use crate::utils::*;
@@ -74,7 +74,7 @@ async fn deploy_contract(
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
// 解析参数
let args_json: Vec = if let Some(args_str) = init_args {
@@ -139,7 +139,7 @@ async fn call_contract(
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
// 解析参数
let args_json: Vec = if let Some(args_str) = args {
@@ -178,7 +178,7 @@ async fn query_contract(
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
// 解析参数
let args_json: Vec = if let Some(args_str) = args {
@@ -213,7 +213,7 @@ async fn show_contract_code(address: &str) -> Result<()> {
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info(&format!("查询合约: {}...", address));
diff --git a/sdk/nac-cli/src/commands/node.rs b/sdk/nac-cli/src/commands/node.rs
index 0e30edf..f9bf0d6 100644
--- a/sdk/nac-cli/src/commands/node.rs
+++ b/sdk/nac-cli/src/commands/node.rs
@@ -1,5 +1,5 @@
use crate::cli::*;
-use crate::client::nac_lens::NrpcClient;
+use crate::client::nac_lens::NacLensClient;
use crate::config::Config;
use crate::error::{CliError, Result};
use crate::utils::*;
@@ -17,7 +17,7 @@ pub async fn execute(cmd: &NodeCommands, _cli: &Cli) -> Result<()> {
async fn show_node_info() -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("查询节点信息...");
let info = client.get_node_info().await?;
@@ -35,7 +35,7 @@ async fn show_node_info() -> Result<()> {
async fn show_node_status() -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("查询节点状态...");
let health = client.get_node_health().await?;
@@ -53,7 +53,7 @@ async fn show_node_status() -> Result<()> {
async fn list_peers() -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("查询对等节点...");
let peers = client.get_peers().await?;
@@ -74,7 +74,7 @@ async fn list_peers() -> Result<()> {
async fn show_sync_status() -> Result<()> {
let config = Config::load()
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("查询同步状态...");
diff --git a/sdk/nac-cli/src/commands/transaction.rs b/sdk/nac-cli/src/commands/transaction.rs
index 9a80c39..ac1b7dd 100644
--- a/sdk/nac-cli/src/commands/transaction.rs
+++ b/sdk/nac-cli/src/commands/transaction.rs
@@ -1,5 +1,5 @@
use crate::cli::*;
-use crate::client::nac_lens::NrpcClient;
+use crate::client::nac_lens::NacLensClient;
use crate::config::Config;
use crate::error::{CliError, Result};
use crate::utils::*;
@@ -80,7 +80,7 @@ async fn send_transaction(
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
// 获取nonce
print_info("获取账户nonce...");
@@ -129,7 +129,7 @@ async fn show_transaction(tx_hash: &str) -> Result<()> {
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info(&format!("正在查询交易 {}...", tx_hash));
@@ -229,7 +229,7 @@ async fn broadcast_transaction(signed_tx: &str) -> Result<()> {
.map_err(|_| CliError::Config("未找到配置文件,请先运行 'nac config init'".to_string()))?;
// 创建RPC客户端
- let client = NrpcClient::new(config.get_current_rpc_url());
+ let client = NacLensClient::new(config.get_current_rpc_url());
print_info("广播交易到网络...");
let tx_hash = client.send_transaction(signed_tx).await?;
diff --git a/xic-ico/DEPLOYMENT_LOG_20260309.md b/xic-ico/DEPLOYMENT_LOG_20260309.md
index a3f6b0e..348c684 100644
--- a/xic-ico/DEPLOYMENT_LOG_20260309.md
+++ b/xic-ico/DEPLOYMENT_LOG_20260309.md
@@ -41,7 +41,7 @@
| 购买记录查询 | ✅ 正常 |
| 教程页面 | ✅ 正常 |
| FAQ页面 | ✅ 正常 |
-| MANUS内联检查 | ✅ 无MANUS内联 |
+| NAC_AI内联检查 | ✅ 无NAC_AI内联 |
## 服务状态
diff --git a/xic-ico/docs/WORKORDER-2026-03-06-XIC-ICO-DEPLOY.md b/xic-ico/docs/WORKORDER-2026-03-06-XIC-ICO-DEPLOY.md
index fb3b5e4..7576c9d 100644
--- a/xic-ico/docs/WORKORDER-2026-03-06-XIC-ICO-DEPLOY.md
+++ b/xic-ico/docs/WORKORDER-2026-03-06-XIC-ICO-DEPLOY.md
@@ -3,7 +3,7 @@
**工单编号**: WO-2026-03-06-004
**工单类型**: 新站部署 + 域名配置
**执行日期**: 2026-03-06
-**执行人**: Manus AI
+**执行人**: NAC_AI AI
**状态**: ✅ 100% 完成(待 DNS 配置)
---
@@ -31,8 +31,8 @@
| `ico.newassetchain.io` | **主站**:ETH/BNB/USDT/USDC 购买 | ✅ 已部署 |
| `trc-ico.newassetchain.io` | **TRON 版**:TRC20 购买("Buy With TRON" 按钮跳转) | ⏳ 占位页面,等待 TRON 版代码包 |
-### MANUS 内联检查
-- ✅ 无 manus.im / manus.space / manus.computer 引用
+### NAC_AI 内联检查
+- ✅ 无 NAC_AI.im / NAC_AI.space / NAC_AI.computer 引用
- ⚠️ 原始代码含外部 CDN(cdn.tailwindcss.com / kit.fontawesome.com)→ 已本地化处理
---
diff --git a/开发状态追踪_每日更新.md b/开发状态追踪_每日更新.md
index c318615..a0a187a 100644
--- a/开发状态追踪_每日更新.md
+++ b/开发状态追踪_每日更新.md
@@ -168,9 +168,9 @@
- 服务启动
- 健康检查
-- ⏳ **去除Manus关联**
+- ⏳ **去除NAC_AI关联**
- 检查所有代码
- - 移除Manus依赖
+ - 移除NAC_AI依赖
- 确保中国用户可访问
### 4. 性能优化和测试
diff --git a/开发进度报告_20260218.md b/开发进度报告_20260218.md
index f129bb0..2e031a7 100644
--- a/开发进度报告_20260218.md
+++ b/开发进度报告_20260218.md
@@ -385,5 +385,5 @@ commit [earlier] - feat(charter-compiler): 完成Charter编译器
---
**报告生成时间**:2026-02-18 (GMT+4)
-**报告生成者**:Manus AI开发助手
+**报告生成者**:NAC_AI AI开发助手
**项目状态**:🟢 进展顺利