脚本 #!/data/data/com.termux/files/usr/bin/bash set -euo pipefail readonly SCRIPT_NAME="$(basename "$0")" readonly MIMO_PACKAGE_NAME="@mimo-ai/cli" readonly MIMO_PACKAGE_VERSION="${MIMO_CODE_VERSION:-${MIMOCODE_VERSION:-latest}}" readonly PREFIX_DIR="${PREFIX:-/data/data/com.termux/files/usr}" readonly HOST_MIMO_PATH="$PREFIX_DIR/bin/mimo" readonly MIMO_CLI_PKG_DIR="$PREFIX_DIR/lib/node_modules/@mimo-ai/cli" readonly MIMO_ARCH_PKG_NAME="@mimo-ai/mimocode-linux-arm64" readonly MIMO_ARCH_PKG_DIR="$PREFIX_DIR/lib/node_modules/$MIMO_ARCH_PKG_NAME" readonly TMP_ROOT="$HOME/tmp" readonly BACKUP_DIR="$TMP_ROOT/mimocode-backups" readonly WRAPPER_MARKER="# mimocode-termux-glibc-wrapper" # Resolved by install_mimo_package() after locating the real glibc ELF. MIMO_BINARY_PATH="" MIMO_RESOLVED_VERSION="" readonly C_BOLD_BLUE="\033[1;34m" readonly C_BOLD_GREEN="\033[1;32m" readonly C_BOLD_YELLOW="\033[1;33m" readonly C_BOLD_RED="\033[1;31m" readonly C_RESET="\033[0m" info() { printf '%b[INFO]%b %s\n' "$C_BOLD_BLUE" "$C_RESET" "$*"; } success() { printf '%b[ OK ]%b %s\n' "$C_BOLD_GREEN" "$C_RESET" "$*"; } warn() { printf '%b[WARN]%b %s\n' "$C_BOLD_YELLOW" "$C_RESET" "$*" >&2; } die() { printf '%b[ERR ]%b %s\n' "$C_BOLD_RED" "$C_RESET" "$*" >&2; exit 1; } usage() { cat <<EOF Usage: bash $SCRIPT_NAME What it does (glibc-runner mode, no proot): 1. Installs glibc-repo, refreshes apt metadata, installs glibc-runner. 2. Installs nodejs-lts + npm in Termux (if missing). 3. npm installs ${MIMO_PACKAGE_NAME} globally, then force-installs the ${MIMO_ARCH_PKG_NAME} native linux-arm64 package. 4. Skips MiMoCode's postinstall script because Termux Node reports process.platform='android' and the upstream script looks for a non-existent @mimo-ai/mimocode-android-arm64 package. 5. Replaces \$PREFIX/bin/mimo with a grun wrapper that runs the glibc ELF directly on Termux. Environment overrides: MIMO_CODE_VERSION npm package version/tag, default: ${MIMO_PACKAGE_VERSION} examples: latest, preview, 0.1.0, v0.1.0 MIMOCODE_VERSION alias for MIMO_CODE_VERSION Notes: - Official MiMoCode install docs: https://github.com/XiaomiMiMo/MiMo-Code - glibc-runner injects glibc via LD_LIBRARY_PATH; kernel calls are native. EOF } command_exists() { command -v "$1" >/dev/null 2>&1; } # ELF magic = 7f 45 4c 46; e_machine at offset 18 = 0xb7 for EM_AARCH64. is_valid_aarch64_elf() { local f="$1" [ -f "$f" ] || return 1 local magic machine magic=$(od -An -tx1 -N4 "$f" 2>/dev/null | tr -d ' \n') [ "$magic" = "7f454c46" ] || return 1 machine=$(od -An -tx1 -j18 -N1 "$f" 2>/dev/null | tr -d ' \n') [ "$machine" = "b7" ] } find_arch_binary() { local candidate for candidate in \ "$MIMO_ARCH_PKG_DIR/bin/mimo" \ "$MIMO_CLI_PKG_DIR/bin/.mimocode"; do if is_valid_aarch64_elf "$candidate"; then MIMO_BINARY_PATH="$candidate" return 0 fi done while IFS= read -r candidate; do if is_valid_aarch64_elf "$candidate"; then MIMO_BINARY_PATH="$candidate" return 0 fi done < <(find "$MIMO_ARCH_PKG_DIR" "$MIMO_CLI_PKG_DIR" -type f -size +10M 2>/dev/null) return 1 } ensure_tmp_root() { mkdir -p "$TMP_ROOT" [ -w "$TMP_ROOT" ] || die "Temp directory is not writable: $TMP_ROOT" export TMPDIR="$TMP_ROOT" } require_termux() { [ -d "$PREFIX_DIR" ] || die "This script must run in Termux." command_exists pkg || die "pkg not found. This script must run in Termux." if [ -r /proc/1/status ] && grep -q 'TracerPid:.*[1-9]' /proc/1/status 2>/dev/null; then warn "Detected non-zero TracerPid on PID 1 -- looks like a proot session." warn "Run this script from a plain Termux shell, not from inside proot-distro." fi } ensure_termux_package() { local package_name="$1" if dpkg -s "$package_name" >/dev/null 2>&1; then success "Termux package already installed: $package_name" return 0 fi info "Installing Termux package: $package_name" pkg install -y "$package_name" success "Installed Termux package: $package_name" } ensure_glibc_runner() { ensure_termux_package "glibc-repo" if ! apt-cache show glibc-runner >/dev/null 2>&1; then info "Refreshing apt metadata so glibc-repo becomes visible" pkg update -y || apt-get update -y || true fi ensure_termux_package "glibc-runner" command_exists grun || die "grun not found after installing glibc-runner." } ensure_nodejs() { if command_exists node && command_exists npm; then success "Termux node present: $(node --version), npm $(npm --version)" return 0 fi if dpkg -s nodejs >/dev/null 2>&1; then success "nodejs already installed" else ensure_termux_package "nodejs-lts" fi command_exists node && command_exists npm || die "node/npm not found after installing nodejs." } resolve_mimo_version() { local requested="$MIMO_PACKAGE_VERSION" if [ "$requested" != "latest" ]; then requested="${requested#v}" fi local pkg_spec="$MIMO_PACKAGE_NAME" if [ "$requested" != "latest" ]; then pkg_spec="${MIMO_PACKAGE_NAME}@${requested}" fi info "Resolving version for ${pkg_spec}" local resolved resolved=$(npm view "$pkg_spec" version 2>/dev/null | tail -n1) \ || die "Failed to resolve version for ${pkg_spec} via npm view" [[ "$resolved" =~ ^[0-9]+\.[0-9]+ ]] \ || die "npm view returned a bogus version: '$resolved'" MIMO_RESOLVED_VERSION="$resolved" } backup_existing_launcher() { mkdir -p "$BACKUP_DIR" [ -e "$HOST_MIMO_PATH" ] || return 0 if grep -Fq "$WRAPPER_MARKER" "$HOST_MIMO_PATH" 2>/dev/null; then success "glibc-runner wrapper already in place" return 0 fi local backup_path="$BACKUP_DIR/mimo.host-backup.$(date +%Y%m%d_%H%M%S)" cp -P "$HOST_MIMO_PATH" "$backup_path" success "Backed up existing launcher to $backup_path" } install_mimo_package() { resolve_mimo_version local main_version="$MIMO_RESOLVED_VERSION" local pinned_main="${MIMO_PACKAGE_NAME}@${main_version}" local arch_spec="${MIMO_ARCH_PKG_NAME}@${main_version}" info "Installing ${pinned_main} without upstream optional platform packages" npm install -g --force --ignore-scripts --omit=optional "$pinned_main" info "Installing ${arch_spec} for Termux via glibc-runner" npm install -g --force --ignore-scripts --os=linux --cpu=arm64 "$arch_spec" find_arch_binary || die "No valid aarch64 ELF found under $MIMO_ARCH_PKG_DIR. \ The arch package may not have unpacked correctly; inspect with: \ ls -la $MIMO_ARCH_PKG_DIR" success "MiMoCode native binary: $MIMO_BINARY_PATH ($(stat -c %s "$MIMO_BINARY_PATH" 2>/dev/null || echo '?') bytes)" } install_host_wrapper() { local tmp_wrapper tmp_wrapper="$(mktemp "$TMP_ROOT/mimo-grun.XXXXXX")" cat >"$tmp_wrapper" <<EOF #!/data/data/com.termux/files/usr/bin/sh $WRAPPER_MARKER mkdir -p "\$HOME/tmp" 2>/dev/null || true export TMPDIR="\${TMPDIR:-\$HOME/tmp}" exec grun "$MIMO_BINARY_PATH" "\$@" EOF chmod 755 "$tmp_wrapper" rm -f "$HOST_MIMO_PATH" mv "$tmp_wrapper" "$HOST_MIMO_PATH" chmod 755 "$HOST_MIMO_PATH" success "Installed Termux launcher: $HOST_MIMO_PATH" } verify_install() { info "Verifying binary via grun" grun "$MIMO_BINARY_PATH" --version info "Verifying Termux launcher" "$HOST_MIMO_PATH" --version local path_mimo="" path_mimo="$(command -v mimo 2>/dev/null || true)" if [ -n "$path_mimo" ] && [ "$path_mimo" != "$HOST_MIMO_PATH" ]; then warn "Your PATH resolves 'mimo' to $path_mimo, not $HOST_MIMO_PATH." warn "Move $PREFIX_DIR/bin earlier in PATH or remove the older launcher." fi success "MiMoCode setup completed (glibc-runner mode)" } main() { if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then usage exit 0 fi ensure_tmp_root require_termux ensure_glibc_runner ensure_nodejs backup_existing_launcher install_mimo_package install_host_wrapper verify_install cat <<EOF Run MiMoCode with: mimo Configuration: mode: glibc-runner (no proot) binary: $MIMO_BINARY_PATH launcher: $HOST_MIMO_PATH temp: $TMP_ROOT If the official installer previously added ~/.mimocode/bin before $PREFIX_DIR/bin, that older launcher may shadow this Termux wrapper. Troubleshooting: - If npm cannot resolve a preview version, install with: MIMO_CODE_VERSION=preview bash $SCRIPT_NAME - If subprocess errors mention libc/ld.so, the binary is loading Termux bionic libs via inherited LD_LIBRARY_PATH. Check glibc-runner docs. EOF } main "$@" 1 个帖子 - 1 位参与者 阅读完整话题
hermes-agent.nousresearch.com Hermes Desktop — The Agent That Grows With You Hermes Desktop — a native app for macOS, Windows, and Linux. Install it and start a conversation with the agent that grows with you. 试了一下刚出来的 hermes desktop,乍一眼看起来和 codex 差不多,被 tui 丑哭了,迫不及待地试一试,结果一堆 bug 啊?具体: 时不时掉对话,你刚开的对话,可能过了几分钟就找不到了,然后过了几分钟再出现 对话会有丝分裂,你在一个对话对话了几轮,会发现这个对话突然变成了 Untitled Session,然后在别的地方找到了一样的对话 对话界面时不时给你闪一下 感觉真的很离谱,完全就是一个用起来特别难受的状态,我不信他们自己不做一点测试的,难道是我的电脑的问题? 8 个帖子 - 5 位参与者 阅读完整话题
hermes-agent.nousresearch.com Hermes Desktop — The Agent That Grows With You Hermes Desktop — a native app for macOS, Windows, and Linux. Install it and start a conversation with the agent that grows with you. 24 个帖子 - 24 位参与者 阅读完整话题
这段时间刚开始ai挖洞,一开始就配置了一个打CTF用的skill,然后挖edusrc的时候发现一个刚上线一个系统,尝试用codex配chatgpt十分钟左右吧出了一个高危一个中危。当时就觉得这个太nb了,然后就开始研究了一段时间。加了一下大佬们的skill,和配置了一个burpmcp和kalimcp,到现在为止出的漏洞挺多但是大部分是ai幻想的漏洞,比如一个购物网站他会把购物物品的id当成严重的信息泄写进露漏洞报告输出给我。 现在就是有点迷,不知道怎么去提升这方面的能力,有没有大佬来指点一下。麻烦了 4 个帖子 - 4 位参与者 阅读完整话题
如题,从垃圾堆捡到的一个纸条,上面写着: NVIDIA / SIMULATION #!/usr/bin/env bash set -Eeuo pipefail IFS=$'\n\t' PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin API_BASE_URL="https://api.dsx-air.nvidia.com/api/v3" SIMULATION_ID="${SIMULATION_ID:-820b1c6a-aaaa-bbbb-cccc-879e4511dddd}" HOURS_FROM_NOW="${HOURS_FROM_NOW:-70}" : "${NVIDIA_API_KEY:?NVIDIA_API_KEY is required}" log() { printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" } require_command() { command -v "$1" >/dev/null 2>&1 || { log "ERROR: Required command not found: $1" exit 1 } } extract_sleep_at() { local body_file="$1" if command -v jq >/dev/null 2>&1; then jq -r '.sleep_at // empty' "$body_file" 2>/dev/null || true else sed -n 's/.*"sleep_at"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$body_file" | head -n 1 fi } require_command curl require_command date SLEEP_AT_UTC="$(date -u -d "+${HOURS_FROM_NOW} hours" '+%Y-%m-%dT%H:%M:%SZ')" PAYLOAD="$(printf '{"sleep_at":"%s"}' "$SLEEP_AT_UTC")" BODY_FILE="$(mktemp)" trap 'rm -f "$BODY_FILE"' EXIT log "Task started" log "Target sleep_at UTC: ${SLEEP_AT_UTC}" if ! HTTP_CODE="$( curl "${API_BASE_URL}/simulations/${SIMULATION_ID}/" \ --silent \ --show-error \ --location \ --connect-timeout 10 \ --max-time 30 \ --retry 2 \ --retry-delay 2 \ --output "$BODY_FILE" \ --write-out '%{http_code}' \ --request PATCH \ --header 'accept: application/json, text/plain, */*' \ --header "authorization: Bearer ${NVIDIA_API_KEY}" \ --header 'content-type: application/json' \ --data-raw "$PAYLOAD" )"; then log "ERROR: curl request failed" log "Response body:" cat "$BODY_FILE" exit 1 fi if [[ "$HTTP_CODE" =~ ^2[0-9]{2}$ ]]; then RETURNED_SLEEP_AT="$(extract_sleep_at "$BODY_FILE")" if [[ -n "$RETURNED_SLEEP_AT" ]]; then LOCAL_TIME="$(date -d "$RETURNED_SLEEP_AT" '+%Y-%m-%d %H:%M:%S %Z')" log "SUCCESS: sleep_at updated to ${LOCAL_TIME}" else log "SUCCESS: Request completed, but sleep_at was not found in response" log "Response body:" cat "$BODY_FILE" fi else log "ERROR: Request failed with HTTP status code: ${HTTP_CODE}" log "Response body:" cat "$BODY_FILE" exit 1 fi log "Task finished" 使用方法 export NVIDIA_API_KEY="nvapi_xxxxxxxxxxxxxxxxxxxxx" export SIMULATION_ID="820b1c6a-aaaa-bbbb-cccc-879e4511dddd" bash update_sleep_time.sh 1 个帖子 - 1 位参与者 阅读完整话题
#!/usr/bin/env node 'use strict'; const crypto = require('crypto'); const fs = require('fs'); const path = require('path'); /** * 完整的单文件mtgsig纯算离线签名器 * 支持离线生成mtgsig签名,使用预设的profile参数 */ // ============= 基础MD5和XOR工具 ============= function md5Hex(input) { return crypto.createHash('md5').update(input).digest('hex'); } function xorHex(buffer, xorKeyHex) { const xorKey = Buffer.from(xorKeyHex, 'hex'); const out = Buffer.alloc(16); for (let i = 0; i < 16; i++) { out[i] = buffer[i] ^ xorKey[i]; } return out.toString('hex'); } function getSaltFromA6(a6) { const s = String(a6 || ''); if (!s.startsWith('h1.9') || s.length < 10) { throw new Error('Invalid a6 payload: expected prefix h1.9 and at least 6 salt chars'); } return s.slice(4, 10); } // ============= A3生成(从WEBDFPID) ============= function deriveA3FromWebdfpid(webdfpid) { const s = String(webdfpid || '').trim(); if (!s) { return ''; } return s.split('-')[0] || ''; } function parseCookieHeader(cookieHeader) { if (!cookieHeader) { return {}; } return String(cookieHeader) .split(';') .map((part) => part.trim()) .filter(Boolean) .reduce((cookies, part) => { const idx = part.indexOf('='); if (idx === -1) { return cookies; } const key = part.slice(0, idx).trim(); const value = part.slice(idx + 1).trim(); if (key) { cookies[key] = value; } return cookies; }, {}); } function pickCookieHeader(input) { if (!input) { return ''; } return input.cookie || input.Cookie || (input.headers && (input.headers.Cookie || input.headers.cookie)) || ''; } function resolveA3(input = {}) { if (input.a3) { return String(input.a3); } const cookies = parseCookieHeader(pickCookieHeader(input)); return deriveA3FromWebdfpid(input.webdfpid || input.dfpid || cookies.WEBDFPID); } // ============= A8生成(核心签名) ============= function generateA8({ a6, timestamp, xorKeyHex, suffix = '2' }) { const salt = getSaltFromA6(a6); const input = `h1.9${salt}${String(timestamp)}${suffix}`; const digest = crypto.createHash('md5').update(input).digest(); return xorHex(digest, xorKeyHex); } // ============= A6Key生成 ============= function generateA6Key(a8, a9, a10) { return md5Hex(`${a8}${a9}${a10}`); } // ============= D1生成 ============= function generateD1({ d1, sessionId, payload }) { if (d1 && typeof d1 === 'string' && d1.length === 32) { return d1; } if (sessionId) { return md5Hex(String(sessionId)); } return md5Hex(String(payload || '')); } // ============= A5生成(假设使用默认值或提供) ============= function generateA5({ a5, timestamp }) { if (a5) { return String(a5); } // 如果没有提供,返回空白或使用placeholder return ''; } // ============= 默认Profile(从浏览器捕获) ============= const DEFAULT_PROFILE = { a9: '4.2.0,7,39', a10: '10', a8Suffix: '2', xorKeyHex: '19f02f45fb1dee6ce3e613b8aefd6d13', // 从latest_request_20260420.json推导 description: 'Default MTGSig profile for offline signing' }; // ============= 签名生成器 ============= function createOfflineMtgsigSigner(profile = {}) { const resolvedProfile = { ...DEFAULT_PROFILE, ...profile }; function sign(request = {}, options = {}) { const timestamp = options.clock || request.a2 || request.timestamp || Date.now(); const a9 = options.a9 || request.a9 || resolvedProfile.a9; const a10 = options.a10 || request.a10 || resolvedProfile.a10; const suffix = options.suffix || resolvedProfile.a8Suffix; // 需要的数据:a6payload或从请求推导 const a6 = request.a6 || request.payload; if (!a6) { throw new Error('Missing a6 payload in request or profile'); } // 生成各个字段 const a8 = generateA8({ a6, timestamp, xorKeyHex: resolvedProfile.xorKeyHex, suffix }); const a3 = resolveA3(request); const d1 = generateD1({ d1: request.d1, sessionId: request.sessionId || request.arg23, payload: a6 }); const a6Key = generateA6Key(a8, a9, a10); const a5 = generateA5({ a5: request.a5, timestamp }); const a1 = '1.2'; const a2 = String(timestamp); return { a1, a2, a3, a5, a6, a8, a9, a10, d1, a6Key, x0: 4 // 固定值 }; } return { sign }; } // ============= 使用工具和CLI ============= function loadJsonFile(filePath) { if (!filePath) { return null; } try { const content = fs.readFileSync(path.resolve(filePath), 'utf8'); return JSON.parse(content); } catch (err) { console.error(`Failed to load ${filePath}:`, err.message); return null; } } function normalizeInput(input) { // 支持多种输入格式 if (typeof input === 'object' && input.request) { return input.request; } return input || {}; } function main() { const args = process.argv.slice(2); const requestPath = args[0]; const profilePath = args[1]; // 如果没有参数,显示帮助和演示 if (!requestPath) { console.log('══════════════════════════════════════════════════════'); console.log(' mtgsig 离线签名生成器'); console.log('══════════════════════════════════════════════════════'); console.log(''); console.log('用法:'); console.log(' node mtgsig_pure_offline_signer.js [request.json] [profile.json]'); console.log(''); console.log('示例 1 - 使用默认参数(旧版本 4.2.0,7,39):'); console.log(' node mtgsig_pure_offline_signer.js request.json'); console.log(''); console.log('示例 2 - 使用新版本参数(4.2.0,7,8):'); console.log(' node mtgsig_pure_offline_signer.js request.json new_version_profile.json'); console.log(''); console.log('request.json 格式:'); console.log(JSON.stringify({ a2: '当前时间戳(毫秒),如: ' + Date.now(), a6: 'h1.9HK1PkF...(真实的payload)', a3: '372887v7w5yu5282067xww2y1463u8wy80yw0z8xu4z9795881u44vw7', webdfpid: '372887v7w5yu5282067xww2y1463u8wy80yw0z8xu4z9795881u44vw7-...' }, null, 2)); console.log(''); console.log('══════════════════════════════════════════════════════'); console.log('执行演示(使用测试数据):'); console.log('══════════════════════════════════════════════════════'); console.log(''); // 演示模式:使用测试数据 const demoProfile = { a9: '4.2.0,7,8', a10: '98', a8Suffix: '2', xorKeyHex: 'b5ba5e10d16d19d1f2858b6497caabdd' }; const demoRequest = { a2: Date.now(), // 使用当前时间戳而不是写死的值 a6: 'h1.9HK1PkFlf4Ob8girMsbirMgPXRSgRpTkkG6ek+9XOfrTyBfz/ElmPja0cIA5BI+MVJTPmY38oUCtvWO2Caf4Eu9TsvpzGWF1/sc0go/luDfjsSIp8WN3Ngl6rBYvMeOggErpTlqvfDmGOpZ2wc+hVEHJxt5Q2kKZnPxI8E0IIdELX4+gNL0a4AF5p76g2Wn+bBLVnpvytVNKpqL/Lfr3y2Mk0asGbuqHNzmV3ivHSxnNui3ltOUB7HUGQYhMonCY0kzHlNGhCbTw3/7DQvQgck4UERlc3UrVukC9cES1kIYjxf52Rj1j4V0kfo1cf9OnWYRd9fCWmgXOIoJi5J9Da2+6R+pUtNhnnAkdgxVWWuQGieJQAOFStvImm6qjKvgPpCmBalIVenyKm79g1e6nF5w==', a3: '372887v7w5yu5282067xww2y1463u8wy80yw0z8xu4z9795881u44vw7', webdfpid: '372887v7w5yu5282067xww2y1463u8wy80yw0z8xu4z9795881u44vw7-1776843046392-1768882819070QUEUOWCfd79fef3d01d5e9aadc18ccd4d0c95072412' }; console.log('📋 演示配置 (新版本):'); console.log(` a9: ${demoProfile.a9}`); console.log(` a10: ${demoProfile.a10}`); console.log(` xorKeyHex: ${demoProfile.xorKeyHex}`); console.log(''); console.log('📋 演示请求数据:'); console.log(` timestamp: ${demoRequest.a2}`); console.log(` a3: ${demoRequest.a3.substring(0, 30)}...`); console.log(''); const signer = createOfflineMtgsigSigner(demoProfile); try { const signature = signer.sign(demoRequest); console.log('✅ 生成成功!'); console.log(''); console.log('📤 生成的签名:'); console.log(JSON.stringify(signature, null, 2)); console.log(''); console.log(`✓ a8 (关键签名): ${signature.a8}`); console.log(`✓ a6Key (验证码): ${signature.a6Key}`); } catch (err) { console.error('❌ 生成失败:', err.message); process.exitCode = 1; } return; } // 加载请求数据 const request = loadJsonFile(requestPath) || {}; console.error(`[INFO] Loaded request from: ${requestPath}`); // 加载自定义profile let customProfile = null; if (profilePath) { customProfile = loadJsonFile(profilePath); console.error(`[INFO] Loaded profile from: ${profilePath}`); } // 如果输入JSON包含request字段,使用它 const normalizedRequest = normalizeInput(request); // 创建签名器 const signer = createOfflineMtgsigSigner(customProfile); // 生成签名 try { const signature = signer.sign(normalizedRequest); console.log(JSON.stringify(signature, null, 2)); } catch (err) { console.error('[ERROR]', err.message); process.exitCode = 1; } } // ============= 导出 ============= if (require.main === module) { main(); } module.exports = { md5Hex, xorHex, getSaltFromA6, generateA8, generateA6Key, generateD1, generateA5, resolveA3, createOfflineMtgsigSigner, DEFAULT_PROFILE }; 大佬勿喷,AI撕的“纯算”,大家参考,我调用了一下没问题 2 个帖子 - 2 位参与者 阅读完整话题