Untitled

 avatar
unknown
plain_text
5 months ago
2.0 kB
8
Indexable
export const authenticate = async (passkeyValidator: any, publicClient: any, isRegister: boolean) => {
  const sessionPrivateKey = generatePrivateKey();
  const sessionKeySigner = privateKeyToAccount(sessionPrivateKey);

  const ecdsaSigner = await toECDSASigner({
    signer: sessionKeySigner
  });

  const permissionValidator = await toPermissionValidator(publicClient, {
    kernelVersion: '0.3.1',
    signer: ecdsaSigner,
    policies: getPolicies(),
    entryPoint: ENTRYPOINT_ADDRESS_V07
  });

  const sessionKeyAccount = await createKernelAccount(publicClient, {
    kernelVersion: '0.3.1',
    entryPoint: ENTRYPOINT_ADDRESS_V07,
    plugins: {
      sudo: passkeyValidator,
      regular: permissionValidator
    }
  });

  const sessionSigner = await serializePermissionAccount(sessionKeyAccount, sessionPrivateKey);

  localStorage.setItem('zerodev:session', sessionSigner);

  const kernelPaymaster = createZeroDevPaymasterClient({
    entryPoint: ENTRYPOINT_ADDRESS_V07,
    chain: CHAIN,
    transport: http(PAYMASTER_RPC)
  });

  const smartAccount = createKernelAccountClient({
    account: sessionKeyAccount as any,
    chain: CHAIN,
    bundlerTransport: http(BUNDLER_URL),
    entryPoint: ENTRYPOINT_ADDRESS_V07,
    middleware: {
      sponsorUserOperation: kernelPaymaster.sponsorUserOperation
    }
  });

  if (isRegister) {
    const usdcDetails = usdcAddressFinder(CHAIN);

    const data = encodeFunctionData({
      abi: usdcABI,
      args: ["0x04E66B135c6021cc19c26188071C01cc2b47bfDa" as `0x${string}`, 0n],
      functionName: 'transfer',
    });

    const userOpHash = await smartAccount.sendUserOperation({
      userOperation: {
        callData: await sessionKeyAccount.encodeCallData({
          to: usdcDetails.address,
          value: BigInt(0),
          data,
        }),
      },
    } as any);
  
    const bundlerClient = smartAccount.extend(bundlerActions(ENTRYPOINT_ADDRESS_V07));
    const res = await bundlerClient.waitForUserOperationReceipt({
      hash: userOpHash,
    });
  }
};
Editor is loading...
Leave a Comment