export async function personalSign(
account: string | undefined,
walletType: ConnectorNames,
counterFactualInfo?: CounterFactualInfo,
return { error: "personalSign got no account" };
return new Promise((resolve) => {
async function (err: any, result: any) {
// Valid:1. counter Factual signature Valid
if (counterFactualInfo && accountId) {
myLog("fcWalletValid counterFactualInfo accountId:");
const fcValid = await fcWalletValid(
counterFactualInfo: fcValid.counterFactualInfo,
// Valid: 2. webview directory signature Valid
(window?.ethereum?.isImToken || window?.ethereum?.isMetaMask) &&
// Mobile directory connect will sign ConnectorNames as MetaMask only
walletType === ConnectorNames.MetaMask
const address: string[] = await window.ethereum?.request({
method: "eth_requestAccounts",
(item) => item.toLowerCase() === account.toLowerCase()
return resolve({ sig: result });
// Valid: 3. EOA signature Valid by ecRecover
const valid: any = await ecRecover(web3, account, msg, result);
return resolve({ sig: result });
// Valid: 4. contractWallet signature Valid `isValidSignature(bytes32,bytes)`
const walletValid2: any = await contractWalletValidate32(
if (walletValid2.result) {
return resolve({ sig: result });
// Valid: 5. counter Factual signature Valid when no counterFactualInfo
const fcValid = await fcWalletValid(
counterFactualInfo: fcValid.counterFactualInfo,
// Valid: 6. myKeyValid Valid again
const myKeyValid: any = await mykeyWalletValid(
return resolve({ sig: result });
// Valid: Error cannot pass personalSign Valid
// eslint-disable-next-line no-console
"web3.eth.personal.sign Valid, valid 5 ways, all failed!"
error: "web3.eth.personal.sign Valid, valid 5 ways, all failed!",
error: "personalSign err before Validate:" + err,
resolve({ error: reason });