Skip to content

Repository files navigation

BabySteps · 成长星球

BabySteps 是一个运行在 Sepolia 测试链上的亲子成长 DApp 概念验证:家庭成员用 钱包记录喂养、散步和共读等日常活动,获得可赠送的成长星,并共同培育一个随累计 成长值变化的星宝形象。

在线体验:https://babysteps-83x.pages.dev/

备用镜像:https://tiancheng-xu.github.io/babysteps/

品牌域名:https://babysteps.baby2b.online/(等待注册商完成域名开通后绑定)

产品体验

  • 三类成长活动:喂养、散步、共读分别获得 3、5、7 枚成长星。
  • 活动存在符合婴幼儿生活节奏的冷却时间;不可领取时按钮禁用,不展示精确倒计时。
  • 累计成长值只因本人记录活动而增长,用来驱动星宝阶段,赠送后不会减少。
  • 可转余额可以赠送给其他 Sepolia 钱包,收到的成长星也可以再次赠送。
  • 链上便签允许保存一条公开文字,并明确提醒公开区块链不可删除历史记录。

成长活动的 ABI 枚举顺序固定为 Meal = 0Walk = 1Read = 2。每日限制按 UTC+8 计算;合约保存 dayId + 1,避免当天编号和 Solidity mapping 默认值 0 混淆。

产品需求文档(PRD)

  • 版本: 1.0
  • 阶段: Sepolia 公开概念验证
  • 形态: 响应式单页 DApp 产品定义: 让成年照护者把细小、重复的陪伴行为转化为温和、可积累的反馈,并 通过原创虚拟伙伴看到共同成长。

BabySteps 不是儿童档案、健康服务、育儿建议、投资产品或 NFT 项目,也不能证明 某项现实活动确实发生。

目标用户

用户 主要需求 产品响应
宝爸宝妈 快速记录日常陪伴并看到轻量反馈 三张活动卡、清晰状态、即时链上证据
爷爷奶奶 在不熟悉 Web3 的情况下逐步操作 大字号、大按钮、顺序式流程、少术语
家庭成员 把获得的成长星送给另一个测试钱包 独立余额、地址校验、不可撤回提醒
技术面试官与开发者 理解真实 DApp 的架构与工程质量 公开源码、自动测试、链上交易与源码验证

所有目标用户均为成年人;界面温暖亲子友好,但不是供儿童独立使用的应用。

产品目标

  • 用户无需先理解区块链细节,也能完成“连接钱包 → 记录陪伴 → 确认交易 → 星宝成长”。
  • 每次可执行操作都明确、安全,并区分等待签名、链上确认、成功和失败。
  • 用户能准确区分累计成长值与可赠送成长星。
  • 通过随机冷却营造虚拟伙伴的生活节奏,但不把游戏状态解释成真实婴儿需求。
  • 在桌面端、移动端和辅助技术下提供一致的主流程。
  • 用公开合约、交易记录和可重复构建证明系统运行在 Sepolia,而不是本地模拟数据。

非目标

当前版本不包含:

  • 主网、真实货币、价格、收益、挖矿、空投、质押、兑换或提现;
  • ERC-20 交易、NFT 市场、资产组合、排行榜、商城、抽奖或付费功能;
  • 儿童姓名、照片、生日、学校、位置、健康、疫苗、喂养量或作息数据;
  • 根据真实孩子生成头像,或对孩子发育、能力和表现进行评价;
  • 登录注册、中心化 API、数据库、社交动态或聊天;
  • 现实活动真实性证明、婴儿需求判断或育儿提醒。

核心用户旅程

  1. 用户阅读 Sepolia、公链公开和隐私提示。
  2. 用户连接 MetaMask;如果网络不正确,切换到 Sepolia。
  3. 页面读取该钱包的累计成长值、可赠送余额、星宝阶段和三个活动状态。
  4. 用户只在活动可领取时点击“记录这次陪伴”,在 MetaMask 中签名并等待 receipt。
  5. receipt 成功后页面重新读取链上状态,展示奖励与新的星宝阶段。
  6. 用户可输入另一个 Sepolia 地址和正整数数量,赠送部分成长星。
  7. 用户可读取、覆盖或清空自己的公开链上便签,并理解历史内容仍可从链上查询。

功能需求

1. 钱包与网络

  • 支持识别 MetaMask 未安装、未连接、连接中、网络错误、已连接和读取失败。
  • 已连接时展示缩略地址和 Sepolia 标识;网络错误时提供切换入口。
  • 连接和交易过程不得读取、收集或保存助记词与私钥。

2. 双账本成长星

  • 累计成长值只因当前钱包完成活动而增加,决定星宝阶段,赠送时不减少。
  • 可赠送成长星随活动增加,随赠送减少,接收赠送时增加。
  • 收到的成长星不得增加累计成长值或伪造活动记录。

3. 星宝成长阶段

累计成长值 阶段 视觉含义
0–2 星蛋 Egg 温暖发光的星蛋
3–7 星芽 Sprout 长出嫩芽或小触角
8–14 探索星宝 Explorer 带探索包或小围巾
≥15 闪耀星宝 Star 进入阅读角并戴上故事帽

首轮进度为 min(累计成长值, 15) / 15,最高显示 100%。达到 15 后显示“首轮养成 已完成”,真实累计值继续增长,但当前版本不承诺第二轮形态。星宝是原创通用伙伴, 不代表孩子本人,也不复制现有虚拟养成产品 IP。

4. 活动与随机冷却

活动 单次奖励 随机冷却 UTC+8 每日上限 冷却文案
喂养陪伴 +3 3–4 小时 6 次 星宝现在还不饿
户外陪伴 +5 8–12 小时 2 次 星宝正在休息
亲子共读 +7 4–6 小时 3 次 星宝还在回味故事
  • 可领取时显示“记录这次陪伴”。
  • 冷却中和达到每日上限时不显示领取按钮;每日上限文案为“星宝今天已经很充实了”。
  • 页面、隐藏文本和无障碍标签均不展示下次领取时刻、倒计时或剩余时间。
  • 读取失败或状态未知时不显示领取按钮,只提供重试入口。
  • 持续声明:随机游戏状态不代表真实婴儿的饥饿、睡眠或活动需求。
  • 冷却和每日上限由合约校验,不能只依赖浏览器时间或前端按钮。

5. 赠送成长星

  • 展示可赠送余额、Sepolia 标识、双账本说明和公开不可撤回警告。
  • 只接受有效的非零 Sepolia 地址和不超过余额的正整数数量。
  • 拒绝零地址、当前钱包地址、零数量、余额不足和格式错误。
  • 成功后重新读取双方相关状态,并提供 Etherscan 交易链接。
  • 不要求接收者姓名、备注或任何儿童资料,不显示法币换算。

6. 公开链上便签

  • 每个钱包拥有独立当前便签,支持读取、覆盖和清空。
  • 输入按 UTF-8 限制为 280 字节,并显示实时字节计数。
  • 清空前提供二次确认;清空只改变当前状态,不宣称删除历史交易。
  • 所有成功状态必须等待 receipt,随后重新读取合约状态。
  • 示例内容不得包含儿童身份、健康、位置或联系方式。

状态与反馈

场景 必须展示的状态
钱包 未安装、未连接、连接中、错误网络、已连接、读取失败
活动 读取中、可领取、冷却、每日上限、等待签名、确认中、成功、拒签、失败
赠送 默认、字段错误、余额不足、等待签名、确认中、成功、拒签、链上失败
便签 读取中、默认、字节超限、等待签名、确认中、成功、失败、清空确认

交易哈希只代表交易已经广播。界面必须在 receipt 成功后才显示成功并刷新余额、阶段、 活动状态或便签;用户拒签或交易失败时不得在本地乐观增加积分。

信息架构与视觉

页面保持单页纵向故事流:Hero 与 Sepolia 提示 → 三项隐私须知 → 连接钱包 → 星宝与 活动 → 赠送成长星 → 公开链上便签 → 技术能力说明。桌面端最大内容宽度约 1120–1200 px;移动端为单列,并保持同一阅读顺序。

视觉采用温暖绘本、可信、适老和轻量 Web3 方向:奶油纸背景、深海蓝绿轮廓、鼠尾草 绿、杏橙与少量柔和紫。避免黑色霓虹、K 线、金币雨和交易所风格。所有插画与星宝 形象均为原创。

非功能需求

  • 320 px 宽度不产生水平滚动,主要点击区域不小于 48 × 48 px。
  • 正文桌面端建议至少 18 px,辅助文字不低于 16 px,适合中老年照护者阅读。
  • 颜色对比满足 WCAG AA;状态不能只靠颜色表达。
  • 钱包扩展之外的页面操作支持键盘,交互具有清晰 focus-visible
  • 动态状态提供可读文字和 aria-live,进度条提供名称、范围与当前值。
  • 支持 prefers-reduced-motion,关闭漂浮、呼吸和庆祝动画。
  • 静态资源可在 Cloudflare Pages、GitHub Pages 默认路径和自定义子域名下正确加载。
  • 仓库与发布产物不得包含私钥、助记词、RPC 密钥或源码验证密钥。

数据与隐私边界

链上只记录钱包地址、活动枚举、日期编号、积分、赠送关系和用户主动输入的公开便签。 任何人都可能长期查看这些数据。产品不采集儿童资料,也不把钱包活动解释成现实照护 质量。用户应只使用不持有真实资产的专用测试钱包。

产品完成标准

  • 桌面端、390 px 移动端和 320 px 窄屏均保留完整主流程且无横向溢出。
  • 用户可以连接 MetaMask、识别或切换 Sepolia,并从合约读取真实状态。
  • 三项活动准确奖励 3、5、7;冷却与每日上限时完全不渲染领取按钮。
  • 任意页面文本、辅助文本或状态不泄露具体冷却时间。
  • 累计成长值和可赠送余额独立,赠送不会改变星宝阶段。
  • 无效地址、自己地址、零地址、非正整数和余额不足均被拒绝且不改变链上状态。
  • 便签支持读取、覆盖、刷新恢复、280 字节限制和二次确认清空。
  • 所有写操作区分等待签名、确认中、成功与失败,并只在 receipt 成功后刷新。
  • 页面没有儿童身份、照片、健康或位置入口,也没有价格、收益、兑换或 NFT 市场语言。
  • 合约测试、前端测试、静态检查、类型检查、生产构建和公开产物扫描全部通过。
  • 合约地址、部署交易和源码验证可以在 Sepolia 浏览器中独立核对。

DApp 如何工作

Solidity 合约是公开运行的后端,React 前端通过 wagmi 和 ABI 与它交互:

  • 读取使用 call,不改变链上状态,也不要求钱包支付 gas;
  • 写入需要钱包签名,并使用少量 Sepolia 测试 ETH 支付 gas;
  • transaction hash 只说明交易已广播,成功 receipt 才代表链上确认。

已部署的旧版成长星不是 ERC-20,继续作为只读学习证据保留。正在开发的 Web3 成长任务市场把新成长奖励改为标准 ERC-20 BabyCoin,并使用 ERC-721 + ERC-5192 不可转让成长证书; 两者只用于 Sepolia 测试网功能演示,没有真实价值,不提供提现或收益承诺。

技术栈

  • 前端:Vite、React、TypeScript、wagmi、viem
  • 合约:Solidity、Hardhat
  • 网络:Ethereum Sepolia(chain ID 11155111
  • 质量保障:Vitest、Hardhat Test、Biome、TypeScript
  • 发布:Cloudflare Pages 主站、GitHub Actions/Pages 备用镜像、自定义子域名

本地运行

需要 Node.js 22 和 pnpm 11:

pnpm install --frozen-lockfile
pnpm check
pnpm test
pnpm typecheck
pnpm build
pnpm --filter @babysteps/web dev

生产构建会使用已经公开部署的 Sepolia 合约地址。本地开发若要显式指定地址,可在 被 Git 忽略的 web/.env.local 中写入:

VITE_ONCHAIN_NOTEBOOK_ADDRESS=0xeb7216D50a2708a59fef5322e452e34382aFCDaD

Sepolia 凭据

RPC、部署账户和源码验证凭据只通过 Hardhat 的交互式 keystore 提示输入,不写入 命令参数、环境文件、聊天、截图、日志或 Git:

pnpm --filter @babysteps/contracts exec hardhat keystore set SEPOLIARPCURL
pnpm --filter @babysteps/contracts exec hardhat keystore set SEPOLIAPRIVATEKEY
pnpm --filter @babysteps/contracts exec hardhat keystore set ETHERSCANAPIKEY

只使用不持有真实资产的专用测试钱包。旧版 Notebook 合约没有构造参数;确认网络、 账户余额和准备公开的源码后,可以部署并请求 Etherscan 验证:

pnpm --filter @babysteps/contracts deploy:sepolia
pnpm --filter @babysteps/contracts deploy:verify:sepolia

Web3 成长任务市场

新架构由四个生产合约组成:

  • BabyCoin:可花费的 ERC-20 测试币;只有活动奖励增加 lifetimeEarned
  • GrowthActivities:Meal、Walk、Read 的奖励、冷却和 UTC+8 每日上限。
  • TaskMarketplace:Provider 上架、Chainlink VRF v2.5 锁定 2–4 BABY 价格与开放时长、 approve → buy → transferFrom 购买,以及 Oracle 完成确认。
  • GrowthCertificate:每笔已完成购买最多一张标准 ERC-721 证书。

本地模块会部署 Mock VRF Coordinator,因此无需测试网凭据即可验证完整部署图:

pnpm --filter @babysteps/contracts deploy:web3:local

Sepolia 部署参数均为公开链上配置,不包含私钥。部署脚本使用 Chainlink VRF v2.5 官方 Sepolia Coordinator 与 gas lane,以原生测试 ETH 创建并注资 subscription, 随后把部署出的 TaskMarketplace 加为 consumer:

pnpm --filter @babysteps/contracts deploy:web3:closed-loop:sepolia

这个单一命令会在终端静默读取一次 keystore 密码,依次完成部署前核对、VRF subscription 创建与注资、四合约部署、consumer 授权;若 keystore 已有 ETHERSCANAPIKEY,还会继续执行源码验证。命令可在 RPC 中断后安全续跑,会复用已经 生成的 subscription 与 Ignition 部署状态;密码不会写入命令历史、日志或文件。

prepare:vrf:sepolia 默认把 subscription 的原生测试 ETH 余额补足到 0.03 ETH, 并生成被 Git 忽略的参数文件。若已有同一部署钱包持有的 subscription,可仅在当前 命令环境设置公开的 VRF_SUBSCRIPTION_ID 后复用,脚本会先核对 owner。

前端部署完成后,在本地 web/.env.local 填写四个公开合约地址;变量名见 web/.env.example。Sepolia 演示模块会把 Provider 与 Oracle 角色授予部署测试钱包, 便于完成演示闭环;正式多用户环境必须改为单独审核与授权。

已部署的 Sepolia 合约

文档

所有公开地址和交易均为测试链证据。仓库不保存钱包私钥、RPC 凭据、API Key 或 儿童的真实姓名、照片、位置及健康数据。

About

A Sepolia family growth DApp built with React, Wagmi and Solidity

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages