比如在代码 https://github.com/linghuccc/multi-call-test/blob/main/src/App.tsx 中, 先完成 action 1,然后再执行 action 2。
在实践中,执行 action 1 的时候, await writeContractAsync 只能保证 startDelay transaction 已经 send 了,而 startDelay 这个 function 在链上执行需要一定时间,await writeContractAsync 并不能保证这个 transaction 已经完成了,所以在执行第二步 doSomething 的时候,有时会出错。
所以我想,如果 useWaitForTransactionReceipt 有类似的 component,就可以 await 它,确定 approve transaction 已经完成了,再执行下一步。
将等待交易确认的逻辑移到组件的最顶层,或者使用另一个自定义的Hooks来封装这个逻辑
const [action1Hash, setAction1Hash] = useState<string | null>(null);
const [action2Hash, setAction2Hash] = useState<string | null>(null);
const { writeAsync: writeContractAsync } = useWriteContract({
abi: contractAbi,
address: contractAddress,
});
const { isLoading: isAction1Loading, isSuccess: isAction1Success } = useWaitForTransactionReceipt({
hash: action1Hash,
});
const { isLoading: isAction2Loading, isSuccess: isAction2Success } = useWaitForTransactionReceipt({
hash: action2Hash,
});