Skip to content

Instantly share code, notes, and snippets.

@blurpesec
Created May 9, 2023 21:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blurpesec/a94cf36b93dbcdd9c42abea955b50813 to your computer and use it in GitHub Desktop.
Save blurpesec/a94cf36b93dbcdd9c42abea955b50813 to your computer and use it in GitHub Desktop.
Delegation - to smart contract.
const recipient = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
const initialBalance = await hre.ethers.provider.getBalance(recipient)
await signer0.sendTransaction({
to: SmartAccount.address,
value: ethers.utils.parseEther("1"),
})
// Create Delegation
const delegation = {
delegate: SmartAccount2.address,
authority: "0x0000000000000000000000000000000000000000000000000000000000000000",
caveats: [],
salt: 0,
}
const delSig = delegatableUtils.signTypedDataLocal(pk0, "Delegation", delegation)
const delegationSignaturePayload = [
{
contractAddress: ethers.constants.AddressZero,
signature: delSig,
},
];
const delegationSignaturePayloadTypes = SmartAccount.interface.getFunction("decodeAgnosticSignatures").outputs
if (!delegationSignaturePayloadTypes) throw new Error("No signature types found")
const encodedDelegationSignaturePayload = ethers.utils.defaultAbiCoder.encode(
delegationSignaturePayloadTypes,
[delegationSignaturePayload]
)
const signedDelegation = {
signature: encodedDelegationSignaturePayload,
message: delegation,
signer: SmartAccount.address,
}
// Create UserOperation
const userOp = await fillUserOp(hre, {
sender: SmartAccount.address,
initCode: "0x",
callData: await callData(hre, SmartAccount.address, recipient, 1, "0x"), // send 1 wei to vitalik
}, SmartAccount as Delegatable4337Account)
const hash = await entryPoint.getUserOpHash(userOp)
const sign = ecsign(Buffer.from(arrayify(hash)), Buffer.from(arrayify(pk1)));
const hexsign = "0x" + signatureToHexString(sign)
const signaturePayload = {
signatures: [{
contractAddress: ethers.constants.AddressZero,
signature: hexsign,
}],
delegations: [
signedDelegation,
],
}
const signaturePayloadTypes = SmartAccount.interface.getFunction("decodeSignature").outputs
if (!signaturePayloadTypes) throw new Error("No signature types found")
// console.log("______________________________________________________")
// console.log("signaturePayloadTypes", signaturePayloadTypes)
// console.log("______________________________________________________")
// console.log("signaturePayloadTypes json", JSON.stringify(signaturePayloadTypes))
// console.log("______________________________________________________")
// console.log("signaturePayloadTypes raw", signaturePayloadTypes[0].components)
// console.log("______________________________________________________")
const encodedSignaturePayload = ethers.utils.defaultAbiCoder.encode(
signaturePayloadTypes,
[signaturePayload]
)
userOp.signature = encodedSignaturePayload
// convert bytes to string
const string = ethers.utils.toUtf8String("0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000164141323320726576657274656420286f72204f4f472900000000000000000000")
const tx = await entryPoint.handleOps([userOp], await signer0.getAddress(), { gasLimit: 10000000 })
await tx.wait()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment