Skip to content

gelatodigital/automate-sdk-hello-world

Repository files navigation

Gelato Automate SDK Hello World

Example task automation using Gelato Automate SDK:

Prerequisite

  • Check automate-sdk npm package page to know more about how to use the Gelato Automate SDK

How to run

  1. Install project dependencies:
yarn install
  1. Create a .env file with your private config:
PRIVATE_KEY= 
ALCHEMY_ID= <- required for goerli

Deploy a contract & automate your function call

  • Use automate.createTask and specify your contract call with execAddress, execSelector & execData:
  // Deploying Counter contract
  const counterFactory = await hre.ethers.getContractFactory("Counter");
  const counter = await counterFactory.deploy(GELATO_ADDRESSES[chainId].automate);
  await counter.deployed();

  // Call Counter.increaseCount(42) every 10 minutes
  const { taskId, tx }: TaskTransaction = await automate.createTask({
    execAddress: counter.address,
    execSelector: counter.interface.getSighash("increaseCount(uint256)"),
    execData: counter.interface.encodeFunctionData("increaseCount", [42]),
    execAbi: counter.interface.format("json") as string,
    interval: 10 * 60, // execute every 10 minutes
    name: "Automated counter every 10min",
    dedicatedMsgSender: true
  });
yarn run deploy-create-task --network goerli

Configure your task execution:

1. Use pre-define input (run whenever possible)

  • Use automate.createTask and specify your contract call with execAddress, execSelector & execData:
// Prepare Task data to automate
const counter = new Contract(COUNTER_ADDRESSES, counterAbi, signer);
const selector = counter.interface.getSighash("increaseCount(uint256)");
const data = counter.interface.encodeFunctionData("increaseCount", [42]);

// Create task
const { taskId, tx }: TaskTransaction = await automate.createTask({
  execAddress: counter.address,
  execSelector: selector,
  execData: data,
  name: "Automated Counter with pre-defined input",
  dedicatedMsgSender: true
});
yarn run create-task-predefined-input --network goerli

2. Use dynamic input with a resolver contract

  • Use automate.createTask and specify your resolver function with resolverAddress & resolverData:
// Prepare Task data to automate
const counter = new Contract(COUNTER_ADDRESSES, counterAbi, signer);
const selector = counter.interface.getSighash("increaseCount(uint256)");
const resolverData = counter.interface.getSighash("checker()");

// Create task
const { taskId, tx }: TaskTransaction = await automate.createTask({
  execAddress: counter.address,
  execSelector: selector,
  resolverAddress: counter.address,
  resolverData: resolverData,
  name: "Automated counter using resolver",
  dedicatedMsgSender: true
});
yarn run create-task-with-resolver --network goerli

3. Time based execution

  • Use automate.createTask with your execution interval & set your optional startTime:
// Prepare Task data to automate
const counter = new Contract(COUNTER_ADDRESSES, counterAbi, signer);
const selector = counter.interface.getSighash("increaseCount(uint256)");
const execData = counter.interface.encodeFunctionData("increaseCount", [42]);
const startTime = Math.floor(Date.now() / 1000) + 60; // start in 1 minute
const interval = 5 * 60; // exec every 5 minutes

// Create task
console.log("Creating Timed Task...");
const { taskId, tx }: TaskTransaction = await automate.createTask({
  execAddress: counter.address,
  execSelector: selector,
  execData,
  startTime, // starting timestamp in seconds
  interval, // execution interval in seconds
  name: "Automated counter every 5min",
  dedicatedMsgSender: true
});
yarn run create-timed-task --network goerli

4. Time based execution using a resolver for dynamic input

  • Use automate.createTask with your execution interval & set your resolver function with resolverAddress & resolverData:
// Prepare Task data to automate
const counter = new Contract(COUNTER_ADDRESSES, counterAbi, signer);
const selector = counter.interface.getSighash("increaseCount(uint256)");
const resolverData = counter.interface.getSighash("checker()");
const interval = 5 * 60; // exec every 5 minutes

// Create task
console.log("Creating Timed Task...");
const { taskId, tx }: TaskTransaction = await automate.createTask({
  execAddress: counter.address,
  execSelector: selector,
  resolverAddress: counter.address,
  resolverData: resolverData,
  interval, // execution interval in seconds
  name: "Automated counter with resolver every 5min",
  dedicatedMsgSender: true
});
yarn run create-timed-task-with-resolver --network goerli

5. Self paying task

  • Use automate.createTask and set useTreasury: false to let the task pay for itself:
// Prepare Task data to automate
const counter = new Contract(COUNTER_WITHOUT_TREASURY_ADDRESSES, counterAbi, signer);
const selector = counter.interface.getSighash("increaseCount(uint256)");
const resolverData = counter.interface.getSighash("checker()");

// Create task
console.log("Creating Task...");
const { taskId, tx }: TaskTransaction = await automate.createTask({
  execAddress: counter.address,
  execSelector: selector,
  resolverAddress: counter.address,
  resolverData: resolverData,
  useTreasury: false,
  name: "Automated Counter without treasury",
  dedicatedMsgSender: true
});
yarn run create-self-paying-task --network opgoerli

6. Single execution tasks

  • Use automate.createTask and set singleExec: true for tasks that only need to be executed once. The task is automatically cancelled on the first execution.
// Prepare Task data to automate
const counter = new Contract(COUNTER_ADDRESSES, counterAbi, signer);
const selector = counter.interface.getSighash("increaseCount(uint256)");
const resolverData = counter.interface.getSighash("checker()");

// Create task
const { taskId, tx }: TaskTransaction = await automate.createTask({
  execAddress: counter.address,
  execSelector: selector,
  resolverAddress: counter.address,
  resolverData: resolverData,
  dedicatedMsgSender: true,
  name: "Automated counter using resolver",
  dedicatedMsgSender: true,
  singleExec: true
});

msg.sender of task executions

If you set dedicatedMsgSender: true, your task will be called via a dedicated msg.sender which you can whitelist on your smart contract for extra security.

To get your dedicated msg.sender :

// Get dedicated msg.sender to whitelist
const { address, isDeployed } = await automate.getDedicatedMsgSender()

If dedicatedMsgSender: false, the msg.sender of the task will be Automate contract.

Manage your tasks

  • Use automate.getActiveTasks to retrieve all active that you created:
const activeTasks = await automate.getActiveTasks();
activeTasks.forEach((task: Task) => {
  console.log(`- ${task.name} (${task.taskId})`);
});
  • Use automate.renameTask to rename one of your task:
const task: Task = activeTasks[0];
await automate.renameTask(task.taskId, `[RENAMED] ${task.name}`);
  • Use automate.cancelTask to cancel one of your task:
const task: Task = activeTasks[0];
await automate.cancelTask(task.taskId);
yarn run manage-tasks --network goerli

About

Create Hello World tasks using Gelato Automate SDK

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •