pragma solidity ^0.8.13;
import {Test, console} from "forge-std/Test.sol";
import {MembershipFactory} from "../src/dao/MembershipFactory.sol";
import {NativeMetaTransaction,IMembershipFactory} from "./IMembershipFactory.sol";
import {CurrencyManager} from "../src/dao/CurrencyManager.sol";
import {MembershipERC1155} from "../src/dao/tokens/MembershipERC1155.sol";
contract MembershipFactoryTest is Test {
uint depositorPvKey;
address depositor;
MembershipERC1155 erc1155;
CurrencyManager currencyMgr;
IMembershipFactory factory;
string baseURI = "https://baseuri.com/";
address OpWallet = makeAddr("OpWallet");
function setUp() public {
(depositor,depositorPvKey) = makeAddrAndKey("Depositor");
erc1155 = new MembershipERC1155();
currencyMgr = new CurrencyManager();
factory = IMembershipFactory(address(new MembershipFactory(address(currencyMgr),OpWallet,baseURI,address(erc1155))));
}
function testSignatureVerificationImplementation() public{
uint nonce = factory.getNonce(depositor);
bytes memory FunctionSig = abi.encodeCall(IMembershipFactory.tiers,(depositor));
console.logBytes(FunctionSig);
bytes32 r;
bytes32 s;
uint8 v;
bytes32 correctDigest = computeACCURATEDigest(nonce,depositor,FunctionSig);
( v, r, s) = vm.sign(depositorPvKey, correctDigest);
bytes memory sig = abi.encodePacked(r, s, v);
assertEq(depositor,ecrecover(correctDigest, v, r, s));
vm.expectRevert();
factory.executeMetaTransaction(depositor,FunctionSig,r,s,v);
bytes32 incorrectDigest = computeINCORRECTDigestNoTypedHash(nonce,depositor,FunctionSig);
(uint8 incorrectV, bytes32 incorrectR, bytes32 incorrectS) = vm.sign(depositorPvKey, incorrectDigest);
bytes memory IncorrectSig = abi.encodePacked(incorrectR,incorrectS,incorrectV);
factory.executeMetaTransaction(depositor,FunctionSig,incorrectR,incorrectS,incorrectV);
}
function computeACCURATEDigest(uint _nonce,address _signer, bytes memory _funcSig) internal returns(bytes32 ){
return factory.toTypedMessageHash(
computeINCORRECTDigestNoTypedHash(_nonce,_signer,_funcSig)
);
}
function computeINCORRECTDigestNoTypedHash(uint _nonce,address _signer, bytes memory _funcSig) internal returns(bytes32) {
return factory.hashMetaTransaction(
NativeMetaTransaction.MetaTransaction(
_nonce,
_signer,
_funcSig
)
);
}
}