🚀 快速导航
如果你是品牌方:
如果你是开发者:
如果你是用户:
📖 完整目录
📘 基础介绍
🔧 核心技术
- 🔑 核心合约体系
- S11eCore - 协议入口(含 Profile 创建费用机制)
- S11eProfile - 档案管理
- ERC6551Registry - Token Bound Account
- S11eProfileFactory - 工厂合约
- 💎 资产体系
- PassCard (ERC-721) ✅
- DigitalPoints (ERC-20) ✅
- Badge (ERC-1155) ✅
- POAP (ERC-1155, Soulbound) ✅
- Ticket (ERC-721) ✅
- PFP (ERC-721) ⏳
- 💰 经济模型 ⭐ 新增
- s11e Token 经济
- 协议国库地址机制 ⭐ 新增
- 配置更新机制 ⭐ 新增
- 品牌积分经济模型
- 会员权益经济模型
- 资产流转经济模型
- 🎨 主要功能模块
📚 使用指南
- 📖 品牌使用指南 ⭐ 推荐
- 完整使用流程(5步完成)
- 详细操作步骤
- 品牌使用案例
- 🚀 应用场景 ⭐ 新增详细示例
- 实际应用示例(时尚品牌完整流程)
- 多种行业场景案例
- TBA 资产管理流程
- 🎨 前端集成指南 ⭐ 推荐
- Wagmi + React 完整示例
- 合约交互最佳实践
- 错误处理和交易通知
🚀 部署与测试
- 🛠️ 技术栈
- 🌐 Sepolia 测试网部署
- 📜 脚本使用指南 ⭐ 新增
- 📊 项目现状
- ❓ 常见问题(FAQ)
- 💰 成本分析与优化 ⭐ 新增
- 🎯 最佳实践汇总 ⭐ 新增
- 🔍 与其他协议对比 ⭐ 新增
- 🛠️ 故障排除详细指南 ⭐ 新增
- 📈 性能基准测试 ⭐ 新增
🔍 深入了解
⚡ 快速开始(2分钟速览)
# 1️⃣ 克隆仓库
git clone https://github.com/s11e-protocol/contracts.git && cd s11e-protocol
# 2️⃣ 安装依赖
npm install
# 3️⃣ 编译合约
npm run compile
# 4️⃣ 运行测试
npm test
# 5️⃣ 部署到 Sepolia(需要配置 .env)
npx hardhat run scripts/deploy-core.js --network sepolia
✅ 已部署合约地址(Sepolia):
- S11eCore:
0x68F828b50A78b4Bf5C0B181B0CCfE5D850f2105E - 完整地址列表 → 跳转到部署章节
- 功能状态: ✅ 所有核心功能已实现并测试通过
⚡ 核心亮点:
- ✅ 配置更新机制 - 支持动态调整费用Token、费用金额、国库地址
- ✅ 费用Token验证 - 自动验证ERC20合约有效性,防止配置错误
- ✅ ERC6551集成 - NFT可持有资产,支持完整会员体系
- ✅ 多资产支持 - PassCard、积分、徽章、POAP、门票等6种资产类型
🎯 协议定位
S11e Protocol 是一个web3品牌 RWA(Real World Assets)智能合约协议,专注于构建 Web3 品牌基础设施层。它为品牌和个人提供了一套完整的去中心化身份和数字资产管理解决方案。
🌟 品牌愿景与使命
品牌正在经历一场不可避免的价值重构
当今的品牌世界正在被三股力量同时推动:
- 数字化重塑商业运行逻辑:品牌与用户的互动方式发生根本性变化
- 消费者主导权全面增强:用户不再是被动的接受者,而是主动的参与者
- 共创经济正在取代中心化的品牌叙事:社区共创成为品牌价值的新来源
然而,尽管品牌在数字世界中与用户互动更频繁、更深入,它们的价值依旧由少数企业占有。用户创造流量,却无法拥有价值;社区贡献内容,却无法分享红利;品牌依然是企业的"私有资产"。
为什么?
因为品牌缺乏一种"可证明的价值结构"。
在传统体系里,品牌价值是一种模糊的资产——无法确权、无法拆分、无法分配、更无法在多方之间公平流动。
这正是 Web3 品牌要解决的根本问题:让价值回到创造价值的人手中。
什么才是真正的 Web3 品牌?
真正的 Web3 品牌,必须具备以下三个核心特征:
-
品牌是可确权的资产,而不是模糊估值
- 品牌的价值来自真实世界行为,包括消费、传播、运营、共创,而不是由企业单方面定义。
-
品牌由所有贡献者共同塑造,而非单边运营
- 包括用户、粉丝、创作者、商户、流量主、品牌方、社区治理者。
-
品牌价值能够公平分配,而不是中心化占有
- 贡献行为产生权益,权益随品牌增长而增值。
一句话总结:
Web3 品牌 = 一个由真实贡献驱动、由链上资产承载、由社区共同拥有的价值网络。
S11e Protocol 的使命
S11e Protocol 不是应用、不是工具、不是某个 SaaS 系统。
它是一种重新定义品牌价值生成、确权、分配、治理方式的底层协议。
一句话定义:
S11e Protocol 是一个面向 Web3 品牌与社区的 RWA 基础设施协议,用来将品牌真实世界价值转化为可信的链上资产,并通过智能合约实现生态价值的自动分配与治理。
核心理念:
- ✅ 任何真实贡献都应该拥有"可验证的价值"
- ✅ 任何品牌增长都应该回到贡献者手中
- ✅ 品牌应该是社区共同拥有的数字资产,而不是资本的私有权益
核心愿景
用智能合约重新定义品牌资产,用区块链技术让品牌数字资产管理更简单、更透明、更可信
🏗️ 架构设计
三层模块化架构
┌────────────────────────────────────────────────┐
│ 应用层 (DApp/前端) │
│ 品牌创建 | 资产发行 | 成员管理 | 权益管理 │
└────────────────────────────────────────────────┘
↕
┌────────────────────────────────────────────────┐
│ 业务逻辑层 (Wrappers - 装饰器合约) │
│ 配置管理 | 资产管理 | 激励分发 | 权限控制 │
└────────────────────────────────────────────────┘
↕
┌────────────────────────────────────────────────┐
│ 数据存储层 (Extensions - 插件合约) │
│ 国库管理 | 金库管理 | 资产记录 | 成员数据 │
└────────────────────────────────────────────────┘
↕
┌────────────────────────────────────────────────┐
│ 核心层 (Core Contracts) │
│ S11eCore | S11eProfile | ERC6551Registry │
└────────────────────────────────────────────────┘
详细架构图
┌────────────────────────────────────────────────┐
│ 业务逻辑层 (Wrappers) │
│ ✅ AssetFactory (资产管理) │
│ ✅ Issuers + Factories (配置管理) │
│ ✅ PointsExchange (激励分发) │
└────────────────────────────────────────────────┘
↕
┌────────────────────────────────────────────────┐
│ 数据存储层 (Extensions) │
│ ✅ Profile Assets (资产记录) │
│ ✅ Token Implementations (Token 实现) │
│ ✅ Bonding Curve (工具类) │
└────────────────────────────────────────────────┘
↕
┌────────────────────────────────────────────────┐
│ 核心层 (Core) │
│ ✅ S11eCore (核心入口) │
│ ✅ S11eProfile (Profile 实例) │
│ ✅ S11eProfileFactory (Profile 工厂) │
│ ✅ S11eToken (生态通证) │
│ ✅ ERC6551Registry (TBA 注册表) │
└────────────────────────────────────────────────┘
设计理念
S11e Protocol 遵循 wrapper-extension-core 分层架构:
-
核心层(Core):提供基础功能和状态管理
- S11eCore:协议入口,管理 Profile 创建和配置
- S11eProfile:品牌/个人的数字身份实例
- S11eProfileFactory:使用克隆模式低成本创建 Profile
- S11eToken:生态通证,独立部署
- ERC6551Registry:Token Bound Account 注册表
-
扩展层(Extensions):可插拔的数据存储模块
- Profile Assets:PassCard、DigitalPoints、Badge、POAP、Ticket 等资产合约
- Token Implementations:标准 ERC-20/721/1155 实现
- Bonding Curve:联合曲线工具类
-
业务层(Wrappers):灵活的业务逻辑实现
- AssetFactory:统一资产创建入口,委托给 Issuers
- Issuers + Factories:各类资产的创建器和工厂
- PointsExchange:品牌积分与 S11e Token 兑换
✨ 核心特点
1. 模块化设计 🧩
特性:
- 功能独立封装,低耦合
- 品牌可按需组合功能模块
- 降低系统复杂度,易于维护
优势:
- ✅ 每个模块独立开发和测试
- ✅ 支持第三方开发自定义模块
- ✅ 模块可热插拔,不影响其他功能
2. 可升级性 🔄
技术方案:
- 基于 OpenZeppelin 透明代理模式
- 非结构化存储代理
- 模块版本管理系统
- 紧急回滚机制
升级流程:
提议升级 → 版本验证 → 管理员审核 → 时间锁 → 执行升级
优势:
- ✅ 修复漏洞而不丢失数据
- ✅ 持续迭代优化功能
- ✅ 保持合约地址不变
- ✅ 支持紧急回滚
3. 低成本部署 💰
技术实现:
- 采用 EIP-1167 最小代理合约(Minimal Proxy / Clone Factory)
- 所有品牌共享同一套实现合约
成本对比:
| 部署方式 | Gas 消耗 | 节省比例 |
|---|---|---|
| 直接部署 | ~520,000 | - |
| 克隆模式 | ~70,000 | 87% ✅ |
4. 安全优先 🛡️
安全措施:
| 安全机制 | 实现方案 | 状态 |
|---|---|---|
| 标准库 | OpenZeppelin 5.4.0 | ✅ |
| 权限控制 | AccessControl (RBAC) | ✅ |
| 防重入 | ReentrancyGuard | ✅ |
| 紧急暂停 | Pausable | ✅ |
| 溢出保护 | Solidity 0.8.20+ | ✅ |
| 测试覆盖 | 84% (核心模块) | ✅ |
🔑 核心合约体系
1. S11eCore - 协议入口
职责:协议的核心管理器
主要功能:
- createProfile(ProfileStruct) → address
// 创建品牌或个人档案
- getProfileAddressByIndex(uint256) → address
// 根据索引获取 Profile 地址
- setS11eProfileFactory(address)
// 设置工厂合约(仅管理员)
构造参数:
_baseURI: 基础 URI,用于 NFT 元数据_erc6551Registry: ERC6551 注册表地址_treasury: 协议国库地址(接收费用)_profileCreationFeeToken: Profile 创建费用 Token 地址(可以是 S11E 或其他 ERC20 Token)_profileCreationFee: Profile 创建费用金额
费用机制:
- ✅ Profile 创建费用:品牌创建 Profile 时需要支付费用(可配置为 S11E Token 或其他 Token)
- ✅ 灵活配置:支持多种 Token 作为费用支付方式,也可以设置为免费(
feeToken = address(0)) - ✅ 费用流向:所有费用自动转入协议国库地址(
treasury) - ✅ 动态调整:管理员可以动态调整费用金额和费用 Token
- ✅ Token验证:✅ 已实现 - 自动验证费用Token是否为有效的ERC20合约(见配置更新机制)
费用设置示例:
// 查询当前费用配置
uint256 fee = s11eCore.getProfileCreationFee();
address feeToken = s11eCore.getProfileCreationFeeToken();
// 管理员可以动态调整费用
s11eCore.setProfileCreationFee(newFee); // 调整费用金额
s11eCore.setProfileCreationFeeToken(newToken); // 更换费用 Token
s11eCore.setTreasury(newTreasury); // 更新国库地址
费用配置说明:
| 场景 | 推荐费用 | 说明 |
|---|---|---|
| 测试网 | 0 或 100 S11E | 测试环境可免费或低费用 |
| 主网初期 | 1000 S11E | 约 $10-50(取决于 S11E 价格) |
| 主网成熟期 | 5000+ S11E | 根据市场需求调整 |
使用流程:
// 1. 检查费用配置
const fee = await s11eCore.getProfileCreationFee();
const feeToken = await s11eCore.getProfileCreationFeeToken();
// 2. 检查用户余额和授权
const balance = await feeToken.balanceOf(userAddress);
const allowance = await feeToken.allowance(userAddress, s11eCoreAddress);
if (balance < fee || allowance < fee) {
// 需要先授权
await feeToken.approve(s11eCoreAddress, fee);
}
// 3. 创建 Profile(会自动扣除费用)
const profileStruct = {
profileType: 'BRAND',
name: 'My Brand',
symbol: 'MB',
// ... 其他参数
};
const tx = await s11eCore.createProfile(profileStruct);
await tx.wait();
// ✅ 费用已自动转入国库
2. S11eProfile - 档案管理
职责:品牌/个人的数字身份和资产管理
⚠️ 重要说明:Profile 不是 NFT
S11eProfile ≠ NFT
S11eProfile = 独立的智能合约实例
架构关系:
S11eCore(入口)
↓ 调用 createProfile()
S11eProfileFactory(工厂)
↓ 使用 EIP-1167 克隆
S11eProfile(合约实例)← 这是品牌的"管理中心",不是 NFT
↓ 调用 issueAsset() 发行资产
PassCard / DigitalPoints / Badge 等 ← 这些才是 NFT/Token
Profile vs 资产的区别:
| 对比项 | S11eProfile | PassCard/Badge 等 |
|---|---|---|
| 类型 | 智能合约实例 | NFT/Token |
| 创建方式 | 工厂克隆 (EIP-1167) | Profile.issueAsset() |
| 可转移性 | ❌ 不可转移(合约地址固定) | ✅ 可转移(NFT 标准) |
| 功能 | 管理品牌、创建资产、管理成员 | 代表会员卡、积分、徽章等 |
| 持有者 | 品牌所有者控制 | 用户持有 |
| 地址 | 合约部署地址 | Token 合约地址 |
主要功能:
// 资产发行 ✅ 已实现
- issueAsset(AssetsStruct) → address
// 发行数字资产
// ✅ 已支持:PASSCARD, DP, BADGE, POAP, TICKET
// ⚠️ PFP 待集成
// 资产注册 ✅ 已实现
- register(AssetsStruct) → void
// 注册外部资产
// 社交功能 ✅ 已实现
- follow() → void
// 关注此 Profile(含黑名单检查)
- follow(address) → void
// 推荐他人关注
// 成员管理 ✅ 已实现
- memberList() → address[]
// 获取所有成员
- addBlacklist(address) → void ✅ 已实现
// 添加黑名单(仅 owner)
- removeBlacklist(address) → void ✅ 已实现
// 移除黑名单(仅 owner)
- isBlacklisted(address) → bool ✅ 已实现
// 检查黑名单状态
- batchAddBlacklist(address[]) → void ✅ 已实现
// 批量添加黑名单
支持的资产类型(按 assetsType 编号):
- 💳 PASSCARD (type=1) - 会员卡 NFT(ERC-721)✅ 已实现 + ERC6551
- 💰 DP (type=2) - 数字积分(Digital Points, ERC-20)✅ 已实现
- 🖼️ PFP (type=3) - 头像 NFT(ERC-721)⏳ 计划中
- 🏅 BADGE (type=4) - 数字徽章(ERC-1155)✅ 已实现
- 🎖️ POAP (type=5) - 出勤证明(ERC-1155, Soulbound)✅ 已实现
- 🎫 TICKET (type=6) - 数字门票(ERC-721)✅ 已实现 + ERC6551
- 🖼️ ** CERTIFICATE** (type=7) - 证书(ERC-721)⏳ 计划中
💡 提示:PassCard 和 Ticket 支持 ERC6551,可以为NFT创建可编程账户,持有其他资产。
3. ERC6551Registry - Token Bound Account
职责:为 NFT 创建可编程账户
核心功能:
// 创建账户(指定链ID)
- createAccount(
uint256 chainId,
address tokenContract,
uint256 tokenId,
uint256 salt
) → address
// 创建账户(当前链)
- createAccount(
address tokenContract,
uint256 tokenId,
uint256 salt
) → address
// 查询账户地址
- account(
address tokenContract,
uint256 tokenId,
uint256 salt
) → address
工作流程:
1. 用户持有 NFT (ERC-721)
↓
2. 调用 createAccount 为 NFT 创建账户
↓
3. 返回 Token Bound Account 地址
↓
4. NFT 所有者可通过账户执行操作
创新功能:
- ✅ NFT 不仅是图片,还是一个账户
- ✅ NFT 可以持有资产和历史记录
- ✅ NFT 所有权 = 账户控制权
- ✅ 账户可执行任意合约调用
4. S11eProfileFactory - 工厂合约
职责:使用克隆模式低成本创建 Profile
主要功能:
- createProfile(ProfileStruct, address) → void
// 标准方式创建 Profile
- cloneProfile(ProfileStruct, address) → void
// 克隆模式创建(节省 Gas)
- getProfileAddressByIndex(uint256) → address
// 根据索引获取 Profile 地址
实现状态:
- ✅ 已完成:
createProfile()和cloneProfile()函数已实现 - ✅ 标准模式: 使用
createProfile()直接部署新合约 - ✅ 克隆模式: 使用
cloneProfile()节省 87% Gas(EIP-1167) - ✅ 批量操作: 使用
batchCloneProfiles()批量创建
💎 资产体系
国库(Treasury)- ERC20 资产
管理的通证类型:
1. s11e Token(火源) - 生态通证
💡 重要说明:S11eToken 是独立的 Token 合约,可以单独部署和使用,不依赖 S11eCore 或其他协议合约。
特性:
- 名称:S11e Protocol Token
- 符号:S11E
- 总量:210,000,000 (2.1亿)
- 标准:ERC-20 + AccessControl + Pausable
- 功能:会员权益、治理投票、品牌积分兑换
- 独立性:可以独立部署,不依赖协议其他部分
核心功能:
mint(address, uint256, string)- 铸造代币(需 MINTER_ROLE,带原因记录)batchMint()- 批量铸造(用于初始分配)batchTransfer()- 批量转账(用于空投)pause()/unpause()- 紧急暂停机制
合约地址: contracts/core/S11eToken.sol ✅ 已实现
独立性说明:
- ✅ 独立部署:S11eToken 可以独立部署,不依赖 S11eCore
- ✅ 独立管理:S11eToken 是独立的 Token 合约,与协议国库地址(
S11eCore.treasury)没有直接关系 - ✅ 可选集成:可以作为 Profile 创建费用 Token(通过 S11eCore 配置),也可以完全不使用
用途:
- 💳 会员权益:不同等级会员享受不同权益(通过其他合约实现)
- 💰 激励:奖励社区贡献者(通过 mint 实现)
- 🗳️ 治理投票:持有 Token 参与协议治理(通过其他合约实现)
- 💎 Profile 创建费用:可选作为 Profile 创建费用 Token(通过 S11eCore 配置)
💰 经济模型
s11e Token 经济
Token 分配方案
总量: 210,000,000 S11E (2.1亿)
┌─────────────────────────────────────────┐
│ s11e Token 分配方案 ( 2.1亿总量) │
├─────────────────────────────────────────┤
│ 30% 社区激励 300,000,000 S11E │
│ 25% 生态发展 250,000,000 S11E │
│ 20% 团队 200,000,000 S11E │
│ ├─ 4年线性解锁 │
│ 15% 早期投资者 150,000,000 S11E │
│ ├─ 2年线性解锁 │
│ 10% 国库储备 100,000,000 S11E │
└─────────────────────────────────────────┘
详细分配:
| 分配对象 | 比例 | 数量 | 解锁机制 | 用途 |
|---|---|---|---|---|
| 社区激励 | 30% | 300,000,000 | 逐步释放 | 空投、活动奖励、贡献者激励 |
| 生态发展 | 25% | 250,000,000 | 按需释放 | 品牌合作、生态建设、合作伙伴 |
| 团队 | 20% | 200,000,000 | 4年线性解锁 | 团队激励,每月解锁 1/48 |
| 早期投资者 | 15% | 150,000,000 | 2年线性解锁 | 早期支持者,每月解锁 1/24 |
| 国库储备 | 10% | 100,000,000 | 协议治理 | 应急储备、协议发展基金 |
Token 使用场景
1. 会员权益
不同等级会员享受不同 s11e Token 奖励:
- 钻石会员:每月空投 100 s11e
- 黄金会员:每月空投 50 s11e
- 白银会员:每月空投 20 s11e
2. 品牌积分兑换
品牌积分可以与 s11e Token 双向兑换:
- 100 品牌积分 = 1 s11e Token
- 兑换比例可配置
3. 治理投票
持有 s11e Token 可参与协议治理:
- 提案投票权:按持币量计算
- 提案创建:需要持有 10000+ s11e
- 社区决策:重大变更需投票通过
经济机制
Token 使用流向:
- 💰 品牌积分兑换:通过 PointsExchange 合约双向兑换
- 💰 治理参与:持有 Token 参与协议治理投票
- 💰 激励机制:通过 mint 奖励社区贡献者
价值机制:
- 💎 总量恒定:2.1 亿总量,不可增发
- 💎 分配方案:10% 初始分配作为国库储备(100,000,000 S11E)
- 💎 独立管理:S11eToken 是独立的 Token 合约,与协议国库地址没有直接关系
💡 提示:S11eToken 是独立的 Token 合约,可以单独部署和使用,不依赖 S11eCore 或其他协议合约。可以作为 Profile 创建费用 Token 使用,也可以完全不使用。
协议国库地址机制
国库地址定义
协议中有 一个协议国库地址,用于接收协议级别的费用:
S11eCore.treasury - 协议国库地址
contract S11eCore {
address public treasury; // 协议国库地址(可接收各种 Token)
constructor(
string memory _baseURI,
address _erc6551Registry,
address _treasury, // 协议国库地址
address _profileCreationFeeToken,
uint256 _profileCreationFee
) {
treasury = _treasury;
// ...
}
// Profile 创建费用:转入协议国库
function createProfile(...) external {
profileCreationFeeToken.safeTransferFrom(_msgSender(), treasury, profileCreationFee);
}
}
用途:
- ✅ 接收 Profile 创建费用(
createProfile()) - ✅ 可以接收 S11E Token 和其他 Token(ETH、USDT、USDC 等)
- ✅ 协议级别的国库地址,在部署时统一设置
费用来源:
- Profile 创建费用:品牌创建 Profile 时支付的 Token
部署配置:
// 从环境变量读取协议国库地址
const TREASURY_ADDRESS = process.env.TREASURY_ADDRESS;
// 部署 S11eCore(协议国库地址)
const s11eCore = await S11eCore.deploy(
baseURI,
erc6551RegistryAddress,
TREASURY_ADDRESS, // 协议国库地址
profileCreationFeeToken, // 可以是 S11E 或其他 Token
profileCreationFee
);
// S11eToken 独立部署(不依赖协议国库)
const s11eToken = await S11eToken.deploy(
adminAddress // 仅需管理员地址
);
费用流向图:
┌─────────────────────────────────────────┐
│ 用户支付费用 │
├─────────────────────────────────────────┤
│ Profile 创建费用 → S11eCore.treasury │
│ (协议国库地址,可接收各种 Token) │
└───────────────────┬─────────────────────┘
│
▼
┌───────────────────────┐
│ 协议国库地址 │
│ (TREASURY_ADDRESS) │
│ │
│ • 接收各种 Token │
│ • 协议治理和发展基金 │
│ • 应急储备 │
└───────────────────────┘
💡 注意:S11eToken 是独立的 Token 合约,不涉及国库地址
配置更新机制
更新机制总览
S11e Protocol 支持灵活的动态配置更新,管理员可以根据协议发展需要调整关键参数。所有更新操作都需要 DEFAULT_ADMIN_ROLE 权限。
| 项目 | 合约 | 是否可更新 | 更新函数 | 权限要求 |
|---|---|---|---|---|
| 协议国库地址 | S11eCore | ✅ 是 | setTreasury() | DEFAULT_ADMIN_ROLE |
| 费用Token地址 | S11eCore | ✅ 是(可修改) | setProfileCreationFeeToken() | DEFAULT_ADMIN_ROLE |
| 费用金额 | S11eCore | ✅ 是 | setProfileCreationFee() | DEFAULT_ADMIN_ROLE |
| Profile Owner | S11eProfile | ✅ 是 | grantRole() / revokeRole() | DEFAULT_ADMIN_ROLE |
1. 国库地址更新
S11eCore.treasury - 协议国库地址
更新函数:
function setTreasury(address _treasury) external onlyRole(DEFAULT_ADMIN_ROLE) {
require(_treasury != address(0), "Treasury cannot be zero address");
address oldTreasury = treasury;
treasury = _treasury;
emit TreasuryUpdated(oldTreasury, _treasury);
}
更新机制:
- ✅ 可更新:管理员可以通过
setTreasury()更新 - ✅ 权限控制:仅
DEFAULT_ADMIN_ROLE可调用 - ✅ 地址验证:不允许设置为
address(0) - ✅ 事件记录:有
TreasuryUpdated事件
使用示例:
// 更新协议国库地址
await s11eCore.setTreasury(newTreasuryAddress);
// 查询当前国库地址
const currentTreasury = await s11eCore.treasury();
⚠️ 安全提醒:
- 国库地址变更属于高风险操作,可能导致资金流向变化
- 建议使用多签钱包作为国库地址
- 变更前务必仔细验证新地址的正确性
- 当前无时间锁机制,变更立即生效
2. 费用Token地址更新 ⭐
S11eCore.profileCreationFeeToken - Profile 创建费用 Token
✅ 重要特性:费用Token地址可以修改,支持灵活切换支付方式
更新函数:
/**
* @notice 设置 Profile 创建费用 Token(仅管理员)
* @dev ✅ 已添加Token验证,确保地址为有效的ERC20合约
* @param _feeToken 新的收费 Token 地址(设置为 address(0) 可禁用收费)
*/
function setProfileCreationFeeToken(address _feeToken) external onlyRole(DEFAULT_ADMIN_ROLE) {
address oldToken = address(profileCreationFeeToken);
if (_feeToken == address(0)) {
// 设置为 address(0) 表示禁用收费
profileCreationFeeToken = IERC20(address(0));
} else {
// ✅ 验证Token是否为有效的ERC20合约
// 验证1: 必须是合约地址(不是EOA)
require(_feeToken.code.length > 0, "Token must be a contract");
// 验证2: 调用 balanceOf 验证ERC20接口
(bool success, bytes memory returnData) = _feeToken.call(
abi.encodeWithSelector(0x70a08231, address(this)) // balanceOf(address)
);
require(success && returnData.length >= 32, "Invalid ERC20 token: balanceOf check failed");
// 验证3: 调用 totalSupply 进一步确认ERC20标准
(success, ) = _feeToken.call(
abi.encodeWithSelector(0x18160ddd) // totalSupply()
);
require(success, "Invalid ERC20 token: totalSupply check failed");
// 验证通过,设置Token地址
profileCreationFeeToken = IERC20(_feeToken);
}
emit ProfileCreationFeeTokenUpdated(oldToken, _feeToken);
}
更新机制:
- ✅ 可更新:管理员可以通过
setProfileCreationFeeToken()更新 - ✅ Token验证:✅ 已实现 - 自动验证是否为有效的ERC20合约
- 检查是否为合约地址(不是EOA)
- 验证
balanceOf()接口 - 验证
totalSupply()接口
- ✅ 支持免费模式:可以设置为
address(0)禁用收费 - ✅ 灵活切换:可以在不同Token之间切换(S11E、USDT、USDC等)
- ✅ 立即生效:变更后立即生效,新创建的Profile将使用新的Token
- ✅ 事件记录:有
ProfileCreationFeeTokenUpdated事件
使用场景:
- 切换支付Token:从 S11E 切换到 USDT
- 启用/禁用收费:设置为
address(0)可免费创建Profile - 支持多Token:根据市场情况灵活选择收费Token
使用示例:
// 切换到 USDT
await s11eCore.setProfileCreationFeeToken(usdtAddress);
// 切换到 S11E Token
await s11eCore.setProfileCreationFeeToken(s11eTokenAddress);
// 禁用收费(免费创建)
await s11eCore.setProfileCreationFeeToken(ethers.ZeroAddress);
// 查询当前费用Token地址
const currentFeeToken = await s11eCore.getProfileCreationFeeToken();
保护机制:
- ✅ 防止设置无效地址导致用户创建Profile失败
- ✅ 防止设置EOA地址(普通账户)作为Token
- ✅ 确保只有实现了ERC20标准的合约才能作为费用Token
3. 费用金额更新
S11eCore.profileCreationFee - Profile 创建费用
更新函数:
function setProfileCreationFee(uint256 _fee) external onlyRole(DEFAULT_ADMIN_ROLE) {
uint256 oldFee = profileCreationFee;
profileCreationFee = _fee;
emit ProfileCreationFeeUpdated(oldFee, _fee);
}
更新机制:
- ✅ 可更新:管理员可以通过
setProfileCreationFee()更新 - ✅ 权限控制:仅
DEFAULT_ADMIN_ROLE可调用 - ✅ 灵活设置:可以设置为任意金额(包括0,免费模式)
- ✅ 事件记录:有
ProfileCreationFeeUpdated事件
使用示例:
// 设置费用为 1000 S11E Token
await s11eCore.setProfileCreationFee(ethers.parseEther("1000"));
// 设置为免费模式
await s11eCore.setProfileCreationFee(0);
// 查询当前费用
const currentFee = await s11eCore.getProfileCreationFee();
⚠️ 注意事项:
- 费用变更立即生效,用户可能不知道费用已变更
- 建议在变更前提前公告,避免影响用户体验
- 费用可以为0(免费模式),但需要确保费用Token也设置为
address(0)
4. Profile Owner 更新
S11eProfile Owner - Profile 所有者
更新机制:
- ✅ 可更新:Profile Owner 拥有
DEFAULT_ADMIN_ROLE,可以使用 OpenZeppelinAccessControl的标准方法更新 - ✅ 标准方法:通过
grantRole()和revokeRole()管理 - ⚠️ 需要手动操作:需要先授予新地址角色,再撤销旧地址角色
更新方式:
// 方式1: 使用 AccessControl 标准方法
// 授予新owner
await profile.grantRole(DEFAULT_ADMIN_ROLE, newOwnerAddress);
// 撤销旧owner(谨慎操作,确保新owner已设置)
await profile.revokeRole(DEFAULT_ADMIN_ROLE, oldOwnerAddress);
⚠️ 安全提醒:
- Owner 变更属于高风险操作,可能导致品牌资产控制权丢失
- 建议先授予新owner角色并验证其权限,再撤销旧owner
- 确保至少保留一个admin角色,避免丢失控制权
- 考虑使用多签钱包作为Profile Owner,提高安全性
更新机制安全性总结
✅ 当前安全措施
-
权限控制
- ✅ 所有更新操作都需要
DEFAULT_ADMIN_ROLE - ✅ 使用 OpenZeppelin AccessControl 标准库
- ✅ 所有更新操作都需要
-
基本验证
- ✅ 国库地址不允许为
address(0) - ✅ 费用Token地址验证:✅ 已实现 - 自动验证ERC20合约
- ✅ 事件记录所有变更
- ✅ 国库地址不允许为
-
权限同步
- ✅ S11eToken.setTreasury() 会自动更新 TREASURY_ROLE
⚠️ 安全建议
-
使用多签钱包
- 建议将
DEFAULT_ADMIN_ROLE授予多签钱包地址(如 Gnosis Safe) - 国库地址也使用多签钱包
- 这样所有关键操作都需要多重签名
- 建议将
-
变更前验证
- 变更国库地址前,务必验证新地址的正确性
- 可以先用小额测试验证地址是否可用
-
变更通知
- 关键参数变更前建议提前公告
- 特别是费用变更,避免用户困惑
-
备份机制
- 保存所有关键配置的备份
- 记录所有变更事件,便于追溯
配置更新最佳实践
// 1. 查询当前配置
const currentTreasury = await s11eCore.treasury();
const currentFeeToken = await s11eCore.getProfileCreationFeeToken();
const currentFee = await s11eCore.getProfileCreationFee();
// 2. 验证新配置
// 如果是更新Token,检查Token地址是否正确
const tokenCode = await ethers.provider.getCode(newTokenAddress);
if (tokenCode === "0x") {
throw new Error("Invalid token address");
}
// 3. 执行更新
await s11eCore.setProfileCreationFeeToken(newTokenAddress);
// 4. 验证更新结果
const updatedFeeToken = await s11eCore.getProfileCreationFeeToken();
console.log("更新成功:", updatedFeeToken === newTokenAddress);
品牌积分经济模型
积分获取方式
┌─────────────────────────────────────┐
│ 积分获取渠道 │
├─────────────────────────────────────┤
│ 🛒 购物返利 消费金额 × 5% │
│ ✅ 完成任务 任务奖励 │
│ 🎯 每日签到 10-50 积分/天 │
│ 👥 邀请好友 100 积分/人 │
│ 💬 社区贡献 按贡献度计算 │
│ 🎁 活动奖励 不定期发放 │
└─────────────────────────────────────┘
积分消耗场景
┌─────────────────────────────────────┐
│ 积分消耗渠道 │
├─────────────────────────────────────┤
│ 💰 兑换商品 积分抵现金 │
│ 🔄 兑换 SE Token 100:1 兑换比例 │
│ 🎫 购买门票 积分抵扣 │
│ 🎁 兑换礼品 积分商城 │
│ ⬆️ 会员升级 积分达标升级 │
└─────────────────────────────────────┘
积分价值机制
兑换比例:
- 品牌积分 ↔ s11e Token: 100:1 (可配置)
- 品牌积分 ↔ 现金: 品牌自定义比例
- 品牌积分 ↔ 商品: 按商品价值计算
流动性支持:
- 品牌可以设置积分池,提供 SE Token 作为流动性
- 支持积分二级市场交易
- 积分可以跨品牌使用(未来功能)
会员权益经济模型
会员等级与权益
┌──────────────────────────────────────────────┐
│ 会员等级权益设计 │
├──────────────────────────────────────────────┤
│ 💎 钻石会员 (VIP) │
│ • 持有 VIP 徽章(Badge ID 4,灵魂绑定) │
│ • 积分余额 >= 10000 │
│ • 权益: │
│ - 专属折扣 20% │
│ - 优先购买权 │
│ - 免费活动门票 │
│ - 空投资格 │
│ - 每月空投 100 SE │
├──────────────────────────────────────────────┤
│ 🥇 黄金会员 │
│ • 持有黄金徽章(Badge ID 3) │
│ • 积分余额 >= 5000 │
│ • 权益: │
│ - 10% 折扣 │
│ - 优先客服 │
│ - 每月空投 50 SE │
├──────────────────────────────────────────────┤
│ 🥈 白银会员 │
│ • 持有白银徽章(Badge ID 2) │
│ • 积分余额 >= 1000 │
│ • 权益: │
│ - 5% 折扣 │
│ - 生日礼物 │
│ - 每月空投 20 SE │
├──────────────────────────────────────────────┤
│ 🥉 青铜会员 │
│ • 持有青铜徽章(Badge ID 1) │
│ • 基础会员权益 │
│ • 权益: │
│ - 基础会员折扣 │
│ - 参与活动资格 │
└──────────────────────────────────────────────┘
权益分配机制
自动升级逻辑:
// 检查用户等级并自动升级
async function checkAndUpgrade(userAddress) {
const pointsBalance = await points.balanceOf(userAddress);
const badgeBalance3 = await badge.balanceOf(userAddress, 3); // 黄金
const badgeBalance4 = await badge.balanceOf(userAddress, 4); // VIP
// 自动升级到黄金会员
if (pointsBalance >= ethers.parseEther('5000') && badgeBalance3 === 0) {
await badge.awardBadge(userAddress, 3, 1);
// 触发升级奖励
await points.mint(userAddress, ethers.parseEther('100')); // 升级奖励
}
// 自动升级到 VIP
if (pointsBalance >= ethers.parseEther('10000') && badgeBalance4 === 0) {
await badge.createBadge('VIP 会员', 5, true, 100);
await badge.awardBadge(userAddress, 4, 1); // VIP 徽章(灵魂绑定)
// 触发 VIP 奖励
await points.mint(userAddress, ethers.parseEther('500')); // VIP 升级奖励
}
}
资产流转经济模型
TBA 资产管理
资产挂载到 TBA:
- ✅ 所有品牌资产统一管理在 PassCard 的 TBA 账户
- ✅ 资产与 PassCard 强绑定
- ✅ NFT 转让时,所有资产自动转移
- ✅ 降低资产丢失风险
资产价值体现:
PassCard NFT 价值 = NFT 本身价值 + TBA 内资产价值
示例:
PassCard #1 价值 = 0.1 ETH (NFT) + 0.15 ETH (TBA资产)
= 0.25 ETH 总价值
二级市场交易
PassCard NFT 交易:
- 💰 支持 OpenSea、Blur 等 NFT 市场
- 💰 自动版税 5% 返还品牌方
- 💰 TBA 内资产随 NFT 一起转让
积分交易:
- 💰 品牌积分可在 DEX 交易
- 💰 支持与 SE Token 直接兑换
- 💰 品牌可设置积分交易手续费
2. 品牌积分 - 自定义积分系统
特性:
- 品牌可自定义积分规则
- 支持与 s11e Token 双向兑换
- 来源可追溯
- 链上透明
兑换机制:
100 积分 = 1 s11e Token(可配置)
3. 其他经济模型
- 联合曲线代币:Bonding Curve 经济模型
- 分红销毁代币:通缩机制
- Internal Tokens:内部流通代币
更多应用场景示例
场景 4: 游戏公会资产管理系统
背景: 游戏公会管理成员游戏资产,记录贡献,分配奖励。
实施方案:
// 1. 创建公会 Profile
await S11eCore.createProfile({
profileType: "BRAND",
name: "GameGuild",
symbol: "GG",
owner: guildOwner
});
// 2. 发行公会会员卡
await profile.issueAsset({ assetsType: 1, name: "Guild Card", supply: 5000 });
// 3. 创建贡献积分系统
await profile.issueAsset({ assetsType: 2, name: "Guild Points", supply: 1000000 });
// 4. 设计贡献徽章
await badge.createBadge('新成员', 1, false, 1000);
await badge.createBadge('活跃成员', 2, false, 500);
await badge.createBadge('核心成员', 3, false, 100);
await badge.createBadge('公会管理员', 5, true, 10); // 灵魂绑定
// 5. 游戏资产分发到 TBA
// - 游戏代币奖励
// - 游戏 NFT 资产
// - 公会贡献记录 POAP
场景 5: 餐饮品牌会员积分系统
背景: 餐饮连锁品牌建立会员积分系统,提升复购率。
实施方案:
// 1. 会员卡系统
// 消费时自动记录到 TBA
await points.mint(tbaAddress, consumptionAmount * 0.05); // 5% 返利
// 2. 积分兑换系统
// 100 积分 = 1 餐券
// 1000 积分 = 1 SE Token
// 3. 生日礼物徽章
await badge.createBadge('生日会员', 3, false, 10000);
// 用户生日时自动发放到 TBA
// 4. 消费里程碑 POAP
await poap.createEvent('消费 10000 元里程碑', milestoneURI);
// 达到消费金额自动发放
金库(Vaults)- NFT 资产
管理的 NFT 类型:
1. POAP - 出席证明
struct POAP {
string eventName;
uint256 eventTime;
string metadata;
}
用途:
- 📅 活动参与证明
- 🎉 里程碑纪念
- 🏆 成就记录
2. SBT - 灵魂绑定代币
// 核心机制:不可转让
function _beforeTokenTransfer(...) {
require(from == address(0), "Soul Bound Token: transfer not allowed");
}
特点:
- 🔐 不可转让
- 👤 身份绑定
- 📝 信誉记录
- ✅ 防止身份交易
应用:
- 品牌身份(S11eIP)
- 个人身份(S11eAvatar)
- 会员资格
- 荣誉证书
3. PFP - 个人头像 NFT
struct BeastAttributes {
uint256 generation; // 世代
uint256 rarity; // 稀有度 (1-5)
uint256 reputationScore; // 信誉分数
uint256 mintTime; // 铸造时间
string metadataURI; // 元数据链接
}
特色:
- 🎨 动态属性(信誉可变)
- 💎 稀有度分级
- 🌟 跨平台身份统一
4. 数字藏品
- 品牌限量 NFT
- 数字艺术品
- 活动纪念品
- 联名款收藏
5. ERC3525 - 半同质化代币
- 债券通证化
- 资产分割
- 收益分配
🎨 主要功能模块
1. 身份系统
S11eIP(品牌身份)
数据结构:
struct BrandIdentity {
string brandName; // 品牌名称
string description; // 品牌描述
string metadataURI; // 元数据URI
address brandOwner; // 品牌所有者
uint256 createdAt; // 创建时间
bool isVerified; // 官方验证
}
特性:
- 🔐 SBT 设计:不可转让,防止身份交易
- ✅ 官方验证:防止山寨品牌
- 📝 链上记录:品牌信息永久可查
- 🔒 唯一性:一个地址只能注册一个品牌
主要功能:
- createBrand(address, string, string, string)
// 创建品牌身份
- verifyBrand(uint256)
// 官方验证(需管理员权限)
- getBrandInfo(address) → BrandIdentity
// 查询品牌信息
S11eAvatar(个人身份)
数据结构:
struct Avatar {
string username;
string metadataURI;
uint256 contributionScore; // 贡献值
uint256 createdAt;
mapping(bytes32 => uint256) achievements; // 成就记录
}
特性:
- 📊 信誉积累:记录用户贡献
- 🏆 成就系统:解锁荣誉徽章
- 🔗 链上信誉:跨平台身份统一
- 💎 动态成长:随用户活动更新
2. 积分系统(Point Module)
经济模型:
struct PointAccount {
uint256 balance; // 当前余额
uint256 totalEarned; // 累计获得
uint256 totalSpent; // 累计消费
mapping(bytes32 => uint256) earnHistory; // 来源追踪
}
核心功能:
// 赚取积分
- earnPoints(address, uint256, bytes32)
// 用户行为激励
// 消费积分
- spendPoints(address, uint256)
// 兑换商品/服务
// SE 兑换
- convertToSE()
// 积分转换为 s11e Token
兑换比例:
默认:100 积分 = 1 s11e Token
品牌可自定义比例
特点:
- ✅ 来源可追溯
- ✅ 防重入保护
- ✅ 与 s11e Token 互通
- ✅ 支持品牌自定义规则
积分 ↔ s11e 兑换(PointsExchange)
简介:
- 独立合约
PointsExchange,为不同品牌的积分(ERC-20)配置与s11e(ERC-20)的双向兑换比例;支持暂停、库存注入/提取、报价查询。 - 优点:对现有积分与 s11e 实现零侵入,一合约多品牌共用,运营灵活。
核心接口:
// 管理/配置
setConfig(pointsToken, s11eToken, rateNumerator, rateDenominator, paused)
setPaused(pointsToken, paused)
deposit(token, amount) / withdraw(token, amount, to)
// 报价
getQuotePointsForS11e(pointsToken, pointsIn) → s11eOut
getQuoteS11eForPoints(pointsToken, s11eIn) → pointsOut
// 兑换
swapPointsForS11e(pointsToken, pointsIn, minS11eOut)
swapS11eForPoints(pointsToken, s11eIn, minPointsOut)
本地演示(脚本):
# 运行本地演示:部署 s11e(ERC20)、品牌积分(ERC20)、配置 100:1 汇率并双向兑换
node --import tsx ./scripts/exchange-demo.js
流程说明:
- 为某品牌积分
BP设置汇率(示例:100 BP = 1 s11e) - 品牌/协议方向兑换合约注入 s11e 与 BP 库存
- 用户
approve后调用swapPointsForS11e或swapS11eForPoints - 可使用
getQuote*提前计算预计到手数量(支持minOut限制)
生产建议:关键操作走多签/Timelock;设置全局/品牌级限额;对
minOut做前端校验;重要变更记录事件并写入运营看板。
预言机触发的积分发放(Oracle-driven Issuance)
目标:由链下业务事件(下单、签到、任务完成等)通过预言机安全触发链上积分发放,减少直接用私钥操作的风险。
推荐方案:
- 新增
OracleConsumer合约,受控于多签/预言机签名白名单,仅接受有效签名或可信上游合约回调;内部调用品牌的DigitalPoints.mint/transfer进行发放。 - 采用“品牌维度配置”限额与速率限制(per-epoch cap),支持暂停;事件上链留痕(
IssuedByOracle)。
接口草案:
// 管理配置
setOracle(address oracle) onlyAdmin
setBrandCap(address pointsToken, uint256 epochCap) onlyAdmin
pause(pointsToken, bool) onlyAdmin
// 触发发放(签名校验或可信调用方校验)
issuePoints(
address pointsToken,
address to,
uint256 amount,
bytes32 nonce,
bytes signature
) external
典型流程:
- 业务服务汇总用户行为 → 生成发放请求(to/amount/nonce)并由预言机签名
- 前端/服务将签名提交到链上
OracleConsumer.issuePoints - 合约校验签名、限额与重放保护后,向
DigitalPoints发放
安全要点:
- 多签/白名单预言机;签名含链 ID/到期时间/nonce,避免重放
- 品牌级限额 + 速率限制 + 可暂停
- 所有发放事件上链,便于对账与风控
3. 徽章系统(Badge Module)
基于 ERC-1155 多通证标准
数据结构:
struct Badge {
string name;
string description;
uint256 rarity; // 稀有度 (1-5)
bool soulBound; // 是否灵魂绑定
uint256 totalMinted;
uint256 maxSupply;
}
稀有度等级:
| 等级 | 稀有度 | 描述 |
|---|---|---|
| 1 | 普通 | 大量发行 |
| 2 | 优秀 | 较多发行 |
| 3 | 稀有 | 限量发行 |
| 4 | 史诗 | 极少发行 |
| 5 | 传说 | 唯一/极限量 |
核心功能:
// 创建徽章
- createBadge(string, uint256, bool, uint256)
// 颁发徽章
- awardBadge(address, uint256, uint256)
// 批量颁发
- batchAwardBadge(address[], uint256, uint256)
应用场景:
- 🏆 会员等级:标识用户等级
- 🎖️ 活动参与:活动完成证明
- 💎 贡献者荣誉:社区贡献认可
- 🎁 限量收藏:稀有徽章收藏
为什么使用 ERC-1155?
- ✅ 一个合约管理多种徽章
- ✅ 支持批量铸造,节省 gas
- ✅ 可设置供应量限制
- ✅ 灵活的转让控制
📖 品牌使用指南
品牌如何使用 S11e Protocol?
S11e Protocol 为品牌提供了一套完整的 Web3 数字资产管理解决方案。从创建品牌身份到发行资产、管理会员,只需简单几步即可完成。
🎯 完整使用流程
第一步: 创建品牌 Profile
↓
第二步: 配置资产工厂
↓
第三步: 发行品牌资产
├─ 会员卡 NFT
├─ 品牌积分
├─ 活动徽章
├─ 出勤证明 (POAP)
└─ 活动门票
↓
第四步: 管理会员权益
├─ 铸造会员卡给用户
├─ 分发积分奖励
├─ 颁发成就徽章
└─ 发放活动门票
↓
第五步: 构建会员体系
├─ 设置不同等级权益
├─ 管理黑名单
└─ 追踪成员活动
📝 详细操作步骤
步骤 1: 创建品牌 Profile
目的: 在 S11e Protocol 上创建品牌的数字身份
操作方式:
// 使用 S11eCore 创建 Profile
const S11eCore = await ethers.getContractAt(
'S11eCore',
'0x68F828b50A78b4Bf5C0B181B0CCfE5D850f2105E' // Sepolia 地址
);
// 准备品牌信息
const profileStruct = {
profileType: 'BRAND', // 品牌类型
name: 'CoolBrand', // 品牌名称
symbol: 'COOL', // 品牌符号
memberNo: 0, // 初始成员数
owner: brandOwner.address, // 品牌所有者地址
baseURI: 'https://ipfs.s11e.io/', // 元数据基础 URI
erc6551Registry: '0x3E2D5A...', // ERC6551 注册表地址
externalUri: 'https://coolbrand.com' // 品牌官网
};
// 创建 Profile
const tx = await S11eCore.createProfile(profileStruct);
const receipt = await tx.wait();
// 获取创建的 Profile 地址
const profileAddress = receipt.logs[0].address;
console.log('品牌 Profile 创建成功:', profileAddress);
创建后你得到:
- ✅ 一个独立的 S11eProfile 合约实例
- ✅ 品牌的唯一链上地址
- ✅ 完整的资产管理权限
步骤 2: 配置资产工厂
目的: 让 Profile 能够创建各种类型的资产
操作方式:
// 连接到你的 Profile
const profile = await ethers.getContractAt('S11eProfile', profileAddress);
// 设置 AssetFactory 地址
const assetFactoryAddress = '0x3234781F07921d07E1923EAAb96fEeb1f6b4d400';
await profile.setAssetFactory(assetFactoryAddress);
console.log('✅ AssetFactory 配置完成');
配置后你可以:
- ✅ 发行会员卡 NFT
- ✅ 创建品牌积分
- ✅ 颁发徽章
- ✅ 发放 POAP 和门票
步骤 3: 发行品牌资产
品牌可以发行多种类型的数字资产,每种资产都有独特的用途。
3.1 发行会员卡 NFT (PassCard)
用途: 会员身份凭证,可绑定 Token Bound Account 持有其他资产
// 准备会员卡信息
const passCardAsset = {
protocol: 'ERC721',
assetsType: 1, // PassCard = 1
contractAddress: ethers.ZeroAddress, // 新创建时为 0
name: 'Cool Brand Membership',
symbol: 'COOL-PASS',
supply: 10000, // 最大供应量
externalUri: 'https://coolbrand.com/membership'
};
// 发行会员卡
const tx = await profile.issueAsset(passCardAsset);
await tx.wait();
// 获取会员卡合约地址
const passCardAddress = await profile.passCardAddress();
console.log('会员卡合约地址:', passCardAddress);
会员卡特点:
- 💳 ERC-721 标准 NFT
- 🔐 可绑定 ERC6551 账户
- 💎 支持不同等级设计
- 🎨 自定义元数据和图片
3.2 创建品牌积分 (DigitalPoints)
用途: 品牌专属积分,用于奖励用户行为、兑换商品
// 准备积分信息
const pointsAsset = {
protocol: 'ERC20',
assetsType: 2, // DigitalPoints = 2
contractAddress: ethers.ZeroAddress,
name: 'Cool Points',
symbol: 'CP',
supply: 1000000, // 总供应量(自动乘以 decimals)
externalUri: 'https://coolbrand.com/points'
};
// 创建积分
await profile.issueAsset(pointsAsset);
// 获取积分合约地址
const pointsAddress = await profile.digitalPointsAddress();
console.log('品牌积分地址:', pointsAddress);
积分应用:
- 🎁 购物返积分
- 🎯 完成任务获得奖励
- 💰 积分兑换商品
- 🔄 与其他 Token 互换
3.3 颁发徽章 (Badge)
用途: 成就系统、会员等级、荣誉标识
// 准备徽章信息
const badgeAsset = {
protocol: 'ERC1155',
assetsType: 4, // Badge = 4
contractAddress: ethers.ZeroAddress,
name: 'Cool Achievements',
symbol: 'BADGE',
supply: 0, // ERC1155 每个 tokenId 单独设置
externalUri: 'https://coolbrand.com/badges'
};
// 创建徽章系统
await profile.issueAsset(badgeAsset);
const badgeAddress = await profile.badgeAddress();
// 连接到徽章合约
const badge = await ethers.getContractAt('Badge', badgeAddress);
// 创建不同等级的徽章
await badge.createBadge('Bronze Member', 1, false, 10000); // 青铜
await badge.createBadge('Silver Member', 2, false, 5000); // 白银
await badge.createBadge('Gold Member', 3, false, 1000); // 黄金
await badge.createBadge('VIP Member', 5, true, 100); // VIP (灵魂绑定)
console.log('徽章系统创建完成');
徽章系统特点:
- 🏅 ERC-1155 多种类徽章
- ⭐ 支持稀有度等级(1-5)
- 🔒 可设置为灵魂绑定(不可转移)
- 📊 限量发行控制
3.4 发行 POAP(出勤证明)
用途: 活动参与证明、里程碑纪念
// 准备 POAP 信息
const poapAsset = {
protocol: 'ERC1155',
assetsType: 5, // POAP = 5
contractAddress: ethers.ZeroAddress,
name: 'Cool Brand Web3 Summit 2025',
symbol: 'POAP25',
supply: 500, // 活动参与人数上限
externalUri: 'https://coolbrand.com/events/summit2025'
};
// 创建 POAP
await profile.issueAsset(poapAsset);
const poapAddress = await profile.poapAddress();
console.log('POAP 合约地址:', poapAddress);
POAP 特点:
- 🎖️ ERC-1155 NFT
- 🔐 Soulbound(灵魂绑定) - 不可转移
- 📅 永久记录参与历史
- 🏆 展示个人成就
Soulbound 说明:
- 铸造后无法转移给他人
- 防止 POAP 交易和买卖
- 真实反映个人参与历史
- 适合身份认证场景
3.5 发行活动门票 (Ticket)
用途: 演唱会、展览、课程等活动门票
// 准备门票信息
const ticketAsset = {
protocol: 'ERC1155',
assetsType: 6, // Ticket = 6
contractAddress: ethers.ZeroAddress,
name: 'Cool Brand Concert 2025',
symbol: 'TICKET',
supply: 2000, // 门票总数
externalUri: 'https://coolbrand.com/events/concert2025'
};
// 创建门票
await profile.issueAsset(ticketAsset);
const ticketAddress = await profile.ticketAddress();
console.log('门票合约地址:', ticketAddress);
门票特点:
- 🎫 ERC-721 NFT
- ✅ 可转移 - 允许二级市场交易
- 🎯 支持 ERC6551 绑定账户
- 💰 自动版税收益
步骤 4: 管理会员权益
发行资产后,品牌可以管理和分发这些资产。
4.1 铸造会员卡给用户
const passCard = await ethers.getContractAt('PassCard', passCardAddress);
// 给用户铸造会员卡
await passCard.mint(userAddress);
console.log('会员卡已发放给:', userAddress);
4.2 为会员卡创建 Token Bound Account
const registry = await ethers.getContractAt('ERC6551Registry', registryAddress);
// 为 Token #1 创建账户
const tbaAddress = await registry['createAccount(address,uint256,uint256)'](
passCardAddress, // PassCard 合约地址
1, // Token ID
0 // Salt
);
console.log('会员卡 #1 的 TBA 地址:', tbaAddress);
TBA 的作用:
- 💼 会员卡 NFT 可以持有资产
- 💰 可以接收 ETH、Token、其他 NFT
- 📊 记录会员的完整资产历史
- 🔗 资产随 NFT 转移而转移
4.3 分发积分奖励
const points = await ethers.getContractAt('DigitalPoints', pointsAddress);
// 给用户奖励积分
await points.transfer(userAddress, ethers.parseEther('100'));
// 或者直接转到会员卡的 TBA
await points.transfer(tbaAddress, ethers.parseEther('100'));
console.log('积分奖励已发放');
积分分发场景:
- 🛒 购物返积分
- ✅ 完成任务奖励
- 🎯 每日签到
- 👥 邀请好友
- 💬 社区贡献
4.4 颁发成就徽章
// 给用户颁发青铜徽章(tokenId=1)
await badge.mint(userAddress, 1, 1); // 地址, tokenId, 数量
// 批量颁发
const users = [user1, user2, user3];
await badge.batchMint(users, 2, 1); // 白银徽章
console.log('徽章颁发完成');
徽章应用场景:
- 🏆 会员等级标识
- 🎖️ 活动参与奖励
- 💎 社区贡献认可
- 🎁 限量收藏品
4.5 发放活动门票和 POAP
// 发放门票(可转移)
const ticket = await ethers.getContractAt('Ticket', ticketAddress);
await ticket.mint(userAddress);
// 发放 POAP(不可转移)
const poap = await ethers.getContractAt('POAP', poapAddress);
await poap.mint(attendeeAddress);
console.log('门票和 POAP 发放完成');
发放时机:
- 🎫 门票:购票或中奖时
- 🎖️ POAP:活动签到后
步骤 5: 构建完整会员体系
5.1 设计会员等级
/**
* 会员体系设计示例
*
* 💎 钻石会员(Lv.5)
* - 持有 VIP 徽章(tokenId=4, 灵魂绑定)
* - 积分余额 >= 10000
* - 专属权益:
* • 优先购买权
* • 专属折扣 20%
* • 免费活动门票
* • 空投资格
*
* 🥇 黄金会员(Lv.3)
* - 持有金牌徽章(tokenId=3)
* - 积分余额 >= 5000
* - 专属权益:
* • 10% 折扣
* • 优先客服
*
* 🥈 白银会员(Lv.2)
* - 持有银牌徽章(tokenId=2)
* - 积分余额 >= 1000
* - 专属权益:
* • 5% 折扣
* • 生日礼物
*
* 🥉 青铜会员(Lv.1)
* - 持有铜牌徽章(tokenId=1)
* - 基础会员权益
*/
// 查询用户等级
async function getUserLevel(userAddress) {
// 检查徽章持有情况
const vipBadge = await badge.balanceOf(userAddress, 4);
if (vipBadge > 0) return 5; // 钻石
const goldBadge = await badge.balanceOf(userAddress, 3);
if (goldBadge > 0) return 3; // 黄金
const silverBadge = await badge.balanceOf(userAddress, 2);
if (silverBadge > 0) return 2; // 白银
const bronzeBadge = await badge.balanceOf(userAddress, 1);
if (bronzeBadge > 0) return 1; // 青铜
return 0; // 非会员
}
5.2 管理黑名单
// 添加单个用户到黑名单
await profile.addBlacklist(spammerAddress);
// 批量添加
await profile.batchAddBlacklist([addr1, addr2, addr3]);
// 移除黑名单
await profile.removeBlacklist(userAddress);
// 检查是否在黑名单
const isBlocked = await profile.isBlacklisted(userAddress);
console.log('黑名单管理完成');
黑名单效果:
- 🚫 无法关注品牌 Profile
- 🚫 无法参与品牌活动
- ✅ 不影响已有资产持有
5.3 查询成员信息
// 获取所有成员列表
const members = await profile.memberList();
console.log('总成员数:', members.length);
// 获取会员卡总供应量
const totalCards = await passCard.totalSupply();
// 获取品牌积分总量
const totalPoints = await points.totalSupply();
// 生成成员报告
console.log('品牌数据:');
console.log('- 成员数:', members.length);
console.log('- 会员卡发行:', totalCards);
console.log('- 积分总量:', ethers.formatEther(totalPoints));
💡 品牌使用场景案例
场景 1: 时尚品牌会员体系
背景: 一个时尚品牌想建立 Web3 会员系统,提升用户忠诚度和品牌价值。
实施方案:
-
创建品牌 Profile: "LuxeFashion"
await S11eCore.createProfile({ profileType: "BRAND", name: "LuxeFashion", symbol: "LUXE", owner: brandOwner }); -
发行会员卡: 限量 10,000 张会员卡 NFT
await profile.issueAsset({ assetsType: 1, // PassCard name: "LuxeFashion Membership", symbol: "LUXE-PASS", supply: 10000 }); -
创建积分系统: LuxePoints,用于购物返利
await profile.issueAsset({ assetsType: 2, // DigitalPoints name: "Luxe Points", symbol: "LUXE-PTS", supply: 10000000 }); -
设计徽章体系:
- 🥉 青铜:新会员(Badge ID 1)
- 🥈 白银:消费 >= 10000 元(Badge ID 2)
- 🥇 黄金:消费 >= 50000 元(Badge ID 3)
- 💎 VIP:邀请 10+ 好友(Badge ID 4,灵魂绑定)
-
会员权益:
- 💳 会员卡 NFT 可交易
- 💰 每次购物返 5% 积分到 TBA
- 🏅 达到消费门槛自动升级徽章
- 🎁 VIP 会员专享限量款优先购买权
- 🎫 每月空投 SE Token(钻石会员 100 SE)
经济模型:
会员卡价格: 0.1 ETH
购物返利: 消费金额 × 5% → TBA
积分兑换: 100 LUXE-PTS = 1 SE Token
升级奖励: 达到黄金会员奖励 100 积分
场景 2: 音乐人演唱会门票 + POAP
背景: 音乐人发行演唱会门票,建立粉丝社区,记录参与历史。
实施方案:
-
发行门票 NFT: 2000 张,可转让
await profile.issueAsset({ assetsType: 6, // Ticket name: "MusicStar Concert 2025", symbol: "TICKET-2025", supply: 2000 }); // 支持二级市场交易 // 设置版税 5% 返还音乐人 // 不同座位区不同价格(VIP/普通区) -
发放 POAP: 演唱会结束后自动发放
// 用户在活动现场签到 // 签到后自动铸造 POAP 到用户的 TBA 或直接地址 await poap.createEvent('MusicStar Concert 2025', eventMetadataURI); await poap.batchMint(attendees, eventId, metadataURI); // POAP 特性: // - 灵魂绑定,不可转移 // - 永久证明"我在现场" // - 展示在用户个人资料 -
特殊权益:
- 🎫 持有 POAP 的粉丝优先购买下次门票(提前 24 小时)
- 🏆 收集 3 场 POAP 可兑换签名专辑 NFT
- 💎 收集 10 场 POAP 获得"超级粉丝"徽章(灵魂绑定)
- 🎁 每次 POAP 空投 10 SE Token 到 TBA
经济模型:
门票价格: 0.05 - 0.3 ETH (根据座位区)
版税: 5% 二级市场交易费用
POAP 价值: 不可交易,但可证明参与历史
粉丝等级: 根据 POAP 数量自动升级
场景 3: 在线教育机构课程管理
背景: 在线教育平台发行课程证书,建立学习成就系统,激励学员完成课程。
实施方案:
-
课程通行证: PassCard NFT
// 购买课程 = 铸造通行证 await passCard.mint(studentAddress, courseId, metadataURI, false); // 通行证绑定 TBA,持有: // - 学习资料 NFT // - 课程视频访问凭证 // - 作业提交记录 -
学习积分系统: 完成任务获得积分
// 看完视频 → 获得 10 积分 await points.mint(tbaAddress, ethers.parseEther('10')); // 提交作业 → 获得 50 积分 await points.mint(tbaAddress, ethers.parseEther('50')); // 参与讨论 → 获得 5 积分/次 await points.mint(tbaAddress, ethers.parseEther('5')); -
成就徽章系统:
// 课程完成徽章(完成 80% 内容) await badge.awardBadge(tbaAddress, 1, 1); // 课程完成徽章 // 优秀学员徽章(作业平均分 >= 90) await badge.awardBadge(tbaAddress, 2, 1); // 优秀学员 // 助教资格徽章(完成课程 + 帮助 10+ 学员,灵魂绑定) await badge.createBadge('助教', 5, true, 100); await badge.awardBadge(tbaAddress, 3, 1); // 助教资格(不可转移) -
结业证书: POAP 形式
// 完成全部课程后自动铸造 if (courseCompletion >= 100%) { await poap.createEvent('课程结业证书', certificateMetadataURI); await poap.mint(tbaAddress, eventId, certificateURI); // POAP 特性: // - 灵魂绑定,不可转移 // - 永久学历证明 // - 可在链上验证 }
经济模型:
课程价格: 0.1 ETH (或法币支付,链上记录)
积分价值: 1000 积分 = 1 SE Token
结业奖励: 完成课程奖励 100 SE Token
助教激励: 帮助他人完成课程,奖励 50 SE/人
🔧 品牌管理工具
品牌可以使用 Profile 提供的管理功能:
// 1. 更新品牌信息
await profile.updateProfile(newName, newSymbol, newExternalUri);
// 2. 管理资产工厂
await profile.setAssetFactory(newFactoryAddress);
// 3. 注册外部资产
const externalAsset = {
protocol: 'ERC721',
assetsType: 3, // PFP
contractAddress: externalNFTAddress, // 已存在的合约
name: 'External NFT',
symbol: 'EXT',
supply: 0,
externalUri: 'https://external.com'
};
await profile.register(externalAsset);
// 4. 成员社交功能
// 用户可以关注品牌
await profile.follow(); // 作为用户调用
// 5. 权限管理
// 转移品牌所有权(谨慎操作)
await profile.transferOwnership(newOwnerAddress);
📊 品牌数据分析
品牌可以通过链上数据分析运营效果:
// 统计分析脚本示例
async function analyzeBrand(profileAddress) {
const profile = await ethers.getContractAt('S11eProfile', profileAddress);
// 基础数据
const members = await profile.memberList();
const assetsCount = await profile.assetsCount();
// 会员卡数据
const passCardAddr = await profile.passCardAddress();
const passCard = await ethers.getContractAt('PassCard', passCardAddr);
const totalCards = await passCard.totalSupply();
// 积分数据
const pointsAddr = await profile.digitalPointsAddress();
const points = await ethers.getContractAt('DigitalPoints', pointsAddr);
const totalPoints = await points.totalSupply();
// 徽章数据
const badgeAddr = await profile.badgeAddress();
const badge = await ethers.getContractAt('Badge', badgeAddr);
// 生成报告
const report = {
members: members.length,
assetsIssued: assetsCount,
memberCardsIssued: totalCards,
totalPoints: ethers.formatEther(totalPoints),
timestamp: new Date().toISOString()
};
console.log('品牌运营数据:', report);
return report;
}
⚠️ 注意事项
品牌运营建议:
-
资产发行前:
- ✅ 明确各类资产的用途
- ✅ 设计合理的供应量
- ✅ 规划会员权益体系
- ✅ 准备好元数据和图片
-
资产发行后:
- ✅ 资产合约地址不可更改
- ✅ 供应量限制不可修改
- ✅ 灵魂绑定设置不可撤销
- ⚠️ 请谨慎规划
-
权限管理:
- 🔐 妥善保管品牌所有者私钥
- 🔐 建议使用多签钱包
- 🔐 定期备份重要数据
-
合规建议:
- 📜 遵守当地法律法规
- 📜 明确告知用户权益
- 📜 制定清晰的服务条款
🚀 下一步
品牌成功创建后,可以:
- 🎨 开发前端界面: 让用户可视化管理资产
- 📱 集成到现有系统: 与 CRM、电商系统对接
- 🤖 自动化运营: 设置自动发放积分、徽章的规则
- 📊 数据分析: 追踪用户行为,优化运营策略
- 🌐 跨链扩展: 部署到其他区块链网络
相关文档:
🚀 应用场景
S11e 如何实际落地?——从商户、品牌、用户三端给出明确路径
1. 商户端:智能数字店铺(Bigan)
核心功能:
- 💰 交易数据变成可证明资产:每一笔交易自动上链,转化为 Brand RWA
- 👥 用户贡献沉淀为权益:用户消费、传播、参与活动等行为自动记录为贡献值
- 📊 营销与活动自动上链:品牌活动、营销活动数据透明可查
- 🔗 跨品牌联合商圈:商户间的合作贡献可记录、可分配
价值体现:
- 商户不再只是服务提供者,而是品牌建设的参与者
- 商户的贡献(让利、服务、履约)获得可验证的回报
- 跨品牌合作形成可追溯的贡献网络
2. 品牌端:智能收银终端(Baigui)
核心功能:
- 💳 收银即上链:每一笔交易实时记录在区块链上
- 📈 品牌增长即资产增长:GMV、用户增长等数据自动转化为 Brand RWA
- 💎 数据即权益:品牌数据不再是平台资产,而是品牌自己的链上资产
- 🛡️ 不再被平台抽佣收割:品牌拥有数据主权,价值分配由智能合约决定
价值体现:
- 品牌数据主权回归品牌方
- 品牌增长红利自动分配给贡献者
- 摆脱平台垄断,实现去中心化运营
3. 用户端:消费即参与,参与即获得权益
核心功能:
- 🛒 消费生成 Brand RWA:每次消费自动产生可验证的贡献记录
- 🎁 贡献行为得到可交易权益:内容创作、传播、活动参与等行为获得权益资产
- 📈 持有权益伴随品牌增长增值:品牌价值增长,用户权益同步增长
- 🗳️ 参与治理决定品牌未来:持有权益的用户可以参与品牌决策
价值体现:
- 用户从"消费者"转变为"品牌权益持有人"
- 用户贡献获得可验证、可交易的回报
- 用户与品牌形成利益共同体
📦 实际应用示例
场景示例:时尚品牌会员体系完整流程
背景: 某时尚品牌 "LuxeFashion" 希望建立 Web3 会员系统,提升用户忠诚度。
第一步: 用户购买品牌会员卡 NFT #1
↓
第二步: PassCard #1 绑定 TBA: 0x299f2D2B...
↓
第三步: TBA 持有资产:
• 1000 品牌积分 (DigitalPoints)
• 3 个等级徽章 (Badge: 青铜、白银、黄金)
• 2 个活动 POAP (参与品牌活动证明)
• 1 张演唱会门票 (Ticket)
• 0.1 ETH 奖励
↓
第四步: 用户转让 PassCard #1 给朋友
↓
第五步: 所有资产自动转移 🔄
完整实施方案:
步骤 1: 创建品牌 Profile
const profileStruct = {
profileType: "BRAND",
name: "LuxeFashion",
symbol: "LUXE",
owner: brandOwner,
baseURI: "https://ipfs.s11e.io/luxefashion/",
erc6551Registry: "0x3E2D5A69e77b0F57bA2bd8d19eA436459B186c08",
externalUri: "https://luxefashion.com"
};
const tx = await S11eCore.createProfile(profileStruct);
const receipt = await tx.wait();
const profileAddress = receipt.logs[0].address;
// → Profile 地址: 0x4dd15234...
步骤 2: 发行会员卡 NFT
await profile.issueAsset({
assetsType: 1, // PassCard
protocol: 'ERC721',
name: "LuxeFashion Membership",
symbol: "LUXE-PASS",
supply: 10000,
externalUri: "https://luxefashion.com/membership"
});
const passCardAddress = await profile.passCardAddress();
步骤 3: 创建品牌积分系统
await profile.issueAsset({
assetsType: 2, // DigitalPoints
protocol: 'ERC20',
name: "Luxe Points",
symbol: "LUXE-PTS",
supply: 10000000, // 1000万积分
externalUri: "https://luxefashion.com/points"
});
const pointsAddress = await profile.digitalPointsAddress();
步骤 4: 设计徽章体系
const badge = await ethers.getContractAt('Badge', badgeAddress);
// 创建不同等级的徽章
await badge.createBadge('青铜会员', 1, false, 10000); // 普通会员
await badge.createBadge('白银会员', 2, false, 5000); // 消费 >= 10000 元
await badge.createBadge('黄金会员', 3, false, 1000); // 消费 >= 50000 元
await badge.createBadge('VIP 会员', 5, true, 100); // 邀请 10+ 好友(灵魂绑定)
步骤 5: 用户领取会员卡并获取 TBA
// 用户购买会员卡
const passCard = await ethers.getContractAt('PassCard', passCardAddress);
const mintTx = await passCard.mint(userAddress, 1, metadataURI, false);
await mintTx.wait();
// 自动创建 TBA(ERC6551)
const registry = await ethers.getContractAt('ERC6551Registry', registryAddress);
const tbaAddress = await registry.account(
passCardAddress, // NFT 合约
1, // Token ID
0 // Salt
);
// → TBA 地址: 0x299f2D2B3f421FB56e13cfC626ED6f877Ee4a0Bb
步骤 6: 分发资产到 TBA
// 1. 分发品牌积分到 TBA
const points = await ethers.getContractAt('DigitalPoints', pointsAddress);
await points.mint(tbaAddress, ethers.parseEther('1000'));
// 2. 颁发徽章到 TBA
await badge.awardBadge(tbaAddress, 1, 1); // 青铜徽章
await badge.awardBadge(tbaAddress, 2, 1); // 白银徽章
await badge.awardBadge(tbaAddress, 3, 1); // 黄金徽章
// 3. 发放活动 POAP 到 TBA
const poap = await ethers.getContractAt('POAP', poapAddress);
await poap.createEvent('春季新品发布会', poapMetadataURI);
await poap.batchMint([tbaAddress], eventId, metadataURI);
// 4. 发放演唱会门票到 TBA
const ticket = await ethers.getContractAt('Ticket', ticketAddress);
await ticket.mint(tbaAddress, ticketTypeId, 1, ticketMetadataURI);
// 5. 发送 ETH 奖励到 TBA
await brandOwner.sendTransaction({
to: tbaAddress,
value: ethers.parseEther('0.1')
});
步骤 7: NFT 转让时资产自动转移
// 用户将 PassCard #1 转让给朋友
await passCard.transferFrom(userAddress, friendAddress, 1);
// ✅ 自动结果:
// - TBA 控制权转移给新持有者
// - TBA 内所有资产(积分、徽章、POAP、门票、ETH)一起转移
// - 无需单独转移每个资产
会员权益设计:
| 会员等级 | 徽章 ID | 积分要求 | 权益 |
|---|---|---|---|
| 💎 钻石会员 | Badge #4 (VIP) | 10000+ | 专属折扣 20%、优先购买、空投资格 |
| 🥇 黄金会员 | Badge #3 | 5000+ | 折扣 10%、优先客服 |
| 🥈 白银会员 | Badge #2 | 1000+ | 折扣 5%、生日礼物 |
| 🥉 青铜会员 | Badge #1 | 0+ | 基础会员权益 |
1. 品牌资产管理
完整流程:
步骤1: 创建品牌 Profile(品牌数字身份)
↓
步骤2: 发行品牌资产(Token/NFT/积分)
↓
步骤3: 配置资产权益(会员体系)
↓
步骤4: 分发和管理资产
示例代码:
// 1. 创建品牌 Profile
const tx = await s11eCore.createProfile({
profileType: 'BRAND',
name: 'CoolBrand',
symbol: 'CB',
owner: brandOwner.address,
baseURI: 'https://ipfs.example.com/',
erc6551Registry: registryAddress,
externalUri: 'https://coolbrand.com'
});
// 2. 发行品牌积分
await profile.issueAsset({
assetsType: 'DIGITAL_POINTS',
contractAddress: '0x0',
externalUri: 'https://coolbrand.com/points'
});
// 3. 发行会员卡
await profile.issueAsset({
assetsType: 'PASS_CARD',
contractAddress: '0x0',
externalUri: 'https://coolbrand.com/membership'
});
2. 会员体系管理
构建完整的会员权益体系:
等级体系:
┌─────────────────────────────────────┐
│ 💎 钻石会员 - PassCard NFT #5 │
│ • 1000+ 积分 │
│ • 专属徽章 x3 │
│ • 专属权益和优先服务 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 🥇 黄金会员 - PassCard NFT #3 │
│ • 500+ 积分 │
│ • 专属徽章 x2 │
│ • 高级会员权益 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 🥈 白银会员 - PassCard NFT #1 │
│ • 100+ 积分 │
│ • 专属徽章 x1 │
│ • 基础会员权益 │
└─────────────────────────────────────┘
实现方式:
- 💳 会员卡(PassCard):不同等级权益
- 💰 积分激励:行为奖励
- 🏅 徽章荣誉:成就展示
- 🎁 专属权益:会员专享
3. 数字资产发行
品牌可发行多种数字资产:
NFT 藏品
// 发行限量版 NFT
await profile.issueAsset({
assetsType: 'PFP',
contractAddress: '0x0',
externalUri: 'https://coolbrand.com/nft/collection'
});
活动门票
// 发行活动门票
await profile.issueAsset({
assetsType: 'TICKET',
contractAddress: '0x0',
externalUri: 'https://coolbrand.com/event/2025'
});
POAP(出席证明)
// 铸造活动参与证明
await poapContract.mint(
attendeeAddress,
'Web3 Summit 2025',
eventMetadata
);
SBT(灵魂绑定)
// 颁发荣誉证书(不可转让)
await s11eIP.createBrand(
brandAddress,
'Verified Brand',
description,
metadataURI
);
🛠️ 技术栈
智能合约层
| 技术 | 版本 | 用途 |
|---|---|---|
| Solidity | ^0.8.20 | 智能合约语言 |
| OpenZeppelin | ^5.4.0 | 安全合约库 |
| Hardhat | ^3.0.6 | 开发框架 |
| Ethers.js | ^6.0.0 | 合约交互库 |
| Mocha + Chai | - | 测试框架 |
支持的标准
| 标准 | 用途 | 实现状态 |
|---|---|---|
| ERC-20 | 同质化通证 | ✅ |
| ERC-721 | NFT 标准 | ✅ |
| ERC-1155 | 多通证标准 | ✅ |
| ERC-6551 | Token Bound Account | ✅ |
| EIP-1167 | 最小代理合约 | ✅ |
| EIP-1967 | 代理存储槽 | ✅ |
| EIP-1822 | 通用可升级代理 | ✅ |
| EIP-5192 | 灵魂绑定 NFT | ✅ |
开发工具
- 🔧 Hardhat: 开发、测试、部署
- 📊 The Graph: 链下数据索引
- 🔍 Slither: 静态安全分析
- 🛡️ Mythril: 漏洞扫描
- 📝 Solhint: 代码规范检查
- 🎨 Prettier: 代码格式化
网络支持
| 网络 | 类型 | 状态 | 部署状态 |
|---|---|---|---|
| Ethereum Sepolia | 测试网 | ✅ 支持 | ✅ 已部署 (2025-01-30) |
| Ethereum | 主网 | ✅ 支持 | ⏳ 计划中 |
| Polygon | 主网 / Mumbai | ✅ 支持 | ⏳ 计划中 |
| BSC | 币安智能链 | ✅ 支持 | ⏳ 计划中 |
| Conflux | 主链 | ✅ 主力 | ⏳ 计划中 |
| Harmony | 和谐链 | ✅ 支持 | ⏳ 计划中 |
| Avalanche | 雪崩链 | ✅ 支持 | ⏳ 计划中 |
🌐 Sepolia 测试网部署
已部署合约地址(2025-01-30)
所有核心合约已成功部署到 Ethereum Sepolia 测试网并完成功能测试。
核心基础设施
| 合约 | 地址 | 说明 |
|---|---|---|
| ERC6551Account | 0x6E79B6Db34BccbDb226437E359CE49c24B4e4898 | Token Bound Account 实现 |
| ERC6551Registry | 0x3E2D5A69e77b0F57bA2bd8d19eA436459B186c08 | TBA 注册表 |
核心工厂合约
| 合约 | 地址 | 说明 |
|---|---|---|
| S11eCore | 0x68F828b50A78b4Bf5C0B181B0CCfE5D850f2105E | 协议入口 |
| S11eProfileFactory | 0x41960135A55ff5E2A322E377576098eB12971dD3 | Profile 工厂 |
| ProfileImplementation | 0xb1847D684D439520f20a140e9Ab92B2BAE58f26E | Profile 实现合约 |
| AssetFactory | 0x3234781F07921d07E1923EAAb96fEeb1f6b4d400 | 资产工厂 |
资产创建器
| 合约 | 地址 | 资产类型 |
|---|---|---|
| PassCardCreator | 0x71101F0d990020Bf13Fc4388fe826563DB81b5dd | 会员卡(type=1) |
| DigitalPointsCreator | 0xb2110d504C917cF4DE22c791D56E4707d32975D6 | 数字积分(type=2) |
| BadgeCreator | 0x9C9601dE6DE92633e39e07A5d02173FBD3801Fb7 | 徽章(type=4) |
| POAPCreator | 0xA956635F553D6f47B97A91871d20f3961a75a630 | 出勤证明(type=5) |
| TicketCreator | 0xC31FE92284CC36289d63A9A23c9e63E8dB318C47 | 门票(type=6) |
功能测试结果
✅ 测试日期: 2025-01-30
✅ 测试网络: Ethereum Sepolia
✅ 测试状态: 100% 通过
测试流程:
1. ✅ 创建品牌 Profile
└─ Profile 地址: 0x4dd15234Cc9D7604316A469936d45FAEa0729246
2. ✅ 发行会员卡 NFT
└─ PassCard 地址: 0x36AC29c837ee7749a801ff769d70EF62659023E9
3. ✅ 铸造会员卡 #1
└─ Token ID: 1
4. ✅ 创建 Token Bound Account
└─ TBA 地址: 0x299f2D2B3f421FB56e13cfC626ED6f877Ee4a0Bb
5. ✅ 发行品牌积分
└─ DigitalPoints 地址: 0x12Cc9EbFE8ABE92b8750501e8CD00288Df9dbfCC
6. ✅ 资产分发测试
├─ TBA 持有 ETH: 0.001 ETH
└─ TBA 持有积分: 100.0 CP
验证命令:
# 在 Sepolia 区块浏览器查看
https://sepolia.etherscan.io/address/0x68F828b50A78b4Bf5C0B181B0CCfE5D850f2105E
📊 项目现状
📈 核心指标一览
| 🎯 部署状态 ✅ Sepolia 测试网 2025-01-30 |
📦 合约数量 70+ 个合约 4 个核心 |
✅ 测试覆盖 100 个测试 84% 覆盖率 |
📚 文档 3000+ 行 完整文档 |
| 🔧 已完成功能 13 个核心功能 100% 可用 |
🌐 支持网络 7+ 个网络 EVM 兼容 |
⛽ Gas 优化 克隆模式 节省 87% |
🛡️ 安全性 OZ 5.4.0 多层防护 |
✅ 功能完成度
核心基础设施(100% ✅)
- ✅ S11eCore - 协议入口,Profile 管理
- ✅ S11eProfileFactory - 克隆工厂(节省 87% Gas)
- ✅ ERC6551 - Token Bound Account 完整实现
- ✅ AssetFactory - 委托模式,统一资产创建
资产系统(83% ✅)
- ✅ PassCard - 会员卡 NFT + ERC6551 (type=1)
- ✅ DigitalPoints - 品牌积分 ERC-20 (type=2)
- ⏳ PFP - 头像 NFT(待集成)(type=3)
- ✅ Badge - 多级徽章 ERC-1155 (type=4)
- ✅ POAP - 出勤证明 Soulbound (type=5)
- ✅ Ticket - 活动门票 ERC-1155 (type=6)
成员管理(100% ✅)
- ✅ 社交关注 - follow 功能
- ✅ 黑名单 - 完整的黑名单管理
- ✅ 成员列表 - memberList 查询
- ✅ Profile 更新 - 信息修改
测试与文档(90% ✅)
- ✅ 单元测试 - 100 个测试用例
- ✅ 集成测试 - 完整流程测试
- ✅ 文档体系 - 技术文档 + 使用指南
- ✅ 前端示例 - Wagmi + React 集成
- ⏳ 性能测试 - 待添加
⭐ 工程质量评分
| 维度 | 评分 | 进度条 | 说明 |
|---|---|---|---|
| 架构设计 | 4.5/5 | ████████████████████░ | 模块化清晰,职责分明 |
| 代码质量 | 4/5 | ████████████████░░░░ | 遵循规范,注释完善 |
| 测试覆盖 | 4/5 | ████████████████░░░░ | 84% 核心功能全覆盖 |
| 安全性 | 4.5/5 | ████████████████████░ | OpenZeppelin + 多层防护 |
| 文档完整性 | 5/5 | █████████████████████ | 文档详尽完整 |
| 用户体验 | 4/5 | ████████████████░░░░ | 清晰的使用指南 |
综合得分: 4.2/5 ⭐⭐⭐⭐☆ 优秀
💡 技术亮点
1. ERC6551 创新应用 🚀
传统 NFT 的局限:
- ❌ NFT 只是一个图片
- ❌ 无法持有其他资产
- ❌ 无法执行链上操作
ERC6551 的突破:
- ✅ NFT 变成可编程账户
- ✅ 可以持有 ETH、Token、其他 NFT
- ✅ 可以执行任意合约调用
- ✅ 为品牌会员卡赋予真正的实用价值
应用示例:
品牌 Profile (S11eProfile)
↓ 发行
会员卡 NFT (PassCard)
↓ 绑定
Token Bound Account (ERC6551)
↓ 持有
各种资产:
- 100 SE Token
- 5 个品牌积分 NFT
- 3 个活动徽章
- 0.1 ETH
2. 模块化架构 🧩
插件式设计:
核心合约 (不变)
↓
插槽接口 (标准化)
↓
功能模块 (可插拔)
标准接口:
interface IModule {
function moduleType() external pure returns (bytes32);
function initialize(address profile) external;
function isActive() external view returns (bool);
}
优势:
- ✅ 灵活组合功能
- ✅ 第三方可开发模块
- ✅ 热插拔不影响其他功能
- ✅ 支持模块市场
3. 完善的升级机制 🔄
版本管理系统:
struct ModuleVersion {
address implementation;
uint256 version;
bytes32 upgradeHash;
uint256 deployedAt;
bool isActive;
bool isDeprecated;
string changelog;
}
安全升级流程:
1. 注册新版本
↓
2. 验证兼容性
↓
3. 管理员审核
↓
4. 时间锁等待 (2天)
↓
5. 执行升级
↓
6. 验证结果
紧急回滚:
function emergencyRollback(bytes32 moduleId, uint256 version)
4. Gas 优化 ⛽
优化技术:
| 优化技术 | 节省 | 说明 |
|---|---|---|
| 克隆工厂 | 87% | EIP-1167 最小代理 |
| 存储打包 | ~40% | 变量打包到同一槽 |
| 批量操作 | ~60% | 减少交易次数 |
| 事件日志 | ~90% | 代替链上存储 |
示例对比:
// ❌ 未优化 (3个存储槽)
uint256 generation;
uint256 rarity;
uint256 mintTime;
// ✅ 优化后 (1个存储槽)
struct PackedData {
uint64 generation;
uint8 rarity;
uint64 mintTime;
uint120 reserved;
}
5. 全面的安全防护 🛡️
多层防护体系:
┌──────────────────────────────────┐
│ Layer 1: 权限控制 │
│ AccessControl (RBAC) │
└──────────────────────────────────┘
┌──────────────────────────────────┐
│ Layer 2: 防重入 │
│ ReentrancyGuard │
└──────────────────────────────────┘
┌──────────────────────────────────┐
│ Layer 3: 紧急暂停 │
│ Pausable │
└──────────────────────────────────┘
┌──────────────────────────────────┐
│ Layer 4: 溢出保护 │
│ Solidity 0.8.20+ │
└──────────────────────────────────┘
┌──────────────────────────────────┐
│ Layer 5: 标准库 │
│ OpenZeppelin 5.4.0 │
└──────────────────────────────────┘
安全检查清单:
- Checks-Effects-Interactions 模式
- 避免使用 tx.origin
- 合理的 gas limit
- 紧急暂停机制
- 时间锁保护
- 完整的测试覆盖
🎯 适用人群
品牌方 🏢
适合场景:
- ✅ 想要创建 Web3 品牌社区
- ✅ 需要会员体系和积分系统
- ✅ 发行品牌 NFT 和数字藏品
- ✅ 构建品牌数字资产生态
- ✅ 管理社区成员权益
典型应用:
- 🎨 时尚品牌:发行限量版数字藏品、会员卡 NFT
- 🍕 餐饮品牌:积分兑换、会员权益、数字优惠券
- 🎵 娱乐品牌:粉丝徽章、演唱会门票、纪念品 NFT
- 📚 教育品牌:学习证书、成就系统、课程通行证
- 🛍️ 零售品牌:会员积分、专属福利、限量数字藏品
- 🏃 运动品牌:运动数据 NFT、赛事纪念、装备收藏
创作者和社区 🎨
适合场景:
- ✅ 创作者发行作品 NFT
- ✅ 粉丝社区资产管理
- ✅ 社区积分和徽章系统
- ✅ 会员权益管理
- ✅ 数字藏品发行
应用实例:
- 艺术家社区:作品 NFT、粉丝徽章
- 音乐人社区:音乐 NFT、会员卡
- 写作社区:作品证书、贡献积分
- 游戏公会:游戏资产、成就系统
开发者 👨💻
适合场景:
- ✅ 基于协议开发 DApp
- ✅ 创建自定义模块
- ✅ 集成到现有系统
- ✅ 学习 Web3 开发
- ✅ 贡献开源生态
开发机会:
- 🔧 开发第三方模块
- 🎨 构建前端应用
- 📊 创建数据分析工具
- 🤖 开发自动化工具
个人用户 👤
适合场景:
- ✅ 创建个人品牌
- ✅ 管理数字身份
- ✅ 收藏数字资产
- ✅ 参与品牌社区
- ✅ 展示个人成就
- ✅ 获取会员权益
🚀 快速开始
环境准备
# 1. 检查 Node.js 版本(需要 >= 20.14.0)
node --version
# 2. 克隆仓库
git clone https://github.com/s11e-protocol/contracts.git
cd s11e-protocol
# 3. 安装依赖
npm install
# 4. 配置环境变量
cp .sample.env .env
# 编辑 .env 文件,填入配置
编译合约
npm run compile
运行测试
# 运行所有测试
npm test
# 运行特定测试
npx hardhat test test/core/s11ecore.test.js
# 查看测试覆盖率
npx hardhat coverage
本地部署
# 1. 启动本地节点
npx hardhat node
# 2. 部署合约(新终端)
npx hardhat run scripts/test-deployment.js --network localhost
Sepolia 测试网部署
# 1. 配置环境变量
echo "PRIVATE_KEY=你的私钥" > .env
# 2. 获取测试 ETH
# 访问 https://sepoliafaucet.com/
# 3. 部署核心合约
npx hardhat run scripts/deploy-v1-core-temp.js --network sepolia
# 4. 部署平台合约
npx hardhat run scripts/deploy-platform.js --network sepolia
# 5. 创建品牌 Profile
npx hardhat run scripts/create-brand-profile.js --network sepolia
# 6. 运行资产分发测试
npx hardhat run scripts/test-simple-asset.js --network sepolia
创建第一个 Profile
# 方式1: 使用脚本
export S11E_CORE=0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0
npx hardhat run scripts/create-brand-profile.js --network localhost
# 方式2: 使用 Hardhat Console
npx hardhat console --network localhost
📜 脚本使用指南
脚本组织结构
S11e Protocol 提供了完整的部署和测试脚本,遵循统一的命名规范:
✅ 核心部署脚本
| 脚本 | 用途 | 说明 |
|---|---|---|
deploy-v1-core-temp.js | 部署核心合约 | 部署 S11eCore、S11eProfileFactory、ERC6551Registry、S11eToken |
deploy-platform.js | 部署平台合约 | 部署 AssetFactory、所有 Issuer 模板和 Issuer Factory |
create-brand-profile.js | 创建品牌 Profile | 创建品牌 Profile 并部署专属 Issuers |
⚙️ 辅助脚本
| 脚本 | 用途 | 说明 |
|---|---|---|
setup-profile-factory.js | 设置 ProfileFactory | 确保 ProfileFactory 的实现合约正确设置 |
prepare-tokens.js | 准备测试 Token | 为测试准备足够的 S11eToken 余额和授权 |
🧪 测试脚本
| 脚本 | 用途 | 说明 |
|---|---|---|
test-simple-asset.js | 简化资产分发测试 | ✅ 推荐使用:快速测试资产创建和分发 |
test-asset-distribution.js | 完整资产分发测试 | 详细的端到端测试,包含所有资产类型 |
🔍 检查脚本
| 脚本 | 用途 | 说明 |
|---|---|---|
check-issuer-owner.js | 检查 Issuer Owner | 验证 Issuer 合约的所有者配置 |
check-sepolia.js | 检查 Sepolia 配置 | 验证 Sepolia 测试网配置 |
check-treasury-balance.js | 检查国库余额 | 查询协议国库地址的余额 |
脚本命名规范
所有脚本遵循统一的命名规范,便于识别和维护:
deploy-*.js # 部署相关脚本
test-*.js # 测试相关脚本
setup-*.js # 设置相关脚本
prepare-*.js # 准备相关脚本
check-*.js # 检查相关脚本
完整部署流程
# 步骤 1: 部署核心合约
npx hardhat run scripts/deploy-v1-core-temp.js --network sepolia
# 步骤 2: 设置 ProfileFactory(如果需要)
npx hardhat run scripts/setup-profile-factory.js --network sepolia
# 步骤 3: 部署平台合约
npx hardhat run scripts/deploy-platform.js --network sepolia
# 步骤 4: 准备测试 Token(如果需要)
npx hardhat run scripts/prepare-tokens.js --network sepolia
# 步骤 5: 创建品牌 Profile
npx hardhat run scripts/create-brand-profile.js --network sepolia
# 步骤 6: 运行资产分发测试
npx hardhat run scripts/test-simple-asset.js --network sepolia
常见问题处理
问题 1: connect 方法使用
在 Hardhat 3.0 中,connect 方法仍然存在,但需要注意正确的使用方式:
// ✅ 正确方式 1:直接使用 connect
const contract = await ethers.getContractAt('ContractName', address);
const contractWithSigner = contract.connect(signer);
await contractWithSigner.methodName(...args);
// ✅ 正确方式 2:使用函数选择器(避免重载歧义)
const contract = await ethers.getContractAt('ContractName', address);
const contractWithSigner = contract.connect(signer);
// PassCard 的 mint 方法有两个重载版本,需要使用函数选择器
await contractWithSigner['mint(address,uint256,string)'](...args);
// ✅ 正确方式 3:使用 getFunction
const contract = await ethers.getContractAt('ContractName', address);
const method = contract.getFunction('methodName(type1,type2)');
await method.connect(signer)(...args);
常见错误:
- ❌
badge.connect(...).createEvent()- Badge 没有createEvent方法 - ✅
badge.connect(...).createBadge()- 应使用createBadge和awardBadge
问题 2: 方法调用错误
PassCard 铸造:
// ❌ 错误:PassCard 没有 safeMint 方法
await passCard.safeMint(recipient);
// ✅ 正确:使用 mint 方法(需要指定 tokenId 和 tokenURI)
await passCard['mint(address,uint256,string)'](
recipient,
tokenId,
tokenURI,
{ value: 0 }
);
Badge 创建:
// ❌ 错误:Badge 没有 createEvent 方法
await badge.createEvent(uri);
// ✅ 正确:使用 createBadge 创建徽章类型,然后使用 awardBadge 颁发
await badge.createBadge(
'Test Badge',
'Description',
3, // rarity: 1-5
false, // soulBound
1000, // maxSupply
uri
);
const badgeId = (await badge.badgeCount()) - 1n;
await badge.awardBadge(recipient, badgeId, 1);
问题 3: 网络配置
// ✅ 正确:获取网络和 ethers 实例
const network = await hre.network.connect();
const ethers = network.ethers;
const signers = await ethers.getSigners();
// ✅ 正确:网络名称解析
let networkName = hre.network.name;
if (!networkName || networkName === 'undefined') {
const networkInfo = await ethers.provider.getNetwork();
if (networkInfo.chainId === 11155111n) {
networkName = 'sepolia';
} else {
networkName = `chain-${networkInfo.chainId}`;
}
}
脚本最佳实践
-
使用统一的环境变量
# .env 文件 PRIVATE_KEY=your_private_key TREASURY_ADDRESS=0x... PROFILE_CREATION_FEE_TOKEN=0x... -
检查部署文件存在性
const deploymentFile = path.join(deploymentsDir, `${networkName}-latest.json`); if (!fs.existsSync(deploymentFile)) { throw new Error('未找到部署文件,请先运行部署脚本'); } -
错误处理和日志
try { const tx = await contract.method(); await tx.wait(); console.log('✅ 操作成功'); } catch (error) { console.error('❌ 操作失败:', error.message); throw error; } -
使用现有脚本
- ✅ 优先使用现有的部署和测试脚本
- ❌ 避免创建重复功能的脚本
- ✅ 遵循命名规范,便于维护
🎨 前端集成指南 (Wagmi + React)
什么是 Wagmi?
Wagmi 是一个 React Hooks 库,用于简化 Ethereum 应用开发。它提供了:
- ✅ 钱包连接管理
- ✅ 合约读写操作
- ✅ 交易状态管理
- ✅ 链切换支持
- ✅ TypeScript 类型安全
📦 环境准备
1. 安装依赖
# 创建 React 项目
npm create vite@latest my-brand-dapp -- --template react-ts
cd my-brand-dapp
# 安装 wagmi 和相关依赖
npm install wagmi viem@2.x @tanstack/react-query
npm install @rainbow-me/rainbowkit # 可选:更好的钱包 UI
2. 配置 Wagmi
// src/config/wagmi.ts
import { http, createConfig } from 'wagmi'
import { sepolia, mainnet } from 'wagmi/chains'
import { injected, walletConnect } from 'wagmi/connectors'
export const config = createConfig({
chains: [sepolia, mainnet],
connectors: [
injected(), // MetaMask, Rabby 等
walletConnect({
projectId: 'YOUR_WALLETCONNECT_PROJECT_ID'
}),
],
transports: {
[sepolia.id]: http('https://sepolia.infura.io/v3/YOUR_INFURA_KEY'),
[mainnet.id]: http(),
},
})
3. 配置 App 入口
// src/main.tsx
import React from 'react'
import ReactDOM from 'react-dom/client'
import { WagmiProvider } from 'wagmi'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { config } from './config/wagmi'
import App from './App'
const queryClient = new QueryClient()
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>
</WagmiProvider>
</React.StrictMode>,
)
🔐 钱包连接组件
// src/components/ConnectWallet.tsx
import { useAccount, useConnect, useDisconnect } from 'wagmi'
export function ConnectWallet() {
const { address, isConnected } = useAccount()
const { connect, connectors } = useConnect()
const { disconnect } = useDisconnect()
if (isConnected) {
return (
<div>
<p>已连接: {address}</p>
<button onClick={() => disconnect()}>断开连接</button>
</div>
)
}
return (
<div>
<h3>连接钱包</h3>
{connectors.map((connector) => (
<button
key={connector.id}
onClick={() => connect({ connector })}
>
{connector.name}
</button>
))}
</div>
)
}
📝 合约配置
// src/config/contracts.ts
// S11e Protocol 合约地址 (Sepolia)
export const CONTRACTS = {
S11eCore: '0x68F828b50A78b4Bf5C0B181B0CCfE5D850f2105E',
S11eProfileFactory: '0x41960135A55ff5E2A322E377576098eB12971dD3',
AssetFactory: '0x3234781F07921d07E1923EAAb96fEeb1f6b4d400',
ERC6551Registry: '0x3E2D5A69e77b0F57bA2bd8d19eA436459B186c08',
} as const
// S11eCore ABI(简化版,只包含需要的函数)
export const S11E_CORE_ABI = [
{
name: 'createProfile',
type: 'function',
stateMutability: 'nonpayable',
inputs: [
{
name: 'profile',
type: 'tuple',
components: [
{ name: 'profileType', type: 'string' },
{ name: 'name', type: 'string' },
{ name: 'symbol', type: 'string' },
{ name: 'memberNo', type: 'uint256' },
{ name: 'owner', type: 'address' },
{ name: 'baseURI', type: 'string' },
{ name: 'erc6551Registry', type: 'address' },
{ name: 'externalUri', type: 'string' },
],
},
],
outputs: [{ name: '', type: 'address' }],
},
{
name: 'getProfileAddressByIndex',
type: 'function',
stateMutability: 'view',
inputs: [{ name: 'index', type: 'uint256' }],
outputs: [{ name: '', type: 'address' }],
},
] as const
// S11eProfile ABI
export const S11E_PROFILE_ABI = [
{
name: 'collect',
type: 'function',
stateMutability: 'nonpayable',
inputs: [
{
name: 'asset',
type: 'tuple',
components: [
{ name: 'protocol', type: 'string' },
{ name: 'assetsType', type: 'uint8' },
{ name: 'contractAddress', type: 'address' },
{ name: 'name', type: 'string' },
{ name: 'symbol', type: 'string' },
{ name: 'supply', type: 'uint256' },
{ name: 'externalUri', type: 'string' },
],
},
],
outputs: [{ name: '', type: 'address' }],
},
{
name: 'passCardAddress',
type: 'function',
stateMutability: 'view',
inputs: [],
outputs: [{ name: '', type: 'address' }],
},
{
name: 'digitalPointsAddress',
type: 'function',
stateMutability: 'view',
inputs: [],
outputs: [{ name: '', type: 'address' }],
},
{
name: 'memberList',
type: 'function',
stateMutability: 'view',
inputs: [],
outputs: [{ name: '', type: 'address[]' }],
},
] as const
// PassCard ABI
export const PASSCARD_ABI = [
{
name: 'mint',
type: 'function',
stateMutability: 'nonpayable',
inputs: [{ name: 'to', type: 'address' }],
outputs: [{ name: '', type: 'uint256' }],
},
{
name: 'balanceOf',
type: 'function',
stateMutability: 'view',
inputs: [{ name: 'owner', type: 'address' }],
outputs: [{ name: '', type: 'uint256' }],
},
{
name: 'totalSupply',
type: 'function',
stateMutability: 'view',
inputs: [],
outputs: [{ name: '', type: 'uint256' }],
},
] as const
🚀 创建品牌 Profile
// src/components/CreateProfile.tsx
import { useState } from 'react'
import { useAccount, useWriteContract, useWaitForTransactionReceipt } from 'wagmi'
import { CONTRACTS, S11E_CORE_ABI } from '../config/contracts'
export function CreateProfile() {
const { address } = useAccount()
const [brandName, setBrandName] = useState('')
const [brandSymbol, setBrandSymbol] = useState('')
const {
data: hash,
writeContract,
isPending,
error
} = useWriteContract()
const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({
hash
})
const handleCreate = async () => {
if (!address || !brandName || !brandSymbol) return
try {
writeContract({
address: CONTRACTS.S11eCore,
abi: S11E_CORE_ABI,
functionName: 'createProfile',
args: [{
profileType: 'BRAND',
name: brandName,
symbol: brandSymbol,
memberNo: 0n,
owner: address,
baseURI: 'https://ipfs.s11e.io/',
erc6551Registry: CONTRACTS.ERC6551Registry,
externalUri: `https://mybrand.com/${brandSymbol}`,
}],
})
} catch (err) {
console.error('创建失败:', err)
}
}
return (
<div>
<h2>创建品牌 Profile</h2>
<input
type="text"
placeholder="品牌名称"
value={brandName}
onChange={(e) => setBrandName(e.target.value)}
/>
<input
type="text"
placeholder="品牌符号 (如: COOL)"
value={brandSymbol}
onChange={(e) => setBrandSymbol(e.target.value)}
/>
<button
onClick={handleCreate}
disabled={isPending || isConfirming || !address}
>
{isPending && '等待确认...'}
{isConfirming && '创建中...'}
{!isPending && !isConfirming && '创建 Profile'}
</button>
{isSuccess && (
<div>
<p>✅ Profile 创建成功!</p>
<p>交易哈希: {hash}</p>
</div>
)}
{error && (
<div style={{ color: 'red' }}>
❌ 错误: {error.message}
</div>
)}
</div>
)
}
💳 发行会员卡 NFT
// src/components/IssuePassCard.tsx
import { useState } from 'react'
import { useWriteContract, useWaitForTransactionReceipt } from 'wagmi'
import { S11E_PROFILE_ABI } from '../config/contracts'
import { Address } from 'viem'
interface Props {
profileAddress: Address
}
export function IssuePassCard({ profileAddress }: Props) {
const [supply, setSupply] = useState('10000')
const {
data: hash,
writeContract,
isPending
} = useWriteContract()
const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({
hash
})
const handleIssue = () => {
writeContract({
address: profileAddress,
abi: S11E_PROFILE_ABI,
functionName: 'collect',
args: [{
protocol: 'ERC721',
assetsType: 1, // PassCard
contractAddress: '0x0000000000000000000000000000000000000000',
name: 'Brand Membership Card',
symbol: 'PASS',
supply: BigInt(supply),
externalUri: 'https://mybrand.com/membership',
}],
})
}
return (
<div>
<h3>发行会员卡 NFT</h3>
<input
type="number"
placeholder="发行数量"
value={supply}
onChange={(e) => setSupply(e.target.value)}
/>
<button
onClick={handleIssue}
disabled={isPending || isConfirming}
>
{isPending && '等待确认...'}
{isConfirming && '发行中...'}
{!isPending && !isConfirming && '发行会员卡'}
</button>
{isSuccess && (
<div>
<p>✅ 会员卡发行成功!</p>
<p>交易哈希: {hash}</p>
</div>
)}
</div>
)
}
💰 发行品牌积分
// src/components/IssueDigitalPoints.tsx
import { useWriteContract, useWaitForTransactionReceipt } from 'wagmi'
import { S11E_PROFILE_ABI } from '../config/contracts'
import { Address } from 'viem'
interface Props {
profileAddress: Address
}
export function IssueDigitalPoints({ profileAddress }: Props) {
const { data: hash, writeContract, isPending } = useWriteContract()
const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({ hash })
const handleIssue = () => {
writeContract({
address: profileAddress,
abi: S11E_PROFILE_ABI,
functionName: 'collect',
args: [{
protocol: 'ERC20',
assetsType: 2, // DigitalPoints
contractAddress: '0x0000000000000000000000000000000000000000',
name: 'Brand Points',
symbol: 'BP',
supply: 1000000n, // 100万积分
externalUri: 'https://mybrand.com/points',
}],
})
}
return (
<div>
<h3>发行品牌积分</h3>
<button onClick={handleIssue} disabled={isPending || isConfirming}>
{isPending ? '等待确认...' : isConfirming ? '发行中...' : '发行积分'}
</button>
{isSuccess && <p>✅ 积分发行成功!交易: {hash}</p>}
</div>
)
}
🎖️ 铸造会员卡给用户
// src/components/MintPassCard.tsx
import { useState } from 'react'
import { useWriteContract, useWaitForTransactionReceipt } from 'wagmi'
import { PASSCARD_ABI } from '../config/contracts'
import { Address, isAddress } from 'viem'
interface Props {
passCardAddress: Address
}
export function MintPassCard({ passCardAddress }: Props) {
const [recipient, setRecipient] = useState('')
const { data: hash, writeContract, isPending } = useWriteContract()
const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({ hash })
const handleMint = () => {
if (!isAddress(recipient)) {
alert('请输入有效的以太坊地址')
return
}
writeContract({
address: passCardAddress,
abi: PASSCARD_ABI,
functionName: 'mint',
args: [recipient as Address],
})
}
return (
<div>
<h3>铸造会员卡</h3>
<input
type="text"
placeholder="接收地址 (0x...)"
value={recipient}
onChange={(e) => setRecipient(e.target.value)}
style={{ width: '400px' }}
/>
<button onClick={handleMint} disabled={isPending || isConfirming}>
{isPending ? '等待确认...' : isConfirming ? '铸造中...' : '铸造会员卡'}
</button>
{isSuccess && (
<div>
<p>✅ 会员卡铸造成功!</p>
<p>交易哈希: {hash}</p>
</div>
)}
</div>
)
}
📊 查询资产信息
// src/components/ProfileInfo.tsx
import { useReadContract, useReadContracts } from 'wagmi'
import { S11E_PROFILE_ABI, PASSCARD_ABI } from '../config/contracts'
import { Address } from 'viem'
interface Props {
profileAddress: Address
}
export function ProfileInfo({ profileAddress }: Props) {
// 读取多个合约数据
const { data, isLoading } = useReadContracts({
contracts: [
{
address: profileAddress,
abi: S11E_PROFILE_ABI,
functionName: 'passCardAddress',
},
{
address: profileAddress,
abi: S11E_PROFILE_ABI,
functionName: 'digitalPointsAddress',
},
{
address: profileAddress,
abi: S11E_PROFILE_ABI,
functionName: 'memberList',
},
],
})
// 如果有 PassCard 地址,查询总供应量
const passCardAddress = data?.[0]?.result as Address | undefined
const { data: totalSupply } = useReadContract({
address: passCardAddress,
abi: PASSCARD_ABI,
functionName: 'totalSupply',
query: {
enabled: !!passCardAddress, // 只有当地址存在时才查询
},
})
if (isLoading) return <div>加载中...</div>
const pointsAddress = data?.[1]?.result as Address | undefined
const members = data?.[2]?.result as Address[] | undefined
return (
<div>
<h3>品牌资产信息</h3>
<div>
<p><strong>会员卡地址:</strong> {passCardAddress || '未发行'}</p>
{totalSupply && <p><strong>已铸造数量:</strong> {totalSupply.toString()}</p>}
</div>
<div>
<p><strong>积分合约:</strong> {pointsAddress || '未发行'}</p>
</div>
<div>
<p><strong>成员数量:</strong> {members?.length || 0}</p>
</div>
</div>
)
}
🎨 完整 Dashboard 示例
// src/App.tsx
import { useState } from 'react'
import { useAccount } from 'wagmi'
import { ConnectWallet } from './components/ConnectWallet'
import { CreateProfile } from './components/CreateProfile'
import { IssuePassCard } from './components/IssuePassCard'
import { IssueDigitalPoints } from './components/IssueDigitalPoints'
import { MintPassCard } from './components/MintPassCard'
import { ProfileInfo } from './components/ProfileInfo'
import { Address } from 'viem'
function App() {
const { isConnected } = useAccount()
const [profileAddress, setProfileAddress] = useState<Address | null>(null)
const [passCardAddress, setPassCardAddress] = useState<Address | null>(null)
return (
<div style={{ padding: '20px', maxWidth: '800px', margin: '0 auto' }}>
<h1>🚀 S11e Protocol 品牌管理面板</h1>
{/* 步骤 1: 连接钱包 */}
<section>
<ConnectWallet />
</section>
{isConnected && (
<>
{/* 步骤 2: 创建 Profile */}
{!profileAddress && (
<section>
<CreateProfile />
</section>
)}
{/* 步骤 3: 管理资产 */}
{profileAddress && (
<>
<section>
<h2>品牌资产管理</h2>
<ProfileInfo profileAddress={profileAddress} />
</section>
<section>
<IssuePassCard profileAddress={profileAddress} />
</section>
<section>
<IssueDigitalPoints profileAddress={profileAddress} />
</section>
{passCardAddress && (
<section>
<MintPassCard passCardAddress={passCardAddress} />
</section>
)}
</>
)}
</>
)}
</div>
)
}
export default App
⚠️ 常见错误处理
// src/utils/errorHandler.ts
import { BaseError, ContractFunctionRevertedError } from 'viem'
export function handleError(error: unknown): string {
if (error instanceof BaseError) {
// 处理合约 revert 错误
const revertError = error.walk(err => err instanceof ContractFunctionRevertedError)
if (revertError instanceof ContractFunctionRevertedError) {
const errorName = revertError.data?.errorName ?? ''
// 常见错误翻译
const errorMessages: Record<string, string> = {
'ProfileFactory not set': '❌ 资产工厂未配置',
'AssetFactory not set': '❌ 资产工厂未设置',
'Unsupported asset type': '❌ 不支持的资产类型',
'Only owner': '❌ 仅限所有者操作',
'Blacklisted': '❌ 地址已被拉黑',
'Invalid address': '❌ 无效的地址',
}
return errorMessages[errorName] || `❌ 合约错误: ${errorName}`
}
}
// 处理用户拒绝
if (error instanceof Error) {
if (error.message.includes('User rejected')) {
return '❌ 用户取消了交易'
}
if (error.message.includes('insufficient funds')) {
return '❌ 余额不足,请充值 ETH'
}
}
return '❌ 未知错误,请重试'
}
// 使用示例
import { handleError } from '../utils/errorHandler'
try {
await writeContract({...})
} catch (error) {
const message = handleError(error)
alert(message)
}
🔔 交易通知组件
// src/components/TransactionToast.tsx
import { useEffect } from 'react'
import { useWaitForTransactionReceipt } from 'wagmi'
interface Props {
hash?: `0x${string}`
onSuccess?: () => void
}
export function TransactionToast({ hash, onSuccess }: Props) {
const { isLoading, isSuccess, isError } = useWaitForTransactionReceipt({
hash
})
useEffect(() => {
if (isSuccess && onSuccess) {
onSuccess()
}
}, [isSuccess, onSuccess])
if (!hash) return null
return (
<div style={{
position: 'fixed',
bottom: '20px',
right: '20px',
padding: '15px',
borderRadius: '8px',
background: isLoading ? '#ffa500' : isSuccess ? '#4caf50' : '#f44336',
color: 'white',
}}>
{isLoading && '⏳ 交易确认中...'}
{isSuccess && '✅ 交易成功!'}
{isError && '❌ 交易失败'}
<div style={{ fontSize: '12px', marginTop: '5px' }}>
<a
href={`https://sepolia.etherscan.io/tx/${hash}`}
target="_blank"
rel="noopener noreferrer"
style={{ color: 'white' }}
>
查看交易详情 ↗
</a>
</div>
</div>
)
}
🎯 最佳实践
1. 使用 TypeScript
// 为合约调用提供类型安全
import { Address } from 'viem'
interface ProfileStruct {
profileType: string
name: string
symbol: string
memberNo: bigint
owner: Address
baseURI: string
erc6551Registry: Address
externalUri: string
}
2. 错误边界处理
// 始终处理可能的错误
const { data, error, isLoading } = useReadContract({
address: profileAddress,
abi: S11E_PROFILE_ABI,
functionName: 'passCardAddress',
})
if (isLoading) return <div>加载中...</div>
if (error) return <div>错误: {error.message}</div>
if (!data) return <div>暂无数据</div>
3. Gas 优化
// 批量读取数据,减少 RPC 调用
const { data } = useReadContracts({
contracts: [
{ address: addr1, abi: abi1, functionName: 'func1' },
{ address: addr2, abi: abi2, functionName: 'func2' },
],
})
4. 交易确认反馈
// 提供清晰的交易状态反馈
{isPending && '⏳ 请在钱包中确认...'}
{isConfirming && '⏳ 交易确认中 (1/3 确认)...'}
{isSuccess && '✅ 交易成功!'}
📱 响应式设计示例
// src/components/ResponsiveDashboard.tsx
import { useState } from 'react'
import { useAccount, useConnect } from 'wagmi'
export function ResponsiveDashboard() {
const { isConnected } = useAccount()
const { connect, connectors } = useConnect()
return (
<div style={{
display: 'flex',
flexDirection: 'column',
gap: '20px',
padding: '20px',
maxWidth: '1200px',
margin: '0 auto',
}}>
{/* Header */}
<header style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
padding: '20px',
background: '#f5f5f5',
borderRadius: '12px',
}}>
<h1>🎨 S11e Protocol</h1>
{isConnected ? (
<button>已连接</button>
) : (
<button onClick={() => connect({ connector: connectors[0] })}>
连接钱包
</button>
)}
</header>
{/* Main Content Grid */}
<div style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))',
gap: '20px',
}}>
<Card title="创建 Profile">
{/* CreateProfile 组件 */}
</Card>
<Card title="发行资产">
{/* IssueAssets 组件 */}
</Card>
<Card title="资产统计">
{/* ProfileInfo 组件 */}
</Card>
</div>
</div>
)
}
function Card({ title, children }: { title: string, children: React.ReactNode }) {
return (
<div style={{
padding: '20px',
background: 'white',
borderRadius: '12px',
boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
}}>
<h3>{title}</h3>
{children}
</div>
)
}
🚀 部署前端应用
# 构建生产版本
npm run build
# 部署到 Vercel
npm install -g vercel
vercel --prod
# 或部署到 Netlify
npm install -g netlify-cli
netlify deploy --prod
🎖️ 总结
S11e Protocol 是什么?
S11e Protocol 是一个专注于品牌数字资产管理的 Web3 基础设施解决方案,它提供了:
✅ 完整的身份系统
- 品牌身份(S11eIP - SBT)
- 个人身份(S11eAvatar)
- 动态信誉体系
✅ 强大的资产管理
- 💰 同质化通证:SE Token、品牌积分(ERC-20)
- 🖼️ NFT 资产:PFP、徽章、会员卡(ERC-721/1155)
- 🎫 POAP:活动证明、成就记录
- 💳 Token Bound Account:NFT 可持有资产(ERC-6551)
✅ 灵活的会员体系
- 多层级会员管理
- 积分激励系统
- 权益自动分配
- 成就徽章系统
✅ 模块化架构
- 可插拔资产模块
- 标准化接口
- 易于扩展
- 第三方集成
✅ 企业级安全
- OpenZeppelin 5.4.0 标准库
- 多层安全防护机制
- 84% 测试覆盖率
- 权限控制和紧急暂停
为什么选择 S11e Protocol?
| 优势 | 说明 |
|---|---|
| 🚀 快速部署 | 克隆模式节省 87% Gas,降低成本 |
| 💎 多种资产 | 支持 ERC-20/721/1155/6551 |
| 🔐 安全可靠 | OpenZeppelin 标准库 + 多层防护 |
| 🧩 灵活扩展 | 模块化设计,按需组合 |
| 🔄 可升级 | 安全升级机制,持续优化 |
| 📊 测试完善 | 84% 测试覆盖率,91+ 用例 |
| 📚 文档完整 | 50+ KB 详细文档,快速上手 |
核心价值主张
让品牌数字资产管理更简单
通过 S11e Protocol,品牌可以:
- 🎯 快速创建品牌数字身份
- 💎 轻松发行多种数字资产(Token/NFT/积分)
- 💳 灵活管理会员权益体系
- 📊 透明追踪资产流转和分配
- 🔐 安全托管品牌数字资产
愿景
用智能合约重新定义品牌资产管理
通过 S11e Protocol,我们致力于:
- 🌟 降低门槛:让品牌轻松管理数字资产
- 🔗 连接价值:将品牌资产与用户权益深度绑定
- 💎 透明可信:链上记录,公开透明
- 🚀 创新模式:探索品牌资产的更多可能性
- 🔥 赋能未来:构建 Web3 品牌资产管理标准
三大核心价值
价值一:将品牌价值结构化为可确权的 Brand RWA
传统品牌估值来自品牌溢价、市场认知、财务预测、流量规模,但这些都不可验证、不可拆分。
S11e Protocol 通过 Brand RWA 标准,将品牌价值结构化为五类可验证资产:
| RWA 类型 | 说明 | 应用场景 |
|---|---|---|
| 交易类 RWA | 销售、复购、GMV | 消费行为转化为可证明资产 |
| 用户贡献类 RWA | 内容、传播、活动参与 | 用户贡献沉淀为权益 |
| 商户贡献类 RWA | 让利、服务、履约 | 商户参与品牌建设获得回报 |
| 运营贡献类 RWA | 组织、治理、社区建设 | 运营方成为生态增长的利益方 |
| 实物资产类 RWA | 库存、商品、供应链 | 实物资产链上确权 |
这使得品牌第一次具有"结构化、可衡量、可验证"的资产基础。
价值二:通过智能合约,让价值自动回到贡献者手中
S11e Protocol 的分配机制:
真实行为 → 链上数据 → 贡献值 → 权益资产 → 可流通的品牌价值
整个链路透明、可审计、不可篡改。
这意味着:
- 👥 用户不再只是消费者,而是品牌权益持有人
- 🏪 商户不再只是服务方,而是品牌建设者
- ✍️ 内容创作者不再只是"免费打工",而是共同获利参与者
- 🎯 运营方不再只是执行者,而是生态增长的利益方
一句话:S11e 让品牌增长的红利从资本中心化回流到贡献者。
价值三:让品牌成为一个可自治、可扩张、可共创的网络
最终,S11e 构建的不仅是品牌价值系统,而是 Brand DAO(品牌自治网络)。
在这个网络中:
- ✅ 权益由社区共持:品牌资产由所有贡献者共同拥有
- ✅ 决策由贡献者治理:品牌未来方向由社区共识决定
- ✅ 价值由整个生态推动:增长红利自动分配给贡献者
- ✅ 资产沉淀在链上:不被平台与企业垄断
- ✅ 品牌由参与者共同维护:像比特币网络一样去中心化
S11e 构建的是一种去平台化、去中心化、去资本垄断的品牌未来。
为什么 Web3 时代的品牌必须走向 S11e 网络?
因为未来的品牌竞争不再是:
- ❌ 谁的营销更强
- ❌ 谁的流量更便宜
- ❌ 谁的渠道更丰富
而是:
- ✅ 谁能把价值分配得更公平
- ✅ 谁能让用户真正参与品牌建设
- ✅ 谁能让社区成为品牌最大的资产
品牌即社区,社区即价值网络。
S11e Protocol 恰恰是这个网络的基础设施。
结语:S11e Protocol 不仅是技术,更是一种新的品牌文明
品牌的本质是信任。
社区的本质是共识。
区块链的本质是规则。
当三者结合——品牌不再是企业的故事,而是社区的资产。
最终我们将看到:
- 🏗️ 品牌由用户共同创建:所有贡献者都是品牌的建设者
- 💎 价值由生态共同分享:增长红利自动分配给贡献者
- 📈 增长由社区共同维护:品牌未来由社区共识决定
- 🔐 资产由链上共同确权:品牌资产不被平台与企业垄断
这就是 S11e Protocol 想要重塑的世界:
一个品牌不再属于某个人,而是属于所有创造它的人。
而这,正是 Web3 品牌的终局。
🔍 与其他协议对比
功能对比表
| 功能 | S11e Protocol | ERC-1155 | ERC-6551 | Lens Protocol | ENS |
|---|---|---|---|---|---|
| 品牌身份管理 | ✅ | ❌ | ❌ | ✅ | ❌ |
| 会员卡 NFT | ✅ | ⚠️ 需自定义 | ⚠️ 需自定义 | ❌ | ❌ |
| 积分系统 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 徽章系统 | ✅ | ✅ | ⚠️ 需集成 | ✅ | ❌ |
| TBA 集成 | ✅ | ❌ | ✅ | ❌ | ❌ |
| 多资产支持 | ✅ | ✅ | ⚠️ 需集成 | ⚠️ 需集成 | ❌ |
| 克隆模式 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 费用优化 | ✅ 87% | ❌ | ❌ | ❌ | ❌ |
| 模块化设计 | ✅ | ❌ | ❌ | ⚠️ 部分 | ❌ |
适用场景对比
| 场景 | S11e Protocol | 其他方案 | 优势 |
|---|---|---|---|
| 品牌会员系统 | ✅ 完美适配 | ⚠️ 需大量开发 | 开箱即用 |
| 积分系统 | ✅ 内置支持 | ⚠️ 需自建 | 完整生态 |
| 活动门票 | ✅ 原生支持 | ⚠️ 需自定义 | Ticket 系统 |
| POAP 发放 | ✅ 原生支持 | ⚠️ 需第三方 | Soulbound |
| 资产管理 | ✅ TBA 集成 | ⚠️ 需手动管理 | 自动化 |
技术优势对比
| 维度 | S11e Protocol | 传统方案 | 优势 |
|---|---|---|---|
| Gas 成本 | 70,000 Gas | 520,000 Gas | 节省 87% |
| 部署时间 | 1 分钟 | 5-10 分钟 | 快 5-10 倍 |
| 开发成本 | 低(开箱即用) | 高(需开发) | 节省 80%+ |
| 维护成本 | 低(模块化) | 高(耦合) | 降低 60% |
| 扩展性 | 高(可插拔) | 中(需重构) | 灵活扩展 |