NEAR 跨合约调用实现 escrow 托管账户向指定地址释放资金咨询
解决方案
你当前写的transfer逻辑本身符合预期,NEAR运行时规则为:合约内部通过ContractPromiseBatch发起的转账,资金默认从当前合约自身的账户余额中扣除,不会从调用者/交易签名者的账户划扣,你担心的从调用者账户转出的问题不存在。
你只需要补充两个必要的校验逻辑,避免越权调用、余额不足的异常场景即可:
- 校验调用者是否为你指定的、有权触发划转的普通捐赠人账户
- 校验当前合约账户的可用余额足够覆盖要转出的金额
修正后的完整代码参考如下:
import { ContractPromiseBatch, u128, AccountId, Context } from "near-sdk-as"; // 如果你支持多个触发账户,可以将这个变量替换为存储在合约内的白名单集合 const ALLOWED_TRIGGER_ACCOUNT: AccountId = "xxx.near"; function transferFromEscrow(destinationAccount: AccountId, amount: u128): ContractPromiseBatch { // 权限校验:仅允许白名单内的捐赠人触发划转 assert(Context.sender == ALLOWED_TRIGGER_ACCOUNT, "无权限触发托管资金划转"); // 余额校验:也可以替换为你业务中单独记账的托管余额逻辑 assert(Context.accountBalance >= amount, "托管账户余额不足,无法完成划转"); const toDestinationAccount = ContractPromiseBatch.create(destinationAccount); return toDestinationAccount.transfer(amount); }
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

