Prerequisites

  1. Install required dependencies:
  2. Access to the operator's private key.
  3. A deployed Modular Restaking contract.

1. Registering as an Operator

To become an operator, you need to register using the OperatorRegistry contract.

Code Example:

const { ethers } = require("ethers");

// Contract details
const operatorRegistryAddress = "0xYourOperatorRegistryAddress"; // Replace with actual address
const operatorRegistryABI = [/* ABI of OperatorRegistry */];
const privateKey = "0xYourPrivateKey"; // Replace with your private key

// Connect to the provider and contract
const provider = new ethers.providers.JsonRpcProvider("<https://your.rpc.endpoint>");
const wallet = new ethers.Wallet(privateKey, provider);
const operatorRegistry = new ethers.Contract(operatorRegistryAddress, operatorRegistryABI, wallet);

async function registerOperator(name, metadataUrl) {
    try {
        const tx = await operatorRegistry.registerOperator(name, metadataUrl);
        console.log("Registration Tx Hash:", tx.hash);
        await tx.wait();
        console.log("Operator successfully registered!");
    } catch (err) {
        console.error("Error registering operator:", err);
    }
}

// Example usage
registerOperator("MyOperator", "<https://metadata.url>");


2. Updating Operator Metadata

To update your operator details (e.g., name, metadata URL), use the updateOperatorMetadata function.

Code Example:

async function updateOperatorMetadata(operatorId, newMetadataUrl) {
    try {
        const tx = await operatorRegistry.updateOperatorMetadata(operatorId, newMetadataUrl);
        console.log("Update Tx Hash:", tx.hash);
        await tx.wait();
        console.log("Operator metadata updated successfully!");
    } catch (err) {
        console.error("Error updating metadata:", err);
    }
}

// Example usage
updateOperatorMetadata(1, "<https://new.metadata.url>");


3. Staking for an Operator

Staking is required to ensure your operator is active. Use the stake function to bond tokens.

Code Example:

const tokenABI = [/* ABI of the staking token */];
const stakingTokenAddress = "0xYourStakingTokenAddress"; // Replace with actual token address

const stakingAmount = ethers.utils.parseEther("10"); // Stake 10 tokens
const stakingToken = new ethers.Contract(stakingTokenAddress, tokenABI, wallet);

async function stake(operatorId, amount) {
    try {
        // Approve staking
        const approveTx = await stakingToken.approve(operatorRegistryAddress, amount);
        await approveTx.wait();
        console.log("Staking approved.");

        // Stake tokens
        const tx = await operatorRegistry.stake(operatorId, amount);
        console.log("Stake Tx Hash:", tx.hash);
        await tx.wait();
        console.log("Staking successful!");
    } catch (err) {
        console.error("Error staking:", err);
    }
}

// Example usage
stake(1, stakingAmount);