Files
smom-dbis-138/scripts/reserve/gelato-keeper-setup.js
2026-06-02 05:59:06 -07:00

137 lines
5.4 KiB
JavaScript
Executable File

#!/usr/bin/env node
/**
* Gelato Network Setup Script
* Registers PriceFeedKeeper with Gelato Network
*
* Usage:
* node scripts/reserve/gelato-keeper-setup.js
*
* Environment Variables:
* RPC_URL_138 - ChainID 138 RPC endpoint
* PRIVATE_KEY - Deployer private key
* GELATO_OPS - Gelato Ops contract address
* PRICE_FEED_KEEPER_ADDRESS - PriceFeedKeeper contract address
* EXECUTION_INTERVAL - Execution interval in seconds (default: 30)
* FUNDING_AMOUNT - Native token amount to fund (default: 0.1 ETH)
*/
const { ethers } = require('ethers');
require('dotenv').config();
const CONFIG = {
rpcUrl: process.env.RPC_URL_138 || 'http://localhost:8545',
privateKey: process.env.PRIVATE_KEY,
gelatoOps: process.env.GELATO_OPS || '0x527a819db1eb0e34426297b03bae11F2f8B3A19E', // Default Gelato Ops
keeperAddress: process.env.PRICE_FEED_KEEPER_ADDRESS,
executionInterval: parseInt(process.env.EXECUTION_INTERVAL || '30'),
fundingAmount: ethers.parseEther(process.env.FUNDING_AMOUNT || '0.1'),
};
// Gelato Ops ABI (simplified)
const GELATO_OPS_ABI = [
"function createTask(address execAddress, bytes4 execSelector, address resolverAddress, bytes calldata resolverData) external returns (bytes32)",
"function getTaskId(address execAddress, bytes4 execSelector, address resolverAddress, bytes calldata resolverData) external view returns (bytes32)",
"function cancelTask(bytes32 taskId) external",
"function depositFunds(address taskCreator, address token, uint256 amount) external payable",
"function getTaskId(address execAddress, bytes4 execSelector, address resolverAddress, bytes calldata resolverData) external view returns (bytes32)",
"event TaskCreated(bytes32 indexed taskId, address indexed execAddress, bytes4 execSelector, address indexed resolverAddress, bytes resolverData)",
];
// GelatoKeeperCompatible ABI
const GELATO_KEEPER_ABI = [
"function executeTask() external",
"function canExec() external view returns (bool canExec, bytes memory execData)",
];
async function main() {
console.log('=== Gelato Network Setup ===\n');
// Validate configuration
if (!CONFIG.privateKey) throw new Error('PRIVATE_KEY is required');
if (!CONFIG.keeperAddress) throw new Error('PRICE_FEED_KEEPER_ADDRESS is required');
const provider = new ethers.JsonRpcProvider(CONFIG.rpcUrl);
const wallet = new ethers.Wallet(CONFIG.privateKey, provider);
console.log('Network:', CONFIG.rpcUrl);
console.log('Deployer:', wallet.address);
console.log('Gelato Ops:', CONFIG.gelatoOps);
console.log('Keeper Address:', CONFIG.keeperAddress);
console.log('Execution Interval:', CONFIG.executionInterval, 'seconds');
console.log('Funding Amount:', ethers.formatEther(CONFIG.fundingAmount), 'ETH');
console.log('');
// Check balance
const balance = await provider.getBalance(wallet.address);
console.log('Balance:', ethers.formatEther(balance), 'ETH');
if (balance < CONFIG.fundingAmount) {
throw new Error(`Insufficient balance. Need ${ethers.formatEther(CONFIG.fundingAmount)} ETH`);
}
// Deploy GelatoKeeperCompatible if not already deployed
console.log('Checking GelatoKeeperCompatible contract...');
// For now, assume it needs to be deployed via Foundry script
// In production, deploy it first and set GELATO_KEEPER_COMPATIBLE_ADDRESS
const gelatoKeeperAddress = process.env.GELATO_KEEPER_COMPATIBLE_ADDRESS;
if (!gelatoKeeperAddress) {
console.log('⚠ GELATO_KEEPER_COMPATIBLE_ADDRESS not set');
console.log('Please deploy GelatoKeeperCompatible contract first using:');
console.log('forge script script/reserve/DeployGelatoKeeper.s.sol:DeployGelatoKeeper --rpc-url chain138 --broadcast');
process.exit(1);
}
console.log('GelatoKeeperCompatible:', gelatoKeeperAddress);
// Create task
console.log('\nCreating Gelato task...');
const gelatoOps = new ethers.Contract(CONFIG.gelatoOps, GELATO_OPS_ABI, wallet);
const execAddress = gelatoKeeperAddress;
const execSelector = '0x3c4b2e02'; // executeTask() selector
const resolverAddress = gelatoKeeperAddress;
const resolverData = ethers.AbiCoder.defaultAbiCoder().encode(['bytes4'], ['0x3c4b2e02']); // canExec() selector
const createTaskTx = await gelatoOps.createTask(
execAddress,
execSelector,
resolverAddress,
resolverData,
{ value: CONFIG.fundingAmount }
);
console.log('Transaction sent:', createTaskTx.hash);
const receipt = await createTaskTx.wait();
// Parse TaskCreated event
const event = receipt.logs.find(log => {
try {
const parsed = gelatoOps.interface.parseLog(log);
return parsed.name === 'TaskCreated';
} catch {
return false;
}
});
if (event) {
const parsed = gelatoOps.interface.parseLog(event);
const taskId = parsed.args.taskId;
console.log('✓ Task created!');
console.log('Task ID:', taskId);
console.log('');
console.log('=== Setup Complete ===');
console.log('Task ID:', taskId);
console.log('Monitor at: https://app.gelato.network/task/' + taskId);
} else {
console.log('⚠ Could not parse TaskCreated event');
console.log('Check transaction receipt for task ID');
}
}
main().catch(error => {
console.error('Error:', error.message);
process.exit(1);
});