Skip to content

Instantly share code, notes, and snippets.

@markcarey
Created March 7, 2024 19:37
Show Gist options
  • Save markcarey/c93c92d8ec7cc7767400bb8c5bbebe76 to your computer and use it in GitHub Desktop.
Save markcarey/c93c92d8ec7cc7767400bb8c5bbebe76 to your computer and use it in GitHub Desktop.
Farcaster Frame Txn Example POST Handler
"txn": async function(req) {
return new Promise(async function(resolve, reject) {
var frame = {};
frame.id = req.params.id;
frame.square = true;
frame.postUrl = `https://frm.lol/frames/${req.params.id}`;
const frameResult = await util.validate(req); // neynar frame validation endpoint
if (frameResult.valid == true) {
if ("transactionId" in req.body.untrustedData) {
// transaction has completed
const txnId = req.body.untrustedData.transactionId;
frame.imageText = "Your txId is " + txnId;
} else {
// return txn data
// degen contract via ethers
const provider = new ethers.providers.JsonRpcProvider(process.env.API_URL_BASE);
const degen = new ethers.Contract(process.env.DEGEN_CONTRACT, degenJSON.abi, provider);
const SPENDER_CONTRACT = "0xA238Dd80C259a72e81d7e4664a9801593F98d1c5"; // Aave Pool on Base (demo purposes)
// calldata for an approve tx
const calldata = degen.interface.encodeFunctionData("approve", [SPENDER_CONTRACT, ethers.utils.parseEther("69")]);
const tx = {
"chainId": "eip155:8453", // Base chainId
"method": "eth_sendTransaction",
"params": {
"to": process.env.DEGEN_CONTRACT,
"abi": degenJSON.abi,
"data": calldata,
"value": "0x0"
}
};
return resolve(tx);
} // if txnId
} else {
frame.imageText = "I'm sorry, I couldn't validate this frame.";
}
return resolve(frame);
}); // return new Promise
}, // txn
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment