Skip to main content

Stakehouse-Solidity-API

Stakehouse Solidity API allows users to easily interact with the Stakehouse protocol. The API comes packaged with the Stakehouse Solidity Interface allowing users to access all the public functions exposed by Stakehouse. The Solidity API already defines the contract addresses as per the network (Goerli and Mainnet) hence making it easy to plug and play.

Installing the Solidity API

npm i @blockswaplab/stakehouse-solidity-api

or

yarn add @blockswaplab/stakehouse-solidity-api

or

forge install stakehouse-dev/stakehouse-solidity-api

Importing the Solidity API and the contract interface

Solidity import path for the API should be:

@blockswaplab/stakehouse-solidity-api/contracts

Solidity import path for the interfaces should be:

@blockswaplab/stakehouse-contract-interfaces/contracts/interfaces

Where a full reference list of the Solidity interfaces can be found here.

Usage

Example 1: LSD Contracts

Since the LSD contracts are built on top of the Stakehouse Protocol, it actively uses Stakehouse Solidity API and Stakehouse Solidity Interface to interact with the underlying Stakehouse Protocol to stake the validator, mint derivatives, perform CIP key recovery, collect accrued ETH rewards, rage quit and unstaking.

Here’s how the LiquidStakingManager.sol imports the Solidity API.

And then, uses AccountManager() via the API to access the lifecyclestatus of the BLS public key before registering it as shown here:

if (getAccountManager().blsPublicKeyToLifecycleStatus(_blsPublicKey) != IDataStructures.LifecycleStatus.UNBEGUN) {
revert BLSKeyAlreadyRegistered();
}

More such instances can be found after going through the LSD contracts in depth.

Example 2: Code snippet

pragma solidity ^0.8.0;

import { StakehouseAPI } from "@blockswaplab/stakehouse-solidity-api/contracts/StakehouseAPI.sol";

contract Consumer is StakehouseAPI {

function getStakehouseForBlsPublicKey(bytes calldata _blsPublicKey) external view returns (address) {
return getStakeHouseUniverse().memberKnotToStakeHouse(_blsPublicKey);
}

function registerInitials(
address _user, bytes calldata _blsPublicKey, bytes calldata _blsSignature
) external {
getTransactionRouter().registerValidatorInitials(_user, _blsPublicKey, _blsSignature);
}
}

Consuming contract only needs to know what functions it wants to call and the Smart Contract API takes care of the rest (including the network selection).

Currently Supported Networks:

  • Goerli
  • Mainnet

Testing locally

In order to test the contracts locally you will either have to have a local fork of one of the networks, or override the helper functions returning mocked smart contract values. See the example below:

pragma solidity ^0.8.0;

import { StakehouseAPI } from "@blockswaplab/stakehouse-solidity-api/contracts/StakehouseAPI.sol";
import { IStakeHouseUniverse } from "@blockswaplab/stakehouse-contract-interfaces/contracts/interfaces/IStakeHouseUniverse.sol";

contract MockContract is StakehouseAPI {

function getStakeHouseUniverse() internal view override virtual returns (IStakeHouseUniverse) {
return IStakeHouseUniverse(0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8);
}
}