import { TaskType } from "@epoch-protocol/epoch-commons-sdk";
import { keccak256, toBytes, parseUnits } from "viem";
const destinationChainId = isTestnet ? "84532" : "8453";
const ticketCost = parseUnits(
(ticketPrice * numberOfTickets).toString(),
paymentTokenDecimals,
).toString();
const { taskTypeString, intentData } = await sdk.getTaskData({
taskType: TaskType.ProtocolInteraction,
intentData: {
isNative: false,
depositTokenAddress: selectedSourceToken,
tokenInAmount: "0", // reverse quote
outputTokenAddress: paymentTokenOnBase,
minTokenOut: ticketCost,
destinationChainId,
protocolHashIdentifier:
"0x4dbce8120d8053ee8aea0d3534f8f5019eb971dfc14c0686f6422b40ac39337c",
recipient: sponsorAddress,
},
extraDataTypestring:
"bytes32 protocol,bytes32 action,address raffleAddress,uint256 numberOfTickets",
extraData: {
protocol: keccak256(toBytes("raffles")),
action: keccak256(toBytes("buyTicket")),
raffleAddress: raffleContractAddress,
numberOfTickets: numberOfTickets.toString(),
},
});
// Step 1: Quote
const quote = await sdk.getIntentQuote({
sponsorAddress,
taskTypeString,
intentData,
isNative: false,
});
// Step 2: User confirms, then solve
const result = await sdk.solveIntent({
isNative: false,
sponsorAddress,
taskTypeString,
intentData,
quoteResult: quote,
onExecutionStatus: (status) => console.log(status.phase),
});
// Step 3: Poll status
const nonce = result?.allocationResponse?.nonce ?? result?.intentNonce;
if (nonce) {
const interval = setInterval(async () => {
const status = await sdk.getIntentStatus(sponsorAddress, nonce.toString());
if (allComplete(status)) clearInterval(interval);
}, 3000);
}