Skip to content

Commit

Permalink
Update eip1271 function
Browse files Browse the repository at this point in the history
  • Loading branch information
mmv08 committed Jan 12, 2024
1 parent fa67ade commit 8da95b5
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 11 deletions.
2 changes: 1 addition & 1 deletion 4337/.prettierignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
contracts/test/FCL/**/*.sol
contracts/vendor/FCL/**/*.sol
3 changes: 2 additions & 1 deletion 4337/contracts/experimental/SafeSignerLaunchpad.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {UserOperation} from "@account-abstraction/contracts/interfaces/UserOpera
import {_packValidationData} from "@account-abstraction/contracts/core/Helpers.sol";
import {ISignatureValidator} from "@safe-global/safe-contracts/contracts/interfaces/ISignatureValidator.sol";
import {SafeStorage} from "@safe-global/safe-contracts/contracts/libraries/SafeStorage.sol";
import {SignatureValidatorConstants} from "../interfaces/SignatureValidatorConstants.sol";

interface IUniqueSignerFactory {
/**
Expand Down Expand Up @@ -44,7 +45,7 @@ interface IUniqueSignerFactory {
* @title SafeOpLaunchpad - A contract for Safe initialization with custom unique signers that would violate ERC-4337 factory rules.
* @dev The is intended to be set as a Safe proxy's implementation for ERC-4337 user operation that deploys the account.
*/
contract SafeSignerLaunchpad is IAccount, SafeStorage {
contract SafeSignerLaunchpad is IAccount, SafeStorage, SignatureValidatorConstants {
bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = keccak256("EIP712Domain(uint256 chainId,address verifyingContract)");

// keccak256("SafeSignerLaunchpad.initHash") - 1
Expand Down
32 changes: 23 additions & 9 deletions 4337/contracts/experimental/WebAuthnSigner.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
pragma solidity >=0.8.0;

import {FCL_WebAuthn} from "../vendor/FCL/FCL_Webauthn.sol";
import {SignatureValidatorConstants} from "../interfaces/SignatureValidatorConstants.sol";
import {IUniqueSignerFactory} from "./SafeSignerLaunchpad.sol";

struct SignatureData {
Expand All @@ -12,14 +13,14 @@ struct SignatureData {
uint256[2] rs;
}

function checkSignature(bytes memory data, bytes calldata signature, uint256 x, uint256 y) view returns (bytes4 magicValue) {
function checkSignature(bytes memory data, bytes calldata signature, uint256 x, uint256 y) view returns (bool valid) {
SignatureData calldata signaturePointer;
// solhint-disable-next-line no-inline-assembly
assembly ("memory-safe") {
signaturePointer := signature.offset
}

if (
return
FCL_WebAuthn.checkSignature(
signaturePointer.authenticatorData,
0x01, // require user presence
Expand All @@ -29,17 +30,14 @@ function checkSignature(bytes memory data, bytes calldata signature, uint256 x,
signaturePointer.rs,
x,
y
)
) {
magicValue = WebAuthnSigner.isValidSignature.selector;
}
);
}

/**
* @title WebAuthnSigner
* @dev A contract that represents a WebAuthn signer.
*/
contract WebAuthnSigner {
contract WebAuthnSigner is SignatureValidatorConstants {
uint256 public immutable X;
uint256 public immutable Y;

Expand All @@ -60,7 +58,21 @@ contract WebAuthnSigner {
* @return magicValue The magic value indicating the validity of the signature.
*/
function isValidSignature(bytes memory data, bytes calldata signature) external view returns (bytes4 magicValue) {
return checkSignature(data, signature, X, Y);
if (checkSignature(data, signature, X, Y)) {
magicValue = LEGACY_EIP1271_MAGIC_VALUE;
}
}

/**
* @dev Validates the signature for a given data hash.
* @param dataHash The hash of the data to be validated.
* @param signature The signature to be validated.
* @return magicValue The magic value indicating the validity of the signature.
*/
function isValidSignature(bytes32 dataHash, bytes calldata signature) external view returns (bytes4 magicValue) {
if (checkSignature(abi.encode(dataHash), signature, X, Y)) {
magicValue = EIP1271_MAGIC_VALUE;
}
}
}

Expand Down Expand Up @@ -106,7 +118,9 @@ contract WebAuthnSignerFactory is IUniqueSignerFactory {
bytes calldata signerData
) external view override returns (bytes4 magicValue) {
(uint256 x, uint256 y) = abi.decode(signerData, (uint256, uint256));
magicValue = checkSignature(data, signature, x, y);
if(checkSignature(data, signature, x, y)) {
magicValue = LEGACY_EIP1271_MAGIC_VALUE;
}
}

/**
Expand Down
10 changes: 10 additions & 0 deletions 4337/contracts/interfaces/SignatureValidatorConstants.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity >=0.7.0 <0.9.0;

abstract contract SignatureValidatorConstants {
// bytes4(keccak256("isValidSignature(bytes,bytes)")
bytes4 internal constant EIP1271_MAGIC_VALUE = 0x20c13b0b;

// bytes4(keccak256("isValidSignature(bytes,bytes)")
bytes4 internal constant LEGACY_EIP1271_MAGIC_VALUE = 0x20c13b0b;
}

0 comments on commit 8da95b5

Please sign in to comment.