返回项目展示

Depaify - 去中心化非托管加密货币支付网关

已通过
截图 1

项目描述

Depaify|钱包直接付款,智能合约结算。项目概述Depaify 是基于 Monad 的非托管稳定币订单收款应用。商家连接钱包、填写金额,即可为订单生成独立付款地址;客户使用普通钱包转账 USDT,系统自动匹配链上付款;商家通过一笔合约交易,将多个订单地址的余额归集到自己的钱包。无需为每笔订单管理私钥,也无需让付款人接入专用支付协议。当前实现运行于 Monad Testnet,使用测试 USDT。为什么做 Depaify商家接受链上付款时,除了收钱,还需要解决“这笔转账对应哪张订单”和“分散的资金如何统一结算”。共用收款地址需要额外匹配订单;为每单创建普通钱包又会带来私钥管理和逐个地址支付 Gas 的负担。Depaify 将每张订单绑定到一个可预计算的合约地址。客户只需完成熟悉的钱包转账,商家在需要时统一归集资金,让订单收款和链上结算形成一个完整流程。核心功能一单一地址:通过 CREATE2 预计算付款地址,以地址关联订单,不依赖付款备注。普通钱包直接付款:使用标准 USDT 转账,无需额外 approve,也无需支持 x402 的客户端。平台不托管资金:订单地址与商家钱包绑定,合约只能将余额转给对应商家;后端不持有收款私钥。自动识别到账:索引 USDT Transfer,按付款地址和金额派生订单状态,前端每 2 秒轮询更新。按需批量结算:有余额的订单地址在首次结算时才部署钱包合约,多个地址可在一笔交易中归集。以后端为订单数据源:刷新或切换商家钱包后重新查询订单。合约不收取平台手续费,付款和结算仍需支付链上 Gas。工作原理商家创建订单,API 生成随机 salt,预计算 CREATE2 地址,并保存订单与付款地址。客户使用普通钱包,向订单地址转入指定数量的 USDT。Ponder 索引链上的 Transfer 事件和地址余额,API 查询并返回订单到账状态和可结算余额。商家请求结算参数,由自己的钱包签名并调用 Factory.batchSettleERC20。Factory 按需部署订单钱包,将多个订单地址的余额归集至绑定的商家钱包;索引器同步结算与余额变化。订单地址由 Factory、钱包 implementation、随机 salt 和商家地址共同确定。地址在钱包合约部署前就可以接收 ERC-20;创建订单只写数据库,不发送链上交易。Factory 首次结算时部署对应的 ERC-1167 钱包,并将实际代币余额全部转给绑定的商家。后续收款复用已部署的钱包。合约允许任何人支付 Gas 触发结算,但调用者不能把资金改付给其他地址。Monad 是这条支付流程的执行网络:客户转账、订单钱包部署和批量归集均在 Monad 上完成。批量归集适合商家多订单收款场景;本项目尚未提供吞吐量或 Gas 节省比例的实测结论。演示流程准备一个商家钱包和一个付款钱包,切换到 Monad Testnet。付款钱包需要测试 USDT 和支付 Gas 的测试 MON,商家钱包需要测试 MON 用于结算。创建订单:打开首页,连接商家钱包,进入“创建订单”,填写金额(例如 1.00 USDT)。可重复创建多笔。钱包付款:复制订单付款地址,在付款钱包内单次转入准确数量的测试 USDT。查看到账:等待索引更新,订单由“待付款”变为“已付款”。刷新页面仍能从后端查询到订单。批量结算:连接商家钱包,进入结算页,查看可结算金额并确认合约交易。验证结果:查看交易链接、商家钱包到账及索引余额更新。归集后的订单仍保留“已付款”记录。技术架构页面与钱包:Next.js、React、Tailwind CSS、coss UI、wagmi、viem、ConnectKit,负责创建订单、展示到账状态、钱包连接与结算签名。支付 API:Next.js Route Handlers、Drizzle、PostgreSQL,负责保存订单、查询付款与余额、生成结算交易参数。链上索引:Ponder,索引 USDT Transfer 和 Factory Settled,维护地址余额。智能合约:Solidity、OpenZeppelin、Monad Foundry,实现 CREATE2 地址、订单钱包、单笔与批量归集。工程管理:Vite+、pnpm workspace,统一开发、构建与测试调度。项目包含三个 workspace:apps/frontend(页面、支付 API、数据库迁移)、apps/contract(Factory / Wallet 合约、部署脚本与测试)、apps/indexer(链上事件、余额索引与 GraphQL)。网络与合约配置网络:Monad Testnet,Chain ID:10143。测试 USDT(6 位精度):0x7091021AdFE52be20409921eF645C9Ef580BE3cBFactory:0x77275b8f66843a7DA97Bbd354fcd84A49202e556Wallet implementation:0xE9aea8DD58e613Bc1bb3779CEE2D4DD9f62AC480默认 RPC:https://testnet-rpc.monad.xyz以上地址来自当前代码与环境示例,演示须使用相互匹配的配置。如自行部署新 Factory,需同步更新前端服务端配置、Indexer 的 FACTORY_ADDRESS,以及 apps/frontend/src/lib/payment.ts 中的 Factory 校验地址。新 Factory 对应新的付款地址。本地安装与运行需要 Node.js 22.18.0 或以上、Vite+ CLI 和 PostgreSQL。pnpm 版本由根目录 package.json 管理。安装依赖并复制环境配置:vp install cp apps/frontend/.env.example apps/frontend/.env.local cp apps/indexer/.env.example apps/indexer/.env.local创建项目专用 PostgreSQL 数据库。示例沿用数据库名 monad_blitz,它与项目文件夹名称无关,也可使用其他名称。两份 .env.local 的 DATABASE_URL 必须指向同一数据库,数据库用户需能创建 schema、读写表。前端的 FACTORY_ADDRESS 与 Indexer 的值必须一致;前端 IMPLEMENTATION_ADDRESS 必须与该 Factory 匹配。apps/indexer/.env.example 的 Factory 默认为空,需要填写上述地址或自行部署的地址。WalletConnect Project ID 可选;不填写时仍可使用浏览器注入钱包。应用数据库迁移:vp run db:migrate先在终端一启动索引器,待其就绪后再付款:vp run dev:indexer在终端二启动页面与 API:vp run dev访问 http://localhost:3000。页面与 API 共用 Next.js 服务,无需独立后端。Indexer 默认提供 http://localhost:42069/graphql。测试与验证先安装项目指定的 Monad Foundry,再运行检查、测试和构建:vp run @depaify/contract#setup cp apps/contract/.env.example apps/contract/.env vp run readyready 执行代码检查、合约格式检查、各 workspace 测试和构建。API 测试会启动临时 PostgreSQL,需要 PATH 中可用的 initdb、pg_ctl,或通过 POSTGRES_BIN 指定它们所在的目录。单独运行链路集成与测试网 fork 验证:vp run @depaify/indexer#test:integration vp run @depaify/contract#test:fork仓库中的测试覆盖部署前收款、批量归集、失败回滚、付款状态派生、余额计算和重组处理。API 测试还检查 purge 后订单为空、余额为零且不能生成结算交易。集成测试使用临时数据库和本地链;fork 测试需要测试网 RPC,不广播测试网交易。当前范围当前是 Monad Testnet 演示,支持指定测试 USDT;不提供法币收款、兑换、退款或银行出金。“已付款”要求一笔转账与订单金额完全相等。少付、多付或分次凑足不会标为已付款,但实际正余额仍可由结算接口归集。Indexer 从 latest 启动,必须先启动再付款;当前配置不保证恢复历史或停机遗漏的余额。当前 API 未实现商户鉴权、订单分页和到期处理。订单状态依赖服务端与索引器,资金转出规则由合约约束。重置演示先结算旧订单资金,再运行 vp run purge。此命令删除全部商家的订单记录,保留索引数据与链上资金。删除后旧地址不再参与 API 的余额统计和结算参数生成;前端下一次成功轮询会清空订单列表。

团队成员

depaify

Jjustwei
队长

元数据

创建者justwei
创建时间2026年9月5日
状态已归档
项目 ID#383