# 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](https://github.com/stakehouse-dev/stakehouse-contract-interfaces/tree/main/contracts/interfaces). ## 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](https://github.com/stakehouse-dev/lsd-contracts/blob/main/contracts/liquid-staking/LiquidStakingManager.sol#L11) 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](https://github.com/stakehouse-dev/lsd-contracts/blob/main/contracts/liquid-staking/LiquidStakingManager.sol#L519C13-L521C48): ```solidity if (getAccountManager().blsPublicKeyToLifecycleStatus(_blsPublicKey) != IDataStructures.LifecycleStatus.UNBEGUN) { revert BLSKeyAlreadyRegistered(); } ``` More such instances can be found after going through the [LSD contracts](https://github.com/stakehouse-dev/lsd-contracts/tree/main) in depth. ### Example 2: Code snippet ```solidity 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](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks) of one of the networks, or override the helper functions returning mocked smart contract values. See the example below: ```solidity 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); } } ```