Commit 37d51876 authored by Mark Tyneway's avatar Mark Tyneway Committed by Matthew Slipper

op-chain-ops: add comments

parent 8acece49
...@@ -128,7 +128,10 @@ func (w *LegacyWithdrawal) StorageSlot() (common.Hash, error) { ...@@ -128,7 +128,10 @@ func (w *LegacyWithdrawal) StorageSlot() (common.Hash, error) {
return common.BytesToHash(slot), nil return common.BytesToHash(slot), nil
} }
// Value returns the ETH value associated with the withdrawal. // Value returns the ETH value associated with the withdrawal. Since
// ETH was represented as an ERC20 token before the Bedrock upgrade,
// the sender and calldata must be observed and the value must be parsed
// out if "finalizeETHWithdrawal" is the method.
func (w *LegacyWithdrawal) Value() (*big.Int, error) { func (w *LegacyWithdrawal) Value() (*big.Int, error) {
abi, err := bindings.L1StandardBridgeMetaData.GetAbi() abi, err := bindings.L1StandardBridgeMetaData.GetAbi()
if err != nil { if err != nil {
...@@ -137,11 +140,15 @@ func (w *LegacyWithdrawal) Value() (*big.Int, error) { ...@@ -137,11 +140,15 @@ func (w *LegacyWithdrawal) Value() (*big.Int, error) {
method, err := abi.MethodById(w.Data) method, err := abi.MethodById(w.Data)
if err != nil { if err != nil {
return nil, err return nil, fmt.Errorf("cannot parse withdrawal value: %w", err)
} }
value := new(big.Int) value := new(big.Int)
if w.Sender == nil {
return nil, errors.New("sender is nil")
}
isFromL2StandardBridge := *w.Sender == predeploys.L2StandardBridgeAddr isFromL2StandardBridge := *w.Sender == predeploys.L2StandardBridgeAddr
if isFromL2StandardBridge && method.Name == "finalizeETHWithdrawal" { if isFromL2StandardBridge && method.Name == "finalizeETHWithdrawal" {
data, err := method.Inputs.Unpack(w.Data[4:]) data, err := method.Inputs.Unpack(w.Data[4:])
......
...@@ -143,27 +143,31 @@ func (w *Withdrawal) StorageSlot() (common.Hash, error) { ...@@ -143,27 +143,31 @@ func (w *Withdrawal) StorageSlot() (common.Hash, error) {
} }
// Compute the receipt corresponding to the withdrawal. This receipt // Compute the receipt corresponding to the withdrawal. This receipt
// is in the bedrock transition block. It contains 3 logs // is in the bedrock transition block. It contains 3 logs.
// - SentMessage // SentMessage, SentMessageExtension1 and MessagePassed.
// - SentMessageExtension1
// - MessagePassed
// These logs are enough for the standard withdrawal flow to happen // These logs are enough for the standard withdrawal flow to happen
// which is driven by events being emitted. // which is driven by events being emitted.
func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) { func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) {
// Create a new receipt with the state root, successful execution and no gas
// used
receipt := types.NewReceipt(hdr.Root.Bytes(), false, 0) receipt := types.NewReceipt(hdr.Root.Bytes(), false, 0)
if receipt.Logs == nil {
receipt.Logs = make([]*types.Log, 0)
}
// Create the SentMessage log.
args := abi.Arguments{ args := abi.Arguments{
{Name: "target", Type: AddressType}, {Name: "target", Type: AddressType},
{Name: "sender", Type: AddressType}, {Name: "sender", Type: AddressType},
{Name: "data", Type: BytesType}, {Name: "data", Type: BytesType},
{Name: "nonce", Type: Uint256Type}, {Name: "nonce", Type: Uint256Type},
} }
data, err := args.Pack(w.Target, w.Sender, w.Data, w.Nonce) data, err := args.Pack(w.Target, w.Sender, w.Data, w.Nonce)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// The L2CrossDomainMessenger emits this event. The target is
// indexed.
sm := &types.Log{ sm := &types.Log{
Address: predeploys.L2CrossDomainMessengerAddr, Address: predeploys.L2CrossDomainMessengerAddr,
Topics: []common.Hash{ Topics: []common.Hash{
...@@ -178,9 +182,10 @@ func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) { ...@@ -178,9 +182,10 @@ func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) {
Index: 0, Index: 0,
Removed: false, Removed: false,
} }
receipt.Logs = append(receipt.Logs, sm) receipt.Logs = append(receipt.Logs, sm)
// Create the SentMessageExtension1 log. The L2CrossDomainMessenger
// emits this event. The sender is indexed.
sm1 := &types.Log{ sm1 := &types.Log{
Address: predeploys.L2CrossDomainMessengerAddr, Address: predeploys.L2CrossDomainMessengerAddr,
Topics: []common.Hash{ Topics: []common.Hash{
...@@ -195,26 +200,24 @@ func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) { ...@@ -195,26 +200,24 @@ func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) {
Index: 0, Index: 0,
Removed: false, Removed: false,
} }
receipt.Logs = append(receipt.Logs, sm1) receipt.Logs = append(receipt.Logs, sm1)
// Create the MessagePassed log.
mpargs := abi.Arguments{ mpargs := abi.Arguments{
{Name: "value", Type: Uint256Type}, {Name: "value", Type: Uint256Type},
{Name: "gasLimit", Type: Uint256Type}, {Name: "gasLimit", Type: Uint256Type},
{Name: "data", Type: BytesType}, {Name: "data", Type: BytesType},
{Name: "withdrawalHash", Type: Bytes32Type}, {Name: "withdrawalHash", Type: Bytes32Type},
} }
hash, err := w.Hash() hash, err := w.Hash()
if err != nil { if err != nil {
return nil, err return nil, err
} }
mpdata, err := mpargs.Pack(w.Value, w.GasLimit, w.Data, hash) mpdata, err := mpargs.Pack(w.Value, w.GasLimit, w.Data, hash)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// The L2ToL1MessagePasser emits this event.
mp := &types.Log{ mp := &types.Log{
Address: predeploys.L2ToL1MessagePasserAddr, Address: predeploys.L2ToL1MessagePasserAddr,
Topics: []common.Hash{ Topics: []common.Hash{
...@@ -231,7 +234,6 @@ func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) { ...@@ -231,7 +234,6 @@ func (w *Withdrawal) Receipt(hdr *types.Header) (*types.Receipt, error) {
Index: 0, Index: 0,
Removed: false, Removed: false,
} }
receipt.Logs = append(receipt.Logs, mp) receipt.Logs = append(receipt.Logs, mp)
return receipt, nil return receipt, nil
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment