import { AbiCoder, Interface, Wallet, ethers } from "ethers";
const trustlessProposerAbi = [
"function nestedNonce() view returns (uint256)",
"function onCall(address target, bytes data, uint256 value) returns (bool)",
];
const greeterAbi = ["function setGreeting(string greeting)"];
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
const signer = new Wallet(process.env.PRIVATE_KEY!, provider);
const trustlessProposerAddress = "0x1b3068A7dC934cCEBF7784cBd9266D80948a98A1";
const greeterAddress = "0xYourPublicGreeterAddress";
const chainId = 1;
const gasLimit = 1_000_000n;
const deadline = 999_999_999_999n;
const value = 0n;
const trustlessProposer = new ethers.Contract(
trustlessProposerAddress,
trustlessProposerAbi,
provider,
);
const greeter = new Interface(greeterAbi);
const greeting = "hello from DA Builder";
const calldata = greeter.encodeFunctionData("setGreeting", [greeting]);
const nonce = await trustlessProposer.nestedNonce();
// The signer must control the delegated EOA.
const signature = await signer.signTypedData(
{
name: "TrustlessProposer",
version: "1",
chainId,
verifyingContract: trustlessProposerAddress,
},
{
Call: [
{ name: "deadline", type: "uint256" },
{ name: "nonce", type: "uint256" },
{ name: "target", type: "address" },
{ name: "value", type: "uint256" },
{ name: "calldata", type: "bytes" },
{ name: "gasLimit", type: "uint256" },
],
},
{
deadline,
nonce,
target: greeterAddress,
value,
calldata,
gasLimit,
},
);
const encodedData = AbiCoder.defaultAbiCoder().encode(
["bytes", "uint256", "uint256", "bytes", "uint256"],
[signature, deadline, nonce, calldata, gasLimit],
);
const functionCall = new Interface(trustlessProposerAbi).encodeFunctionData("onCall", [
greeterAddress,
encodedData,
value,
]);
const tx = await signer.sendTransaction({
to: trustlessProposerAddress,
data: functionCall
});
const receipt = await tx.wait();
console.log(receipt?.status);