1152 lines
56 KiB
JavaScript
1152 lines
56 KiB
JavaScript
'use strict';
|
||
/**
|
||
* NAC AI 资产估值问答界面 - 服务端 v2.0
|
||
* 新增:
|
||
* - 20大类资产 × 60+辖区 知识库集成
|
||
* - 辖区感知估值(每个辖区独立参数模型)
|
||
* - 三重价值输出(当地货币 + USD + XTZH)
|
||
* - 智能资产类型和辖区识别
|
||
* - /api/v4/asset-categories 资产分类接口
|
||
* - /api/v4/jurisdictions 辖区列表接口
|
||
*/
|
||
|
||
const express = require('express');
|
||
const http = require('http');
|
||
const path = require('path');
|
||
|
||
// 知识库适配层
|
||
const { ASSET_VALUATION_KB, ASSET_KEYWORDS: ASSET_KB_KEYWORDS } = require('./knowledge/asset_valuation_kb');
|
||
const { JURISDICTION_KB } = require('./knowledge/jurisdiction_kb');
|
||
|
||
// 适配:将 ASSET_VALUATION_KB 映射为 ASSET_CATEGORIES(server.js 内部使用格式)
|
||
const ASSET_CATEGORIES = {};
|
||
Object.entries(ASSET_VALUATION_KB).forEach(([key, cat]) => {
|
||
const lowerKey = key.toLowerCase();
|
||
ASSET_CATEGORIES[lowerKey] = {
|
||
code: cat.gnacs || lowerKey,
|
||
name: cat.name,
|
||
nameEn: cat.nameEn || '',
|
||
icon: cat.icon || '📦',
|
||
subcategories: {}
|
||
};
|
||
if (cat.subcategories) {
|
||
Object.entries(cat.subcategories).forEach(([sk, sub]) => {
|
||
ASSET_CATEGORIES[lowerKey].subcategories[sk.toLowerCase()] = {
|
||
name: sub.name || sk,
|
||
types: sub.types || [],
|
||
methods: sub.valuationMethods ? [sub.valuationMethods.primary, ...(sub.valuationMethods.secondary || [])] : [],
|
||
keyParams: sub.keyParameters || sub.keyParams || []
|
||
};
|
||
});
|
||
}
|
||
});
|
||
|
||
// 辖区国旗映射
|
||
const JURISDICTION_FLAGS = {
|
||
HK:'🇭🇰', SG:'🇸🇬', US:'🇺🇸', GB:'🇬🇧', DE:'🇩🇪', FR:'🇫🇷', JP:'🇯🇵', KR:'🇰🇷',
|
||
AU:'🇦🇺', AE:'🇦🇪', CN:'🇨🇳', TW:'🇹🇼', MY:'🇲🇾', IN:'🇮🇳', CH:'🇨🇭', CA:'🇨🇦',
|
||
SA:'🇸🇦', BR:'🇧🇷', ZA:'🇿🇦', IL:'🇮🇱', NL:'🇳🇱', EU:'🇪🇺', NZ:'🇳🇿', QA:'🇶🇦',
|
||
KW:'🇰🇼', BH:'🇧🇭', RU:'🇷🇺', AR:'🇦🇷', CL:'🇨🇱', NG:'🇳🇬', EG:'🇪🇬', KE:'🇰🇪',
|
||
MX:'🇲🇽', IT:'🇮🇹', ES:'🇪🇸', TR:'🇹🇷', MO:'🇲🇴', TH:'🇹🇭', ID:'🇮🇩', PH:'🇵🇭',
|
||
VN:'🇻🇳', PT:'🇵🇹', SE:'🇸🇪', NO:'🇳🇴', DK:'🇩🇰', FI:'🇫🇮', PL:'🇵🇱', CZ:'🇨🇿',
|
||
HU:'🇭🇺', RO:'🇷🇴', GR:'🇬🇷', AT:'🇦🇹', BE:'🇧🇪', LU:'🇱🇺', IE:'🇮🇪', SZ:'🇸🇿'
|
||
};
|
||
|
||
// 适配:将 JURISDICTION_KB 映射为 JURISDICTION_MODELS
|
||
const JURISDICTION_MODELS = {};
|
||
Object.entries(JURISDICTION_KB).forEach(([code, j]) => {
|
||
JURISDICTION_MODELS[code] = {
|
||
...j,
|
||
flag: JURISDICTION_FLAGS[code] || '🌍',
|
||
regulator: Array.isArray(j.regulators) ? j.regulators.join('/') : (j.regulator || 'N/A'),
|
||
realEstate: j.realEstate ? {
|
||
residential: {
|
||
primaryMethod: j.realEstate.valuationMethods ? j.realEstate.valuationMethods[0] : '市场比较法',
|
||
capRate: j.realEstate.residentialCapRate ? {
|
||
range: `${j.realEstate.residentialCapRate.min}-${j.realEstate.residentialCapRate.max}%`,
|
||
note: `均值 ${j.realEstate.residentialCapRate.avg}%`
|
||
} : null,
|
||
foreignOwnership: j.realEstate.foreignOwnership || '无特殊限制',
|
||
taxConsiderations: j.realEstate.stampDuty ? JSON.stringify(j.realEstate.stampDuty).replace(/[{}"]|\\n/g, ' ') : null,
|
||
specialRules: j.realEstate.keyFactors || []
|
||
},
|
||
commercial: {
|
||
capRate: j.realEstate.commercialCapRate ? {
|
||
range: `${j.realEstate.commercialCapRate.min}-${j.realEstate.commercialCapRate.max}%`,
|
||
note: `均值 ${j.realEstate.commercialCapRate.avg}%`
|
||
} : null
|
||
}
|
||
} : null
|
||
};
|
||
});
|
||
|
||
// GNACS 编码映射
|
||
const GNACS_CODES = {
|
||
'GNACS-01': { key: 'real_estate', name: '不动产类' },
|
||
'GNACS-02': { key: 'financial_securities', name: '金融证券类' },
|
||
'GNACS-03': { key: 'commodities', name: '大宗商品类' },
|
||
'GNACS-04': { key: 'art_collectibles', name: '艺术品与收藏品类' },
|
||
'GNACS-05': { key: 'intellectual_property', name: '知识产权类' },
|
||
'GNACS-06': { key: 'digital_assets', name: '数字资产类' },
|
||
'GNACS-07': { key: 'infrastructure', name: '基础设施类' },
|
||
'GNACS-08': { key: 'natural_resources', name: '自然资源类' },
|
||
'GNACS-09': { key: 'environmental_rights', name: '环境权益类' },
|
||
'GNACS-10': { key: 'corporate_equity', name: '企业权益类' },
|
||
'GNACS-11': { key: 'debt_assets', name: '债权类' },
|
||
'GNACS-12': { key: 'insurance_products', name: '保险产品类' },
|
||
'GNACS-13': { key: 'agricultural_assets', name: '农业资产类' },
|
||
'GNACS-14': { key: 'vehicles', name: '交通工具类' },
|
||
'GNACS-15': { key: 'machinery_equipment', name: '机械设备类' },
|
||
'GNACS-16': { key: 'data_assets', name: '数据资产类' },
|
||
'GNACS-17': { key: 'brand_assets', name: '品牌资产类' },
|
||
'GNACS-18': { key: 'sports_assets', name: '体育资产类' },
|
||
'GNACS-19': { key: 'entertainment_assets', name: '娱乐资产类' },
|
||
'GNACS-20': { key: 'other_assets', name: '其他资产类' }
|
||
};
|
||
|
||
// 关键词映射 - 重建为嵌套格式供 detectAssetType 使用
|
||
const ASSET_KEYWORDS = {
|
||
real_estate: {
|
||
residential: ['住宅','公寓','别墅','房子','房产','套房','单元房','联排','独栋','学区房','老年公寓','度假屋'],
|
||
commercial: ['写字楼','商铺','商业地产','零售','购物中心','酒店','商业综合体','办公楼','甲级','乙级'],
|
||
industrial: ['厂房','仓储','工业','物流','冷链','数据中心','工业园','仓库'],
|
||
agricultural: ['农地','耕地','农田','果园','林地','渔场','牧场','温室','农业用地'],
|
||
infrastructure: ['基础设施','港口','机场','高速','管道','电网','水务','轨道交通']
|
||
},
|
||
intellectual_property: {
|
||
copyright: ['版权','著作权','音乐版权','影视版权','文学版权','软件著作权','版税','授权收入'],
|
||
patent: ['专利','发明专利','实用新型','外观设计','许可费','技术转让','专利授权'],
|
||
trademark: ['商标','品牌授权','商标权','注册商标','品牌价值'],
|
||
portrait_rights: ['肖像权','形象权','姓名权','艺人','网红','运动员','明星IP','人物IP'],
|
||
trade_secret: ['商业秘密','技术秘密','配方','工艺'],
|
||
domain: ['域名','网络资产','互联网资产']
|
||
},
|
||
art_collectibles: {
|
||
fine_art: ['艺术品','油画','水墨','雕塑','版画','当代艺术','毕加索','梵高','齐白石','张大千'],
|
||
antiques: ['古董','文物','古玩','瓷器','青铜器','字画','古籍'],
|
||
luxury: ['名表','劳力士','百达翡丽','爱彼','珠宝','钻石','宝石','翡翠'],
|
||
wine: ['红酒','葡萄酒','威士忌','白兰地','茅台','收藏酒'],
|
||
collectibles: ['邮票','钱币','球星卡','限量版','收藏品']
|
||
},
|
||
financial_securities: {
|
||
stocks: ['股票','股权','上市公司','A股','港股','美股','纳斯达克','纽交所'],
|
||
bonds: ['债券','国债','企业债','可转债','债权'],
|
||
funds: ['基金','私募','公募','REITs','房地产信托','对冲基金'],
|
||
derivatives: ['期权','期货','衍生品','结构化产品']
|
||
},
|
||
corporate_equity: {
|
||
unlisted: ['非上市','未上市股权','私人公司','创业公司','初创','股份','股东','PE','VC','天使'],
|
||
listed: ['上市公司','控股','大股东','战略股东'],
|
||
startup: ['初创企业','独角兽','估值','融资轮次','A轮','B轮','C轮']
|
||
},
|
||
commodities: {
|
||
precious_metals: ['黄金','白银','铂金','钯金','贵金属','金条','金币'],
|
||
energy: ['石油','天然气','煤炭','能源','原油','LNG'],
|
||
agricultural_commodities: ['大豆','小麦','玉米','棉花','糖','咖啡','农产品期货'],
|
||
metals: ['铜','铝','铁矿石','锂','稀土','工业金属']
|
||
},
|
||
digital_assets: {
|
||
cryptocurrency: ['比特币','以太坊','加密货币','虚拟货币','数字货币','BTC','ETH'],
|
||
nft: ['NFT','非同质化代币','数字艺术','数字收藏品'],
|
||
metaverse: ['元宇宙','虚拟土地','虚拟资产','游戏资产','Sandbox','Decentraland']
|
||
},
|
||
environmental_rights: {
|
||
carbon: ['碳排放权','碳信用','碳汇','VCS','Gold Standard','CDM','碳中和','CCER'],
|
||
renewable: ['可再生能源','绿证','REC','绿色电力','光伏','风电'],
|
||
water: ['水权','排污权','环境权益']
|
||
},
|
||
data_assets: {
|
||
data: ['数据资产','数据集','用户数据','大数据','AI数据','训练数据','数据库'],
|
||
algorithm: ['算法','AI模型','机器学习模型','深度学习']
|
||
},
|
||
brand_assets: {
|
||
brand: ['品牌','品牌价值','商誉','特许经营','加盟权','品牌授权','连锁品牌'],
|
||
franchise: ['特许经营权','加盟','特许牌照','经营许可']
|
||
},
|
||
sports_assets: {
|
||
club: ['体育俱乐部','足球俱乐部','篮球队','球队','球员转会'],
|
||
rights: ['赛事版权','转播权','体育IP','运动员合同']
|
||
},
|
||
entertainment_assets: {
|
||
film_tv: ['影视版权','电影版权','电视剧版权','流媒体权益','院线'],
|
||
music_rights: ['音乐版权','唱片','流媒体版权','演唱会版权'],
|
||
gaming: ['游戏IP','游戏版权','游戏资产']
|
||
},
|
||
natural_resources: {
|
||
mining: ['矿权','采矿权','矿产','矿山','金矿','铜矿','煤矿'],
|
||
forest: ['林权','森林碳汇','木材','林地资源'],
|
||
water_resources: ['水资源','水域使用权','渔业权']
|
||
},
|
||
infrastructure: {
|
||
transport: ['港口','机场','高速公路','铁路','轨道交通','桥梁隧道'],
|
||
utilities: ['电网','水务','燃气管道','通信基础设施'],
|
||
energy_infra: ['发电站','变电站','储能设施','充电桩']
|
||
},
|
||
debt_assets: {
|
||
receivables: ['应收账款','票据','债权','贷款','抵押贷款','消费贷'],
|
||
bonds_debt: ['债券','高收益债','不良资产','NPL']
|
||
},
|
||
insurance_products: {
|
||
life: ['人寿保险','寿险保单','年金','保险价值'],
|
||
property: ['财产保险','再保险','保险权益']
|
||
},
|
||
agricultural_assets: {
|
||
crops: ['农作物','粮食','蔬菜','水果','农业收益'],
|
||
livestock: ['牲畜','畜牧','家禽','水产','养殖'],
|
||
equipment: ['农业机械','农业设备','拖拉机','收割机']
|
||
},
|
||
vehicles: {
|
||
luxury_cars: ['豪车','超跑','法拉利','兰博基尼','保时捷','劳斯莱斯','宾利','迈巴赫'],
|
||
yacht: ['游艇','私人游艇','帆船','豪华游轮'],
|
||
aircraft: ['私人飞机','公务机','直升机','飞机'],
|
||
classic_cars: ['经典车','老爷车','复古车','收藏车']
|
||
},
|
||
machinery_equipment: {
|
||
industrial: ['工业设备','生产线','机床','数控机床','机械设备'],
|
||
medical: ['医疗设备','CT机','核磁共振','手术机器人'],
|
||
construction: ['工程机械','挖掘机','起重机','建筑设备']
|
||
}
|
||
};
|
||
|
||
const app = express();
|
||
const PORT = process.env.PORT || 3005;
|
||
|
||
app.use(express.json({ limit: '2mb' }));
|
||
app.use(express.static(path.join(__dirname, 'public')));
|
||
|
||
app.use((req, res, next) => {
|
||
res.setHeader('Access-Control-Allow-Origin', '*');
|
||
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS');
|
||
res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization');
|
||
if (req.method === 'OPTIONS') return res.sendStatus(204);
|
||
next();
|
||
});
|
||
|
||
const VALUATION_ENGINE = { host: '127.0.0.1', port: 3003, timeout: 30000 };
|
||
const INFERENCE_ENGINE = { host: '127.0.0.1', port: 3001, timeout: 60000 };
|
||
|
||
let xtzhPriceCache = null;
|
||
let xtzhPriceCacheTime = 0;
|
||
const XTZH_CACHE_TTL = 5 * 60 * 1000;
|
||
|
||
// ============================================================
|
||
// 工具函数
|
||
// ============================================================
|
||
function proxyRequest(method, target, reqPath, body, timeout) {
|
||
return new Promise((resolve, reject) => {
|
||
const bodyStr = body ? JSON.stringify(body) : null;
|
||
const options = {
|
||
hostname: target.host, port: target.port, path: reqPath, method,
|
||
headers: { 'Content-Type': 'application/json', ...(bodyStr ? { 'Content-Length': Buffer.byteLength(bodyStr) } : {}) },
|
||
timeout: timeout || 10000
|
||
};
|
||
const req = http.request(options, (res) => {
|
||
let data = '';
|
||
res.on('data', chunk => data += chunk);
|
||
res.on('end', () => { try { resolve(JSON.parse(data)); } catch(e) { reject(new Error('Invalid JSON')); } });
|
||
});
|
||
req.on('error', reject);
|
||
req.on('timeout', () => { req.destroy(); reject(new Error('Timeout')); });
|
||
if (bodyStr) req.write(bodyStr);
|
||
req.end();
|
||
});
|
||
}
|
||
|
||
async function getXTZHPrice() {
|
||
if (xtzhPriceCache && Date.now() - xtzhPriceCacheTime < XTZH_CACHE_TTL) return xtzhPriceCache;
|
||
try {
|
||
const data = await proxyRequest('GET', VALUATION_ENGINE, '/api/v4/xtzh-price', null, 5000);
|
||
xtzhPriceCache = data;
|
||
xtzhPriceCacheTime = Date.now();
|
||
return data;
|
||
} catch(_) {
|
||
return { usd: 4.3944, source: 'fallback', goldCoverage: 1.25, sdrBasket: { USD: 0.5813, EUR: 0.1886, CNY: 0.1042, JPY: 0.0895, GBP: 0.0864 } };
|
||
}
|
||
}
|
||
|
||
// ============================================================
|
||
// 智能识别:资产类型 + 辖区
|
||
// ============================================================
|
||
function detectAssetType(text) {
|
||
const lower = text.toLowerCase();
|
||
for (const [category, subcats] of Object.entries(ASSET_KEYWORDS)) {
|
||
for (const [subcat, keywords] of Object.entries(subcats)) {
|
||
for (const kw of keywords) {
|
||
if (lower.includes(kw.toLowerCase())) return { category, subcat };
|
||
}
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function detectJurisdiction(text) {
|
||
const lower = text.toLowerCase();
|
||
const map = {
|
||
HK: ['香港','hong kong','hk','港岛','九龙','新界','差饷'],
|
||
SG: ['新加坡','singapore','sg','ccr','rcr','ocr','hdb','absd','ura'],
|
||
US: ['美国','united states','usa','纽约','洛杉矶','旧金山','加州','德州','new york','california','firpta'],
|
||
GB: ['英国','uk','united kingdom','伦敦','london','leasehold','sdlt','rics'],
|
||
DE: ['德国','germany','柏林','慕尼黑','法兰克福','berlin','munich','bafin'],
|
||
FR: ['法国','france','巴黎','paris','amf'],
|
||
JP: ['日本','japan','东京','大阪','tokyo','osaka','fsa'],
|
||
KR: ['韩国','korea','首尔','seoul','江南','전세'],
|
||
AU: ['澳大利亚','australia','悉尼','墨尔本','sydney','melbourne','firb','asic'],
|
||
AE: ['阿联酋','uae','迪拜','阿布扎比','dubai','abu dhabi','freehold','dld'],
|
||
CN: ['中国大陆','中国','china mainland','北京','上海','深圳','广州','成都','杭州','csrc'],
|
||
TW: ['台湾','taiwan','台北','taipei','fsc台湾'],
|
||
MY: ['马来西亚','malaysia','吉隆坡','kuala lumpur','sc马来'],
|
||
IN: ['印度','india','孟买','德里','mumbai','delhi','sebi'],
|
||
CH: ['瑞士','switzerland','苏黎世','日内瓦','zurich','geneva','finma'],
|
||
CA: ['加拿大','canada','多伦多','温哥华','toronto','vancouver','csa'],
|
||
SA: ['沙特','saudi','利雅得','riyadh','cma沙特'],
|
||
BR: ['巴西','brazil','圣保罗','sao paulo','cvm'],
|
||
ZA: ['南非','south africa','开普敦','约翰内斯堡','cape town','fsca'],
|
||
IL: ['以色列','israel','特拉维夫','tel aviv','isa以色列'],
|
||
NL: ['荷兰','netherlands','阿姆斯特丹','amsterdam','afm'],
|
||
EU: ['欧盟','european union','欧洲','esma','mifid'],
|
||
NZ: ['新西兰','new zealand','奥克兰','auckland','fma'],
|
||
QA: ['卡塔尔','qatar','多哈','doha','qfma'],
|
||
KW: ['科威特','kuwait','科威特城','cma科威特'],
|
||
BH: ['巴林','bahrain','麦纳麦','manama','cbb'],
|
||
RU: ['俄罗斯','russia','莫斯科','moscow','cbr'],
|
||
AR: ['阿根廷','argentina','布宜诺斯艾利斯','buenos aires'],
|
||
CL: ['智利','chile','圣地亚哥','santiago'],
|
||
NG: ['尼日利亚','nigeria','拉各斯','lagos'],
|
||
EG: ['埃及','egypt','开罗','cairo'],
|
||
KE: ['肯尼亚','kenya','内罗毕','nairobi'],
|
||
MX: ['墨西哥','mexico','墨西哥城'],
|
||
IT: ['意大利','italy','罗马','米兰','rome','milan'],
|
||
ES: ['西班牙','spain','马德里','巴塞罗那','madrid','barcelona'],
|
||
TR: ['土耳其','turkey','伊斯坦布尔','istanbul'],
|
||
MO: ['澳门','macau','macao'],
|
||
TH: ['泰国','thailand','曼谷','bangkok'],
|
||
ID: ['印度尼西亚','indonesia','雅加达','jakarta'],
|
||
PH: ['菲律宾','philippines','马尼拉','manila'],
|
||
VN: ['越南','vietnam','河内','胡志明','hanoi'],
|
||
};
|
||
for (const [code, keywords] of Object.entries(map)) {
|
||
for (const kw of keywords) {
|
||
if (lower.includes(kw)) return code;
|
||
}
|
||
}
|
||
return null;
|
||
}
|
||
|
||
function isValuationRequest(text) {
|
||
const vkw = ['估值','值多少','价格','价值','多少钱','市价','市值','评估','上链','通证化','valuation','worth','price','value','how much'];
|
||
const qkw = ['解释','什么是','如何','为什么','原理','机制','介绍','说明','区别','比较','explain','what is','how does','why','mechanism','difference'];
|
||
const lower = text.toLowerCase();
|
||
const hasV = vkw.some(k => lower.includes(k));
|
||
const hasQ = qkw.some(k => lower.includes(k));
|
||
if (hasQ && !hasV) return false;
|
||
return hasV;
|
||
}
|
||
|
||
// ============================================================
|
||
// 知识库回答生成
|
||
// ============================================================
|
||
async function generateKnowledgeAnswer(userMessage, assetType, jurisdiction) {
|
||
const lower = userMessage.toLowerCase();
|
||
const priceData = await getXTZHPrice();
|
||
const xtzhPrice = priceData.usd || 4.3944;
|
||
|
||
// XTZH 定价机制
|
||
if ((lower.includes('xtzh') || lower.includes('稳定币')) && (lower.includes('定价') || lower.includes('价格') || lower.includes('机制') || lower.includes('sdr') || lower.includes('稳定') || lower.includes('黄金'))) {
|
||
return buildXTZHPricingAnswer(xtzhPrice, priceData);
|
||
}
|
||
|
||
// GNACS 编码
|
||
if (lower.includes('gnacs') || (lower.includes('资产分类') && lower.includes('nac'))) {
|
||
return buildGNACSAnswer();
|
||
}
|
||
|
||
// 估值方法论
|
||
if (lower.includes('估值方法') || lower.includes('收益资本化') || lower.includes('市场比较法') || lower.includes('成本法') || lower.includes('dcf') || lower.includes('折现') || lower.includes('许可费节省')) {
|
||
return buildValuationMethodsAnswer(assetType);
|
||
}
|
||
|
||
// 上链流程
|
||
if (lower.includes('上链') || lower.includes('通证化') || lower.includes('tokenize') || lower.includes('acc-20') || lower.includes('charter')) {
|
||
return buildTokenizationAnswer(jurisdiction);
|
||
}
|
||
|
||
// NAC 公链介绍
|
||
if ((lower.includes('nac') || lower.includes('newassetchain')) && (lower.includes('介绍') || lower.includes('什么是') || lower.includes('公链') || lower.includes('rwa'))) {
|
||
return buildNACIntroAnswer();
|
||
}
|
||
|
||
// 辖区对比
|
||
if (lower.includes('对比') || lower.includes('比较辖区') || lower.includes('哪个辖区')) {
|
||
return buildJurisdictionCompareAnswer(xtzhPrice);
|
||
}
|
||
|
||
// 辖区感知资产估值
|
||
if (assetType) {
|
||
return buildAssetValuationAnswer(assetType, jurisdiction, xtzhPrice, userMessage);
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
// ============================================================
|
||
// XTZH 定价机制
|
||
// ============================================================
|
||
function buildXTZHPricingAnswer(xtzhPrice, priceData) {
|
||
const basket = priceData.sdrBasket || { USD: 0.5813, EUR: 0.1886, CNY: 0.1042, JPY: 0.0895, GBP: 0.0864 };
|
||
return `## XTZH 价值稳定机制详解
|
||
|
||
**XTZH(新资产链稳定币)** 是 NewAssetChain 公链的原生稳定币,采用 **SDR 锚定 + 黄金储备双重保障**机制。
|
||
|
||
### 一、SDR 五货币篮子
|
||
|
||
| 货币 | 权重 | 说明 |
|
||
|------|------|------|
|
||
| 美元 (USD) | ${(basket.USD * 100).toFixed(2)}% | 全球储备主导货币 |
|
||
| 欧元 (EUR) | ${(basket.EUR * 100).toFixed(2)}% | 欧元区货币 |
|
||
| 人民币 (CNY) | ${(basket.CNY * 100).toFixed(2)}% | 新兴市场代表 |
|
||
| 日元 (JPY) | ${(basket.JPY * 100).toFixed(2)}% | 亚太区货币 |
|
||
| 英镑 (GBP) | ${(basket.GBP * 100).toFixed(2)}% | 英联邦货币 |
|
||
|
||
### 二、黄金储备保障
|
||
|
||
- **储备覆盖率:** ${priceData.goldCoverage ? (priceData.goldCoverage * 100).toFixed(0) : 125}%(超额储备)
|
||
- **储备构成:** 实物黄金 + 黄金 ETF
|
||
- **质押规则:** 资产上链需质押 **80%** 等值 XTZH
|
||
- **再平衡触发:** 当 XTZH 偏离 SDR 基准 ±2% 时自动触发
|
||
|
||
### 三、当前价格
|
||
|
||
**XTZH/USD = $${xtzhPrice.toFixed(4)}**
|
||
|
||
### 四、双链双币架构
|
||
|
||
| 代币 | 类型 | 用途 |
|
||
|------|------|------|
|
||
| **XTZH** | 稳定币 | 资产估值、交易结算、质押担保 |
|
||
| **XIC** | 治理币 | 网络治理、节点激励、协议升级 |
|
||
|
||
> XTZH 不是投机性加密货币,而是 RWA 资产通证化的**价值锚点**,其稳定性由 SDR 篮子和实物黄金储备共同保障。`;
|
||
}
|
||
|
||
// ============================================================
|
||
// GNACS 说明
|
||
// ============================================================
|
||
function buildGNACSAnswer() {
|
||
let rows = '';
|
||
Object.entries(GNACS_CODES).forEach(([code, info]) => {
|
||
const cat = ASSET_CATEGORIES[info.key];
|
||
const icon = cat ? cat.icon : '';
|
||
const subcatCount = cat ? Object.keys(cat.subcategories).length : 0;
|
||
rows += `| ${code} | ${icon} ${info.name} | ${subcatCount} 个子类 |\n`;
|
||
});
|
||
return `## GNACS 全球新资产分类标准
|
||
|
||
**GNACS(Global New Asset Classification Standard)** 是 NAC 公链的原生资产分类体系,覆盖 **20 大类、60+ 子类**资产。
|
||
|
||
| 编码 | 资产类别 | 子类数量 |
|
||
|------|---------|---------|
|
||
${rows}
|
||
### 核心价值
|
||
|
||
每个 GNACS 编码对应:
|
||
- **独立估值模型** — 针对该类资产的专业估值方法
|
||
- **辖区合规规则** — 60+ 辖区的特定法规要求
|
||
- **ACC-20 协议参数** — 通证化标准参数
|
||
- **Charter 合约模板** — 预置智能合约模板
|
||
|
||
> 资产上链时,系统根据 GNACS 编码自动匹配估值模型和合规规则,无需手动配置。`;
|
||
}
|
||
|
||
// ============================================================
|
||
// 估值方法论
|
||
// ============================================================
|
||
function buildValuationMethodsAnswer(assetType) {
|
||
const cat = assetType ? ASSET_CATEGORIES[assetType.category] : null;
|
||
let specificMethods = '';
|
||
if (cat && assetType.subcat && cat.subcategories[assetType.subcat]) {
|
||
const sub = cat.subcategories[assetType.subcat];
|
||
specificMethods = `\n### 针对「${sub.name}」的推荐方法\n\n`;
|
||
sub.methods.forEach(m => { specificMethods += `- **${m}**\n`; });
|
||
specificMethods += `\n**关键参数:** ${sub.keyParams.join('、')}\n`;
|
||
}
|
||
|
||
let methodsText = '';
|
||
Object.entries(VALUATION_METHODS).forEach(([key, method]) => {
|
||
methodsText += `### ${method.name}\n\n`;
|
||
methodsText += `${method.description}\n\n`;
|
||
if (method.formula) methodsText += `**公式:** \`${method.formula}\`\n\n`;
|
||
methodsText += `**适用资产:** ${method.applicableAssets.join('、')}\n\n`;
|
||
methodsText += `**XTZH 换算:** ${method.xtzh_conversion}\n\n---\n\n`;
|
||
});
|
||
|
||
return `## NAC 支持的资产估值方法论
|
||
${specificMethods}
|
||
${methodsText}`;
|
||
}
|
||
|
||
// ============================================================
|
||
// 上链流程
|
||
// ============================================================
|
||
function buildTokenizationAnswer(jurisdiction) {
|
||
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null;
|
||
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区';
|
||
return `## RWA 资产上链(通证化)流程
|
||
|
||
### 标准流程(基于 ACC-20 协议)
|
||
|
||
**第一步:资产登记**
|
||
- 提交资产基本信息(GNACS 类型、地点、权属证明)
|
||
- 系统自动分配 GNACS 编码(20大类之一)
|
||
- 生成唯一 NAC Asset ID
|
||
|
||
**第二步:AI 合规审核(${jName})**
|
||
- CNNL 神经网络语言自动分析合规性
|
||
- 七层合规验证(KYC / AML / CFT / 证券法 / 税务 / 产权 / 环境)
|
||
${jModel && jModel.regulator ? `- 辖区监管机构:**${jModel.regulator}**\n` : ''}${jModel && jModel.realEstate && jModel.realEstate.residential && jModel.realEstate.residential.foreignOwnership ? `- 外籍购买规则:${jModel.realEstate.residential.foreignOwnership}\n` : ''}- 合规评分 ≥ 80 分方可上链
|
||
|
||
**第三步:专业估值**
|
||
- AI 估值引擎根据 GNACS 类别选择估值方法
|
||
- 辖区感知参数自动调用
|
||
- 输出三重价值:**当地货币 + USD + XTZH**
|
||
|
||
**第四步:质押与发行**
|
||
- 资产所有人质押 **80%** 等值 XTZH
|
||
- Charter 智能合约自动部署(NVM 虚拟机)
|
||
- ACC-20 通证在链上发行
|
||
|
||
**第五步:二级市场流通**
|
||
- 通证在 NAC 生态内自由交易
|
||
- CBPP 共识确保交易最终性
|
||
- CSNP 网络保障合规传输
|
||
|
||
> 完整上链流程通常需要 **3-7 个工作日**,具体时间取决于辖区审批速度。`;
|
||
}
|
||
|
||
// ============================================================
|
||
// NAC 公链介绍
|
||
// ============================================================
|
||
function buildNACIntroAnswer() {
|
||
return `## NewAssetChain (NAC) — RWA 专用原生公链
|
||
|
||
NAC 是全球首个专为**现实世界资产(RWA)**设计的原生公链,不是以太坊或任何现有公链的衍生或扩展。
|
||
|
||
### 核心技术栈
|
||
|
||
| 组件 | NAC 原生实现 | 说明 |
|
||
|------|------------|------|
|
||
| 智能合约语言 | **Charter** | 专为 RWA 合规设计,非 Solidity |
|
||
| 虚拟机 | **NVM** | 原生 RWA 操作码,非 EVM |
|
||
| RPC 协议 | **NRPC 4.0** | 原生协议,非 JSON-RPC |
|
||
| 共识机制 | **CBPP** | 宪政区块生产协议,非 PoS/PoW |
|
||
| 网络协议 | **CSNP** | 合规感知网络,非 P2P |
|
||
| 神经网络语言 | **CNNL** | AI 合规推理语言 |
|
||
| 资产分类 | **GNACS** | 20 大类 × 60+ 辖区 |
|
||
| 资产协议 | **ACC-20** | RWA 通证化标准 |
|
||
|
||
### 核心功能
|
||
|
||
- **AI 合规验证:** 内置 AI 自动审核资产合规性(七层框架)
|
||
- **AI 估值引擎:** 多辖区、多资产类型专业估值
|
||
- **AI 审批系统:** 智能合约自动化审批流程
|
||
- **双链双币:** XTZH(稳定币)+ XIC(治理币)
|
||
|
||
### 支持资产规模
|
||
|
||
- **20 大类资产**(GNACS-01 至 GNACS-20)
|
||
- **60+ 司法辖区**(覆盖全球主要经济体)
|
||
- **50+ 资产子类**(充分细化每类资产)`;
|
||
}
|
||
|
||
// ============================================================
|
||
// 辖区对比
|
||
// ============================================================
|
||
function buildJurisdictionCompareAnswer(xtzhPrice) {
|
||
const tier1 = Object.entries(JURISDICTION_MODELS).filter(([, j]) => j.tier === 1).slice(0, 12);
|
||
let rows = '';
|
||
tier1.forEach(([code, j]) => {
|
||
const re = j.realEstate && j.realEstate.residential;
|
||
const capRate = re && re.capRate ? re.capRate.range : 'N/A';
|
||
const foreign = re && re.foreignOwnership ? (re.foreignOwnership.length > 25 ? re.foreignOwnership.substring(0, 25) + '…' : re.foreignOwnership) : '无限制';
|
||
rows += `| ${j.flag} ${j.name} | ${j.currency} | ${j.regulator || 'N/A'} | ${capRate} | ${foreign} |\n`;
|
||
});
|
||
return `## Tier 1 辖区不动产估值对比
|
||
|
||
| 辖区 | 货币 | 监管机构 | 住宅资本化率 | 外籍购房规则 |
|
||
|------|------|---------|------------|------------|
|
||
${rows}
|
||
### 辖区选择建议
|
||
|
||
- **最友好外籍购房:** 🇯🇵 日本(无限制)、🇩🇪 德国(无限制)、🇦🇪 阿联酋(Freehold区域)
|
||
- **最高收益率:** 🇦🇪 阿联酋(6-8%)、🇿🇦 南非(6-10%)
|
||
- **最成熟市场:** 🇺🇸 美国、🇬🇧 英国、🇯🇵 日本
|
||
- **最严格限制:** 🇨🇳 中国大陆、🇸🇬 新加坡(外籍 ABSD 60%)
|
||
|
||
> 当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**。所有辖区的资产估值均可换算为 XTZH 等值。`;
|
||
}
|
||
|
||
// ============================================================
|
||
// 知识产权类专业估值回答
|
||
// ============================================================
|
||
function buildIPValuationAnswer(subcat, jModel, xtzhPrice, userMessage) {
|
||
const ipInfo = {
|
||
copyright: {
|
||
name: '版权/著作权',
|
||
gnacs: 'GNACS-05',
|
||
methods: [
|
||
'**收益法(版税折现法)**:以未来版税收入折现为现值,是最常用方法',
|
||
'**市场比较法**:参考同类版权的可比交易价格',
|
||
'**成本法**:以创作成本+市场溢价估算(适用于新作品)'
|
||
],
|
||
params: ['年版税收入(或预期版税率×授权收入基数)', '剩余保护期(著作权:作者终身+50-70年)', '折现率(通常8-15%)', '授权地域范围(全球/区域)', '授权类型(独家/非独家)', '商业化程度(已授权/未授权)'],
|
||
formula: '版权价值 = 年版税收入 × [(1-(1+r)^-n) / r]',
|
||
formula_note: 'r=折现率,n=剩余保护期(年)',
|
||
collateral: 0.60,
|
||
special: {
|
||
music: '音乐版权:版税率通常8-12%,流媒体版权额外考虑平台分成比例',
|
||
film: '影视版权:考虑院线/流媒体/海外发行多渠道收益',
|
||
software: '软件著作权:SaaS模式按ARR×倍数,许可模式按版税折现'
|
||
}
|
||
},
|
||
patent: {
|
||
name: '专利权',
|
||
gnacs: 'GNACS-05',
|
||
methods: [
|
||
'**许可费节省法(Relief from Royalty)**:假设使用该专利需支付的许可费折现值',
|
||
'**超额收益法(Multi-Period Excess Earnings)**:专利带来的超额利润折现',
|
||
'**技术贡献法**:专利对产品价值的贡献比例×产品市值',
|
||
'**可比交易法**:参考同技术领域的专利交易案例'
|
||
],
|
||
params: ['专利有效期(剩余年数)', '年许可费收入(或可比许可费率3-15%)', '技术替代风险(高/中/低)', '专利覆盖范围(国家/地区数量)', '技术成熟度(早期/成长/成熟)', '是否核心专利(基础专利溢价30-50%)'],
|
||
formula: '专利价值 = 年许可费 × [(1-(1+r)^-n) / r] × 技术风险折扣',
|
||
formula_note: '技术风险折扣:高风险0.5-0.7,中风险0.7-0.85,低风险0.85-1.0',
|
||
collateral: 0.55,
|
||
special: {
|
||
invention: '发明专利:保护期20年,价值最高,需考虑无效风险',
|
||
utility: '实用新型:保护期10年,价值适中',
|
||
design: '外观设计:保护期15年,依赖品牌溢价'
|
||
}
|
||
},
|
||
trademark: {
|
||
name: '商标权',
|
||
gnacs: 'GNACS-05',
|
||
methods: [
|
||
'**品牌收益折现法**:品牌带来的溢价收益折现',
|
||
'**市场溢价法**:品牌产品与无品牌产品的价格差×销售量',
|
||
'**特许权使用费节省法**:假设授权使用商标需支付的费率×收入基数',
|
||
'**成本法**:品牌建设总成本(广告+推广+时间价值)'
|
||
],
|
||
params: ['品牌知名度(地区/全国/全球)', '注册地域数量', '年品牌授权收入', '品牌溢价率(vs无品牌产品)', '商标有效期(10年可续期)', '行业影响力指数'],
|
||
formula: '商标价值 = 年品牌溢价收益 × 品牌强度系数 × 年金现值系数',
|
||
formula_note: '品牌强度系数:全球知名品牌1.5-3.0,区域品牌0.8-1.5,本地品牌0.5-0.8',
|
||
collateral: 0.55
|
||
},
|
||
portrait_rights: {
|
||
name: '肖像权/形象权/IP',
|
||
gnacs: 'GNACS-05',
|
||
methods: [
|
||
'**商业化收益折现法**:年商业代言/授权收入折现',
|
||
'**品牌溢价法**:个人IP带来的商业溢价估算',
|
||
'**可比交易法**:参考同量级艺人/运动员的IP授权价格',
|
||
'**影响力指数法**:粉丝数量×互动率×商业转化率'
|
||
],
|
||
params: ['年商业化收入(代言+授权+演出)', '知名度等级(国际/全国/区域)', '粉丝规模与互动率', '职业剩余年限(运动员/艺人)', '商业化潜力评分', '独家授权溢价'],
|
||
formula: '肖像权价值 = 年商业化收入 × 知名度系数 × 职业剩余年限折现',
|
||
formula_note: '知名度系数:国际顶级3-5倍,全国知名1.5-3倍,区域知名0.8-1.5倍',
|
||
collateral: 0.50,
|
||
special: {
|
||
athlete: '运动员:需考虑运动生涯有限性(通常10-20年),退役后品牌衰减',
|
||
celebrity: '艺人:考虑作品积累、粉丝黏性、负面风险折价',
|
||
influencer: '网红/KOL:考虑平台依赖风险、粉丝忠诚度、变现能力'
|
||
}
|
||
},
|
||
trade_secret: {
|
||
name: '商业秘密',
|
||
gnacs: 'GNACS-05',
|
||
methods: [
|
||
'**成本法**:开发/获取该秘密的成本+市场溢价',
|
||
'**收益法**:商业秘密带来的超额利润折现',
|
||
'**市场法**:同类技术秘密的可比交易(较少)'
|
||
],
|
||
params: ['秘密的独特性和稀缺性', '竞争优势持续期', '年超额利润贡献', '泄露风险评估', '保密措施完善程度'],
|
||
collateral: 0.45
|
||
}
|
||
};
|
||
|
||
const info = ipInfo[subcat] || ipInfo.copyright;
|
||
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区';
|
||
|
||
// 辖区知识产权保护信息
|
||
let ipJurisdiction = '';
|
||
if (jModel && jModel.intellectualProperty) {
|
||
const ipData = jModel.intellectualProperty;
|
||
ipJurisdiction = `\n### ${jModel.flag} ${jModel.name}知识产权保护\n\n`;
|
||
if (ipData.copyrightTerm) ipJurisdiction += `- **版权保护期:** ${ipData.copyrightTerm}\n`;
|
||
if (ipData.patentTerm) ipJurisdiction += `- **专利保护期:** ${ipData.patentTerm}\n`;
|
||
if (ipData.trademarkTerm) ipJurisdiction += `- **商标保护期:** ${ipData.trademarkTerm}(可续期)\n`;
|
||
if (ipData.registrationBody) ipJurisdiction += `- **注册机构:** ${ipData.registrationBody}\n`;
|
||
if (ipData.royaltyRates) {
|
||
ipJurisdiction += `- **市场版税率参考:**\n`;
|
||
Object.entries(ipData.royaltyRates).forEach(([type, rate]) => {
|
||
ipJurisdiction += ` - ${type}:${rate}\n`;
|
||
});
|
||
}
|
||
}
|
||
|
||
let response = `## 💡 ${info.name}估值分析(GNACS-05 知识产权类)\n\n`;
|
||
response += `**适用辖区:** ${jName}\n\n`;
|
||
response += `### 推荐估值方法\n\n`;
|
||
info.methods.forEach(m => { response += `${m}\n\n`; });
|
||
response += `### 关键估值参数\n\n`;
|
||
info.params.forEach(p => { response += `- ${p}\n`; });
|
||
response += `\n### 估值公式\n\n`;
|
||
response += `\`${info.formula}\`\n\n`;
|
||
response += `> ${info.formula_note}\n`;
|
||
response += ipJurisdiction;
|
||
|
||
// 特殊说明
|
||
if (info.special) {
|
||
response += `\n### 细分类型特殊考量\n\n`;
|
||
Object.entries(info.special).forEach(([, note]) => {
|
||
response += `- ${note}\n`;
|
||
});
|
||
}
|
||
|
||
// XTZH 换算
|
||
response += `\n### 💎 XTZH 通证化换算\n\n`;
|
||
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
|
||
response += `| 当地货币 | 按${jModel ? jModel.name : '目标辖区'}市场参数计算 |\n`;
|
||
response += `| USD 等值 | 当地货币 × ${jModel ? jModel.usdRate : '当前汇率'} |\n`;
|
||
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
|
||
response += `| 质押比例 | ${(info.collateral * 100).toFixed(0)}%(知识产权类,低于不动产) |\n\n`;
|
||
response += `> **提示:** 请提供具体参数(年收入/保护期/授权范围),AI 将计算精确的三重价值。\n\n`;
|
||
response += `> **NAC 上链优势:** 知识产权通证化后,可实现版权分拆交易、自动版税分配、全球授权追踪,Charter 智能合约自动执行授权协议。`;
|
||
|
||
return response;
|
||
}
|
||
|
||
// ============================================================
|
||
// 资产估值回答(辖区感知)
|
||
// ============================================================
|
||
function buildAssetValuationAnswer(assetType, jurisdiction, xtzhPrice, userMessage) {
|
||
const cat = ASSET_CATEGORIES[assetType.category];
|
||
const sub = cat && assetType.subcat ? cat.subcategories[assetType.subcat] : null;
|
||
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null;
|
||
|
||
// 知识产权类:使用专业 IP 估值回答
|
||
if (assetType.category === 'intellectual_property') {
|
||
return buildIPValuationAnswer(assetType.subcat, jModel, xtzhPrice, userMessage);
|
||
}
|
||
|
||
// 艺术品与收藏品类
|
||
if (assetType.category === 'art_collectibles') {
|
||
return buildArtValuationAnswer(assetType.subcat, jModel, xtzhPrice);
|
||
}
|
||
|
||
// 环境权益类
|
||
if (assetType.category === 'environmental_rights') {
|
||
return buildEnvironmentalValuationAnswer(assetType.subcat, jModel, xtzhPrice);
|
||
}
|
||
|
||
// 企业权益类
|
||
if (assetType.category === 'corporate_equity') {
|
||
return buildEquityValuationAnswer(assetType.subcat, jModel, xtzhPrice);
|
||
}
|
||
|
||
let response = `## ${cat ? cat.icon : '📦'} ${cat ? cat.name : '资产'}估值分析`;
|
||
if (jModel) response += `(${jModel.flag} ${jModel.name}辖区)`;
|
||
response += '\n\n';
|
||
|
||
if (cat) {
|
||
response += `**GNACS 编码:** ${cat.code}\n\n`;
|
||
}
|
||
|
||
if (sub) {
|
||
response += `**资产子类:** ${sub.name}\n\n`;
|
||
response += `### 推荐估值方法\n\n`;
|
||
sub.methods.forEach(m => { response += `- ${m}\n`; });
|
||
response += `\n### 关键估值参数\n\n`;
|
||
sub.keyParams.forEach(p => { response += `- ${p}\n`; });
|
||
response += '\n';
|
||
}
|
||
|
||
// 辖区特定规则
|
||
if (jModel) {
|
||
response += `### ${jModel.flag} ${jModel.name}辖区特定规则\n\n`;
|
||
const re = jModel.realEstate;
|
||
if (re && assetType.category === 'real_estate') {
|
||
const reModel = re[assetType.subcat] || re.residential;
|
||
if (reModel) {
|
||
if (reModel.primaryMethod) response += `**主要估值方法:** ${reModel.primaryMethod}\n\n`;
|
||
if (reModel.capRate) response += `**资本化率参考:** ${reModel.capRate.range}(${reModel.capRate.note})\n\n`;
|
||
if (reModel.foreignOwnership) response += `**外籍购买规则:** ${reModel.foreignOwnership}\n\n`;
|
||
if (reModel.taxConsiderations) response += `**税务考量:** ${reModel.taxConsiderations}\n\n`;
|
||
if (reModel.specialRules && reModel.specialRules.length > 0) {
|
||
response += `**特殊规定:**\n`;
|
||
reModel.specialRules.forEach(r => { response += `- ${r}\n`; });
|
||
response += '\n';
|
||
}
|
||
}
|
||
} else {
|
||
response += `- **货币:** ${jModel.currency}(1 ${jModel.currency} ≈ ${jModel.usdRate} USD)\n`;
|
||
if (jModel.regulator) response += `- **监管机构:** ${jModel.regulator}\n`;
|
||
response += `- **市场成熟度:** Tier ${jModel.tier}\n\n`;
|
||
}
|
||
}
|
||
|
||
// XTZH 换算
|
||
response += `### 💎 XTZH 通证化换算\n\n`;
|
||
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
|
||
response += `| 估值维度 | 计算方式 |\n|---------|--------|\n`;
|
||
if (jModel) {
|
||
response += `| 当地货币 | 按${jModel.name}市场参数计算 |\n`;
|
||
response += `| USD 等值 | 当地货币 × ${jModel.usdRate} |\n`;
|
||
} else {
|
||
response += `| 当地货币 | 按目标辖区市场参数计算 |\n`;
|
||
response += `| USD 等值 | 按当前汇率换算 |\n`;
|
||
}
|
||
response += `| XTZH 等值 | USD 价值 ÷ ${xtzhPrice.toFixed(4)} |\n`;
|
||
response += `| 质押要求 | XTZH 等值 × 80% |\n\n`;
|
||
response += `> **提示:** 请提供具体资产参数(面积/价格/年收入等),AI 将给出精确的三重价值估算。`;
|
||
|
||
return response;
|
||
}
|
||
|
||
// ============================================================
|
||
// 艺术品估值回答
|
||
// ============================================================
|
||
function buildArtValuationAnswer(subcat, jModel, xtzhPrice) {
|
||
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '全球';
|
||
let response = `## 🎨 艺术品与收藏品估值分析(GNACS-04)\n\n`;
|
||
response += `**适用辖区:** ${jName}\n\n`;
|
||
response += `### 主要估值方法\n\n`;
|
||
response += `**拍卖记录法(Market Approach)**:参考同一艺术家或同类作品的近期拍卖成交价,是最权威的方法。\n\n`;
|
||
response += `**专家鉴定法**:由认证艺术品评估师(AAA/ASA认证)出具专业评估报告。\n\n`;
|
||
response += `**成本法**:以创作成本+艺术家声誉溢价估算(适用于当代艺术)。\n\n`;
|
||
response += `### 关键估值参数\n\n`;
|
||
response += `- 艺术家知名度与市场认可度(拍卖记录、展览经历)\n`;
|
||
response += `- 作品真实性证明(来源证明/Provenance、鉴定证书)\n`;
|
||
response += `- 作品状态与保存条件(修复记录、保存环境)\n`;
|
||
response += `- 创作年代与历史意义\n`;
|
||
response += `- 稀缺性(限量版/孤品/系列作品)\n`;
|
||
response += `- 近期市场行情(艺术品市场周期)\n\n`;
|
||
response += `### 主要拍卖行参考\n\n`;
|
||
response += `| 拍卖行 | 总部 | 专长 |\n|--------|------|------|\n`;
|
||
response += `| 苏富比 (Sotheby's) | 纽约/伦敦 | 全类别,古典与当代 |\n`;
|
||
response += `| 佳士得 (Christie's) | 纽约/伦敦 | 全类别,印象派强 |\n`;
|
||
response += `| 保利拍卖 | 北京 | 中国书画、瓷器 |\n`;
|
||
response += `| 嘉德拍卖 | 北京 | 中国文物、当代艺术 |\n`;
|
||
response += `| 邦瀚斯 (Bonhams) | 伦敦 | 古董、珠宝、名车 |\n\n`;
|
||
response += `### 💎 XTZH 通证化换算\n\n`;
|
||
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
|
||
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
|
||
response += `| 市场价值 | 最近可比拍卖成交价(USD) |\n`;
|
||
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
|
||
response += `| 质押比例 | 60%(艺术品流动性折价) |\n\n`;
|
||
response += `> **NAC 优势:** 艺术品 NFT 化后,可实现分拆所有权(碎片化)、全球流通、版权自动追踪。`;
|
||
return response;
|
||
}
|
||
|
||
// ============================================================
|
||
// 环境权益估值回答
|
||
// ============================================================
|
||
function buildEnvironmentalValuationAnswer(subcat, jModel, xtzhPrice) {
|
||
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '全球';
|
||
let response = `## 🌱 环境权益估值分析(GNACS-09)\n\n`;
|
||
response += `**适用辖区:** ${jName}\n\n`;
|
||
response += `### 碳排放权估值方法\n\n`;
|
||
response += `**市场价格法**:参考碳交易市场现货/期货价格(EU ETS、中国碳市场、VCS等)。\n\n`;
|
||
response += `**替代成本法**:以减排同等碳量所需的技术成本估算。\n\n`;
|
||
response += `### 主要碳市场参考价格\n\n`;
|
||
response += `| 市场 | 标准 | 参考价格(USD/tCO₂) | 备注 |\n|------|------|-------------------|------|\n`;
|
||
response += `| EU ETS | 欧盟 | $60-80 | 全球最大强制碳市场 |\n`;
|
||
response += `| 中国碳市场 | CCER | $8-15 | 全球最大配额量 |\n`;
|
||
response += `| VCS/Verra | 自愿 | $5-25 | 国际自愿减排 |\n`;
|
||
response += `| Gold Standard | 自愿 | $15-50 | 高质量认证溢价 |\n`;
|
||
response += `| California Cap | 美国加州 | $25-40 | 美国最严格 |\n\n`;
|
||
response += `### 关键估值参数\n\n`;
|
||
response += `- 碳信用数量(tCO₂当量)\n`;
|
||
response += `- 核证标准(VCS/Gold Standard/CDM/CCER)\n`;
|
||
response += `- 项目类型(可再生能源/森林碳汇/工业减排)\n`;
|
||
response += `- 有效期与到期日\n`;
|
||
response += `- 政策风险(碳价格波动、政策变化)\n\n`;
|
||
response += `### 💎 XTZH 通证化换算\n\n`;
|
||
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
|
||
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
|
||
response += `| 市场价值 | 碳信用数量 × 市场价格(USD/tCO₂) |\n`;
|
||
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
|
||
response += `| 质押比例 | 65%(环境权益类) |\n\n`;
|
||
response += `> **NAC 优势:** 碳信用通证化后,实现全球碳交易、自动核证、防止重复计算,Charter 合约自动执行碳抵消协议。`;
|
||
return response;
|
||
}
|
||
|
||
// ============================================================
|
||
// 企业权益估值回答
|
||
// ============================================================
|
||
function buildEquityValuationAnswer(subcat, jModel, xtzhPrice) {
|
||
const jName = jModel ? `${jModel.flag} ${jModel.name}` : '目标辖区';
|
||
let response = `## 📊 企业权益估值分析(GNACS-10)\n\n`;
|
||
response += `**适用辖区:** ${jName}\n\n`;
|
||
response += `### 主要估值方法\n\n`;
|
||
response += `**市场乘数法(Market Multiples)**:\n`;
|
||
response += `- P/E 市盈率法:股价 ÷ 每股收益(适用于盈利稳定企业)\n`;
|
||
response += `- EV/EBITDA:企业价值 ÷ 息税折旧摊销前利润(适用于重资产行业)\n`;
|
||
response += `- P/S 市销率:市值 ÷ 年收入(适用于高成长科技企业)\n\n`;
|
||
response += `**DCF 折现现金流法**:预测未来5-10年自由现金流,按WACC折现。\n\n`;
|
||
response += `**可比交易法**:参考同行业近期并购交易的估值倍数。\n\n`;
|
||
response += `### 非上市股权特殊折价\n\n`;
|
||
response += `| 折价类型 | 折价幅度 | 说明 |\n|---------|---------|------|\n`;
|
||
response += `| 流动性折价 (DLOM) | 20-40% | 非上市股权无法快速变现 |\n`;
|
||
response += `| 少数股权折价 (DLOC) | 10-30% | 非控股股权缺乏控制权 |\n`;
|
||
response += `| 控制权溢价 | +20-40% | 控股股权享有溢价 |\n\n`;
|
||
if (jModel && jModel.financialAssets) {
|
||
const fa = jModel.financialAssets;
|
||
response += `### ${jModel.flag} ${jModel.name}市场参数\n\n`;
|
||
if (fa.stockMarket) response += `- **证券交易所:** ${fa.stockMarket}\n`;
|
||
if (fa.peRatioRange) response += `- **市场平均P/E:** ${fa.peRatioRange.min}-${fa.peRatioRange.max}倍(均值${fa.peRatioRange.avg}倍)\n`;
|
||
if (fa.dividendYield) response += `- **股息率:** ${fa.dividendYield.min}-${fa.dividendYield.max}%\n`;
|
||
if (fa.capitalGainsTax) response += `- **资本利得税:** ${fa.capitalGainsTax}\n`;
|
||
response += '\n';
|
||
}
|
||
response += `### 💎 XTZH 通证化换算\n\n`;
|
||
response += `当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**\n\n`;
|
||
response += `| 估值维度 | 说明 |\n|---------|------|\n`;
|
||
response += `| 股权价值 | 按估值方法计算(USD) |\n`;
|
||
response += `| XTZH 等值 | USD 价值 ÷ $${xtzhPrice.toFixed(4)} |\n`;
|
||
response += `| 质押比例 | 55%(股权类,含流动性折价) |\n\n`;
|
||
response += `> **NAC 优势:** 非上市股权通证化后,可实现股权分拆、全球投资者参与、自动分红分配,解决传统私募股权流动性差的问题。`;
|
||
return response;
|
||
}
|
||
|
||
// ============================================================
|
||
// 构建推理引擎 System Prompt(辖区感知)
|
||
// ============================================================
|
||
async function buildSystemPrompt(assetType, jurisdiction) {
|
||
const priceData = await getXTZHPrice();
|
||
const xtzhPrice = priceData.usd || 4.3944;
|
||
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : null;
|
||
const cat = assetType ? ASSET_CATEGORIES[assetType.category] : null;
|
||
|
||
let prompt = `你是 NAC NewAssetChain 公链的专业 AI 估值顾问,专注于 RWA(现实世界资产)的估值、通证化和合规咨询。
|
||
|
||
## 核心身份
|
||
- NAC 是 RWA 专用原生公链,不是以太坊或任何现有公链的衍生
|
||
- 智能合约语言:Charter(非 Solidity);虚拟机:NVM(非 EVM)
|
||
- 资产分类:GNACS(20大类,60+辖区)
|
||
- 稳定币:XTZH(当前:$${xtzhPrice.toFixed(4)} USD,SDR锚定+黄金储备)
|
||
- 治理币:XIC
|
||
|
||
## 估值原则
|
||
1. 根据 GNACS 编码选择最适合的估值方法
|
||
2. 充分考虑辖区特定规则(税务、外籍限制、监管要求)
|
||
3. 估值结果必须同时提供:当地货币 + USD + XTZH 三重价值
|
||
4. 无形资产(版权/专利/肖像权等)使用专业估值方法(许可费节省法/超额收益法等)
|
||
5. 回答要专业、结构化,使用 Markdown 格式
|
||
|
||
## GNACS 20大类资产
|
||
${Object.entries(GNACS_CODES).map(([code, info]) => `- ${code}: ${info.name}`).join('\n')}
|
||
`;
|
||
|
||
if (jModel) {
|
||
prompt += `\n## 当前辖区:${jModel.flag} ${jModel.name} (${jModel.currency})
|
||
- 汇率:1 ${jModel.currency} = ${jModel.usdRate} USD
|
||
- 监管机构:${jModel.regulator || 'N/A'}
|
||
- 市场成熟度:Tier ${jModel.tier}
|
||
`;
|
||
const re = jModel.realEstate && jModel.realEstate.residential;
|
||
if (re) {
|
||
prompt += `- 住宅资本化率:${re.capRate ? re.capRate.range : 'N/A'}
|
||
- 外籍购房规则:${re.foreignOwnership || 'N/A'}
|
||
- 特殊规定:${re.specialRules ? re.specialRules.join(';') : 'N/A'}
|
||
`;
|
||
}
|
||
}
|
||
|
||
if (cat) {
|
||
prompt += `\n## 当前资产类别:${cat.icon} ${cat.name}(${cat.code})\n`;
|
||
Object.entries(cat.subcategories).forEach(([, sub]) => {
|
||
const methods = Array.isArray(sub.methods) ? sub.methods.join('、') : (sub.methods || 'N/A');
|
||
const keyParams = Array.isArray(sub.keyParams) ? sub.keyParams.join('、') : (sub.keyParams || 'N/A');
|
||
prompt += `### ${sub.name}\n- 估值方法:${methods}\n- 关键参数:${keyParams}\n`;
|
||
});
|
||
}
|
||
|
||
return prompt;
|
||
}
|
||
|
||
// ============================================================
|
||
// 本地降级处理(推理引擎不可用时)
|
||
// ============================================================
|
||
async function handleLocalFallback(body, res) {
|
||
const question = body.question || body.messages?.[body.messages.length - 1]?.content || '';
|
||
// 文本识别优先:先从问题文本识别资产类型,后备用 assetCategory
|
||
const textDetected = detectAssetType(question);
|
||
const assetType = textDetected || (body.assetCategory ? { category: body.assetCategory, subcat: null } : null);
|
||
const jurisdiction = body.jurisdictionCode || detectJurisdiction(question);
|
||
|
||
let answer = await generateKnowledgeAnswer(question, assetType, jurisdiction);
|
||
if (!answer) {
|
||
const priceData = await getXTZHPrice();
|
||
const xtzhPrice = priceData.usd || 4.3944;
|
||
answer = `## NAC AI 估值顾问
|
||
|
||
当前 XTZH 价格:**$${xtzhPrice.toFixed(4)} USD**
|
||
|
||
我是 NAC NewAssetChain 的专业 AI 估值顾问,支持 **20 大类资产 × 60+ 辖区**的专业估值。
|
||
|
||
**可咨询内容:**
|
||
- 不动产(住宅/商业/工业/土地)— 辖区特定估值模型
|
||
- 知识产权(版权/专利/商标/肖像权)— 许可费节省法/超额收益法
|
||
- 金融证券(股权/债券/基金)— DCF/市场乘数法
|
||
- 艺术品与收藏品 — 拍卖记录法/专家鉴定法
|
||
- 大宗商品(贵金属/能源/农产品)— 现货/期货市场法
|
||
- 数字资产(加密货币/NFT)— 网络价值法
|
||
- 以及更多 GNACS-07 至 GNACS-20 类别
|
||
|
||
请描述您的资产(类型、位置、面积/数量、市值),我将给出专业估值。`;
|
||
}
|
||
|
||
const lines = answer.split('\n');
|
||
let i = 0;
|
||
const interval = setInterval(() => {
|
||
if (i >= lines.length) {
|
||
clearInterval(interval);
|
||
res.write('data: [DONE]\n\n');
|
||
res.end();
|
||
return;
|
||
}
|
||
const lineContent = lines[i] + (i < lines.length - 1 ? '\n' : '');
|
||
res.write(`data: ${JSON.stringify({ type: 'chunk', content: lineContent })}\n\n`);
|
||
i++;
|
||
}, 30);
|
||
}
|
||
|
||
// ============================================================
|
||
// API 路由
|
||
// ============================================================
|
||
|
||
// XTZH 价格
|
||
app.get('/api/v4/xtzh-price', async (req, res) => {
|
||
res.json(await getXTZHPrice());
|
||
});
|
||
|
||
// 20大类资产分类
|
||
app.get('/api/v4/asset-categories', (req, res) => {
|
||
const categories = Object.entries(ASSET_CATEGORIES).map(([key, cat]) => ({
|
||
key, code: cat.code, name: cat.name, nameEn: cat.nameEn, icon: cat.icon,
|
||
subcategories: Object.entries(cat.subcategories).map(([sk, sub]) => ({
|
||
key: sk, name: sub.name, types: sub.types, methods: sub.methods, keyParams: sub.keyParams
|
||
}))
|
||
}));
|
||
res.json({ categories, total: categories.length });
|
||
});
|
||
|
||
// 60+辖区列表
|
||
app.get('/api/v4/jurisdictions', (req, res) => {
|
||
const jurisdictions = Object.entries(JURISDICTION_MODELS).map(([code, j]) => ({
|
||
code, name: j.name, nameEn: j.nameEn, currency: j.currency,
|
||
currencySymbol: j.currencySymbol, usdRate: j.usdRate,
|
||
tier: j.tier, region: j.region, flag: j.flag, regulator: j.regulator
|
||
}));
|
||
res.json({ jurisdictions, total: jurisdictions.length });
|
||
});
|
||
|
||
// 辖区详情
|
||
app.get('/api/v4/jurisdiction/:code', (req, res) => {
|
||
const code = req.params.code.toUpperCase();
|
||
const jModel = JURISDICTION_MODELS[code];
|
||
if (jModel) return res.json(jModel);
|
||
res.status(404).json({ error: 'Jurisdiction not found' });
|
||
});
|
||
|
||
// 估值引擎代理
|
||
app.post('/api/v4/valuate', async (req, res) => {
|
||
try {
|
||
const data = await proxyRequest('POST', VALUATION_ENGINE, '/api/v4/valuate', req.body, VALUATION_ENGINE.timeout);
|
||
return res.json(data);
|
||
} catch(e) {
|
||
// 本地估值降级
|
||
const priceData = await getXTZHPrice();
|
||
const xtzhPrice = priceData.usd || 4.3944;
|
||
const { area, pricePerUnit, income, capRate, jurisdiction, assetType } = req.body;
|
||
const jModel = jurisdiction ? JURISDICTION_MODELS[jurisdiction] : JURISDICTION_MODELS['GLOBAL'];
|
||
const usdRate = jModel ? jModel.usdRate : 1.0;
|
||
let valueLocal = 0;
|
||
let method = '市场比较法';
|
||
if (area && pricePerUnit) { valueLocal = parseFloat(area) * parseFloat(pricePerUnit); method = '市场比较法(单价×面积)'; }
|
||
else if (income && capRate) { valueLocal = parseFloat(income) / (parseFloat(capRate) / 100); method = '收益资本化法'; }
|
||
const valueUSD = valueLocal * usdRate;
|
||
const valueXTZH = valueUSD / xtzhPrice;
|
||
return res.json({
|
||
success: true, valuationMethod: method,
|
||
valueLocal: { amount: valueLocal, currency: jModel ? jModel.currency : 'USD' },
|
||
valueUSD: { amount: valueUSD, currency: 'USD' },
|
||
valueXTZH: { amount: valueXTZH, currency: 'XTZH', price: xtzhPrice },
|
||
pledgeRequired: { amount: valueXTZH * 0.8, currency: 'XTZH' },
|
||
gnacs: assetType ? (ASSET_CATEGORIES[assetType] ? ASSET_CATEGORIES[assetType].code : 'GNACS-20') : 'GNACS-20',
|
||
timestamp: new Date().toISOString()
|
||
});
|
||
}
|
||
});
|
||
|
||
// 推理引擎 SSE 流式输出(主问答接口)
|
||
app.post('/api/inference/stream', async (req, res) => {
|
||
const body = req.body;
|
||
const question = body.question || body.messages?.[body.messages.length - 1]?.content || '';
|
||
// 文本识别优先
|
||
const textDetectedStream = detectAssetType(question);
|
||
const assetType = textDetectedStream || (body.assetCategory ? { category: body.assetCategory, subcat: null } : null);
|
||
const jurisdiction = body.jurisdictionCode || detectJurisdiction(question);
|
||
|
||
res.setHeader('Content-Type', 'text/event-stream');
|
||
res.setHeader('Cache-Control', 'no-cache');
|
||
res.setHeader('Connection', 'keep-alive');
|
||
res.setHeader('X-Accel-Buffering', 'no');
|
||
|
||
// 构建增强的请求体(加入辖区感知 system prompt)
|
||
const systemPrompt = await buildSystemPrompt(assetType, jurisdiction);
|
||
const enhancedBody = {
|
||
...body,
|
||
systemPrompt,
|
||
messages: body.messages ? [{ role: 'system', content: systemPrompt }, ...body.messages.filter(m => m.role !== 'system')] : undefined
|
||
};
|
||
const bodyStr = JSON.stringify(enhancedBody);
|
||
|
||
const options = {
|
||
hostname: INFERENCE_ENGINE.host, port: INFERENCE_ENGINE.port,
|
||
path: '/api/inference/stream', method: 'POST',
|
||
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(bodyStr) },
|
||
timeout: INFERENCE_ENGINE.timeout
|
||
};
|
||
|
||
const proxyReq = http.request(options, (proxyRes) => {
|
||
proxyRes.on('data', chunk => { if (!res.writableEnded) res.write(chunk); });
|
||
proxyRes.on('end', () => { if (!res.writableEnded) { res.write('data: [DONE]\n\n'); res.end(); } });
|
||
proxyRes.on('error', () => { if (!res.writableEnded) handleLocalFallback(body, res); });
|
||
});
|
||
|
||
proxyReq.on('error', () => { if (!res.writableEnded) handleLocalFallback(body, res); });
|
||
proxyReq.on('timeout', () => { proxyReq.destroy(); if (!res.writableEnded) handleLocalFallback(body, res); });
|
||
proxyReq.write(bodyStr);
|
||
proxyReq.end();
|
||
req.on('close', () => { if (!proxyReq.destroyed) proxyReq.destroy(); });
|
||
});
|
||
|
||
// 健康检查
|
||
app.get('/health', async (req, res) => {
|
||
const priceData = await getXTZHPrice();
|
||
res.json({
|
||
status: 'ok', service: 'nac-valuation-ui', version: '2.0.0',
|
||
timestamp: new Date().toISOString(),
|
||
knowledgeBase: { assetCategories: Object.keys(ASSET_CATEGORIES).length, jurisdictions: Object.keys(JURISDICTION_MODELS).length },
|
||
xtzhPrice: priceData.usd || 4.3944,
|
||
engines: { valuation: `${VALUATION_ENGINE.host}:${VALUATION_ENGINE.port}`, inference: `${INFERENCE_ENGINE.host}:${INFERENCE_ENGINE.port}` }
|
||
});
|
||
});
|
||
|
||
app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'public', 'index.html')); });
|
||
|
||
app.listen(PORT, '0.0.0.0', () => {
|
||
console.log(`[NAC Valuation UI v2.0] 服务启动 → http://0.0.0.0:${PORT}`);
|
||
console.log(`[知识库] ${Object.keys(ASSET_CATEGORIES).length} 大类资产,${Object.keys(JURISDICTION_MODELS).length} 个辖区`);
|
||
});
|