diff --git a/relayer.go b/relayer.go index 480778a6..a5763ca9 100644 --- a/relayer.go +++ b/relayer.go @@ -129,7 +129,19 @@ func EncodeTransactionsForRelayingV3(relayer Relayer, walletAddress common.Addre return common.Address{}, nil, fmt.Errorf("cannot encode empty transactions") } - payload, err := txns.Payload(walletAddress, chainID, space, nonce) + var ( + guestTxns = make(Transactions, 0, len(txns)) + walletTxns = make(Transactions, 0, len(txns)) + ) + for _, txn := range txns { + if txn.To == walletContext.FactoryAddress { + guestTxns = append(guestTxns, txn) + } else { + walletTxns = append(walletTxns, txn) + } + } + + payload, err := walletTxns.Payload(walletAddress, chainID, space, nonce) if err != nil { return common.Address{}, nil, err } @@ -139,5 +151,27 @@ func EncodeTransactionsForRelayingV3(relayer Relayer, walletAddress common.Addre return common.Address{}, nil, err } - return walletAddress, execdata, nil + if len(guestTxns) == 0 { + return walletAddress, execdata, nil + } + + if len(walletTxns) > 0 { + guestTxns = append(guestTxns, &Transaction{ + To: walletAddress, + Data: execdata, + RevertOnError: true, + }) + } + + guestPayload, err := guestTxns.Payload( + walletContext.GuestModuleAddress, + chainID, + big.NewInt(0), + big.NewInt(0), + ) + if err != nil { + return common.Address{}, nil, err + } + + return walletContext.GuestModuleAddress, guestPayload.Encode(walletContext.GuestModuleAddress), nil }