题目
用户抱怨:点了「兑换」按钮后钱包弹窗出现,确认后却报错说余额不足;换个场景,用户没连钱包点按钮,直接弹出连接请求,连完还要再点一次。
请说明按钮的启用条件应该怎么设计,以及为什么应在打开钱包之前完成校验。
考察目标
- 能否给出按钮启用条件清单。
- 是否理解无谓弹窗的代价。
- 能否设计出「先校验、后请求」的流程。
考察提交前校验的时机,以及无谓弹窗对用户信任的消耗。
用户抱怨:点了「兑换」按钮后钱包弹窗出现,确认后却报错说余额不足;换个场景,用户没连钱包点按钮,直接弹出连接请求,连完还要再点一次。
请说明按钮的启用条件应该怎么设计,以及为什么应在打开钱包之前完成校验。
只读检查在协议层不需要钱包参与:eth_getBalance、eth_getTransactionCount、eth_getCode 可以读取余额、nonce 与合约代码,eth_call 执行不改变状态的调用,eth_estimateGas 估算执行所需 gas。把这些检查放在打开钱包之前,可以让弹窗只用于签名与发送;用户拒绝(错误码 4001)时保持输入并允许重试。
eth_call 执行一次不改变链上状态的调用,eth_estimateGas 估算执行所需 gas,两者可用于提交前的检查(依据:EIP-1474 §Specification 的 Methods 条目 eth_call、eth_estimateGas)eth_getBalance、eth_getTransactionCount、eth_getCode 分别读取账户余额、nonce 与合约代码(依据:EIP-1474 §Specification 的 Methods 条目 eth_getBalance、eth_getTransactionCount、eth_getCode)4001 表示用户拒绝了请求,属于 provider 错误码(依据:EIP-1193 §Provider Errors)useSimulateContract 在提交前模拟合约调用,返回模拟结果与错误(依据:wagmi:useSimulateContract §Usage、§Return Type)useConnection 的 isConnecting / isReconnecting / isConnected / isDisconnected 可以直接驱动按钮的启用与文案(依据:wagmi:useConnection §Return Type)发现这道题有问题? 反馈此题