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);
}
}