base-org/op-viem

Prove Withdrawal

wilsoncusack opened this issue · 1 comments

Need

Types.WithdrawalTransaction memory _tx,
uint256 _l2OutputIndex,
Types.OutputRootProof calldata _outputRootProof,
bytes[] calldata _withdrawalProof

current SDK has

const withdrawal = await this.toLowLevelMessage(resolved, messageIndex)
const proof = await this.getBedrockMessageProof(resolved, messageIndex)

const args = [
  [
    withdrawal.messageNonce,
    withdrawal.sender,
    withdrawal.target,
    withdrawal.value,
    withdrawal.minGasLimit,
    withdrawal.message,
  ],
  proof.l2OutputIndex,
  [
    proof.outputRootProof.version,
    proof.outputRootProof.stateRoot,
    proof.outputRootProof.messagePasserStorageRoot,
    proof.outputRootProof.latestBlockhash,
  ],
  proof.withdrawalProof,
  opts?.overrides || {},
] as const

return this.contracts.l1.OptimismPortal.populateTransaction.proveWithdrawalTransaction(
  ...args
)

getBedrockMessageProof has

const resolved = await this.toCrossChainMessage(message, messageIndex)
if (resolved.direction === MessageDirection.L1_TO_L2) {
  throw new Error(`can only generate proofs for L2 to L1 messages`)
}

const output = await this.getMessageBedrockOutput(resolved, messageIndex)
if (output === null) {
  throw new Error(`state root for message not yet published`)
}

const withdrawal = await this.toLowLevelMessage(resolved, messageIndex)
const hash = hashLowLevelMessage(withdrawal)
const messageSlot = hashMessageHash(hash)

const stateTrieProof = await makeStateTrieProof(
  this.l2Provider as ethers.providers.JsonRpcProvider,
  output.l2BlockNumber,
  this.contracts.l2.BedrockMessagePasser.address,
  messageSlot
)

const block = await (
  this.l2Provider as ethers.providers.JsonRpcProvider
).send('eth_getBlockByNumber', [
  toRpcHexString(output.l2BlockNumber),
  false,
])

return {
  outputRootProof: {
    version: ethers.constants.HashZero,
    stateRoot: block.stateRoot,
    messagePasserStorageRoot: stateTrieProof.storageRoot,
    latestBlockhash: block.hash,
  },
  withdrawalProof: stateTrieProof.storageProof,
  l2OutputIndex: output.l2OutputIndex,
}