Project

One World
NFTDeFi
15,000 USDC
View results
Submission Details
Severity: medium
Invalid

Meta-Transaction Contract Wallet Incompatibility

Summary

The current meta-transaction implementation prevents smart contract wallets from using gasless transactions due to limited signature verification support.

Vulnerability Details

In NativeMetaTransaction.sol, the verify() function relies solely on ecrecover for signature validation:

function verify(
address signer,
MetaTransaction memory metaTx,
bytes32 sigR,
bytes32 sigS,
uint8 sigV
) internal view returns (bool) {
require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
return
signer ==
ecrecover(
toTypedMessageHash(hashMetaTransaction(metaTx)),
sigV,
sigR,
sigS
);
}

This implementation has two key limitations:

  1. It only supports raw ECDSA signatures produced by Externally Owned Accounts (EOAs)

  2. The signature validation mechanism lacks EIP-1271 support required for smart contract wallet signatures:

    • No isValidSignature() check

    • No contract signature validation path

    • Hard comparison against ecrecover output only

This affects both the OWPIdentity.sol and MembershipFactory.sol contracts since they inherit from NativeMetaTransaction.

Impact

  • Smart contract wallets (e.g., Gnosis Safe, Argent) cannot execute gasless transactions

  • Institutional users with multi-sig wallets are blocked from meta-transaction functionality

Tools Used

  • Manual code review

Recommendations

Implement EIP-1271 support by adding contract signature validation:

function verifySignature(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) {
// Try EIP-1271 check for smart contract wallets
try IERC1271(signer).isValidSignature(hash, signature) returns (bytes4 magicValue) {
return magicValue == 0x1626ba7e;
} catch {
// Fallback to EOA check
return signer == ECDSA.recover(hash, signature);
}
}
Updates

Lead Judging Commences

0xbrivan2 Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Design choice
0xbrivan2 Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Design choice

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.