Tracking callbacks
Unlike regular transactions, a confidential transaction is not executed in sync with the chain, as the MPC execution runs in a separate environment. This means we can't wait for the computation completion in the same way we do with regular transactions, we have to wait for the computation to be completed which happens when the computation's callback is invoked in its MXE. The Arcium client library provides a way to handle this:
Await computation completion with awaitComputationFinalization
awaitComputationFinalization
// Generate a random 8-byte computation offset
const computationOffset = new anchor.BN(randomBytes(8), "hex");
// `program` is the anchor program client of the MXE we're invoking
// the instruction `ourIx` on (which then invokes a computation under the hood by CPIing into the Arcium program).
// `queueSig` is the signature of said transaction.
const queueSig = await program.methods
.ourIx(
// Computation offset that you provide when invoking the instruction
computationOffset
/* other inputs */
)
.accounts(/* some accounts */)
.rpc();
// Since this is a Arcium computation, we need to wait for it to be finalized
// a little bit differently
const finalizeSig = await awaitComputationFinalization(
// Connection to the chain
provider.connection,
// Computation offset that you provide when invoking the instruction
computationOffset,
// Program ID of the MXE
program.programId,
// Solana commitment level, "confirmed" by default
"confirmed"
);
console.log("Computation was finalized with sig: ", finalizeSig);
Last updated