Skip to content

Commit

Permalink
Change default to base strategy (skip deploy)
Browse files Browse the repository at this point in the history
  • Loading branch information
shanejearley committed Oct 26, 2023
1 parent 319ddb5 commit 18db2e8
Show file tree
Hide file tree
Showing 10 changed files with 70 additions and 65 deletions.
2 changes: 1 addition & 1 deletion apps/docs/src/guide/operating.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ This quickstart is still under development and does not yet run Ethereum clients

## Registration

For any new operator, you need to first register with SSV. As a registered SSV operator, you may now register and deposit collateral to one of Casimir's staking strategies (i.e., standard or EigenLayer-enabled). Your SSV operator ID, DKG server URL, and initial collateral deposit (minimum of 1 ETH) need to be provided during registration.
For any new operator, you need to first register with SSV. As a registered SSV operator, you may now register and deposit collateral to one of Casimir's staking strategies (i.e., base or EigenLayer). Your SSV operator ID, DKG server URL, and initial collateral deposit (minimum of 1 ETH) need to be provided during registration.

### Collateral

Expand Down
4 changes: 2 additions & 2 deletions apps/docs/src/introduction/staking-strategies.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ This page is incomplete.

# Staking Strategies

The standard Casimir staking strategy provides secure and reliable defaults for native ETH rewards. We also plan to provide alterative (DAO-curated) staking strategies, for stakers and operators to enable when depositing stake or collateral, respectively. The first of these opt-in features is EigenLayer, which allows stakers and operators to participate in creating and managing native EigenPods with less than 32 ETH.
The base Casimir staking strategy provides a default configuration for secure and reliable native ETH rewards. We also plan to provide alterative (DAO-curated) staking strategies, for stakers and operators to enable when depositing stake or collateral, respectively. The first of these opt-in features is EigenLayer, which allows stakers and operators to participate in creating and managing native EigenPods with less than 32 ETH.

## Standard Strategy
## Base Strategy

## EigenLayer Strategy
4 changes: 4 additions & 0 deletions apps/docs/src/reference/address-registry.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ Reference the Casimir contract and wallet addresses in the table below.
| Name | Type | Address |
| - | - | - |
| Casimir Factory | Contract | `0xA6fd22c5633bCD82Ee25045de91351a8dfA2c76F` |
| Casimir Base Manager | Contract | `0xA279b2cD2fe7f71f3dD77deF9dedC114bBC0a68c` |
| Casimir Base Registry | Contract | `0x2c6E6453c0AA873E81a9CFcFa2206E1b9E6C21e0` |
| Casimir Base Upkeep | Contract | `0xe4FB499e9D87dE483258BF757589310C137B97D9` |
| Casimir Base Views | Contract | `0x394042CBB8bF5444766496897982A5CDd01d5099` |
| Casimir Beacon Library | Contract | `0xbc3681bDed4CaB8A4dCD155A1d9B8dd52Dd73e92` |
| Casimir Manager Beacon | Contract | `0x69D830C11bbD81c0A9AC031d17A2599D3a0F632E` |
| Casimir Pool Beacon | Contract | `0x9Ef6fb4fe7F7EB9DDeB019028E978439b9aD72BF` |
Expand Down
30 changes: 15 additions & 15 deletions apps/web/src/composables/breakdownMetrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const isInitialized = ref(false)
const loadingInitializeBreakdownMetrics = ref(false)
const loadingInitializeBreakdownMetricsError = ref(false)

let defaultManager: CasimirManager
let baseManager: CasimirManager
let eigenManager: CasimirManager

export default function useBreakdownMetrics() {
Expand Down Expand Up @@ -52,7 +52,7 @@ export default function useBreakdownMetrics() {
/* Get User's Current Stake */
const addresses = (user.value as UserWithAccountsAndOperators).accounts.map((account: Account) => account.address) as string[]
const currentUserStakePromises = [] as Array<Promise<ethers.BigNumber>>
addresses.forEach(address => currentUserStakePromises.push((defaultManager as CasimirManager).getUserStake(address)))
addresses.forEach(address => currentUserStakePromises.push((baseManager as CasimirManager).getUserStake(address)))
addresses.forEach(address => currentUserStakePromises.push((eigenManager as CasimirManager).getUserStake(address)))
const settledCurrentUserStakePromises = await Promise.allSettled(currentUserStakePromises) as Array<PromiseFulfilledResult<ethers.BigNumber>>
const currentUserStake = settledCurrentUserStakePromises.filter(result => result.status === 'fulfilled').map(result => result.value)
Expand All @@ -61,7 +61,7 @@ export default function useBreakdownMetrics() {

/* Get User's All Time Deposits and Withdrawals */
const userEventTotalsPromises = [] as Array<Promise<ContractEventsByAddress>>
addresses.forEach(address => {userEventTotalsPromises.push(getContractEventsTotalsByAddress(address, defaultManager))})
addresses.forEach(address => {userEventTotalsPromises.push(getContractEventsTotalsByAddress(address, baseManager))})
addresses.forEach(address => {userEventTotalsPromises.push(getContractEventsTotalsByAddress(address, eigenManager))})
const userEventTotals = await Promise.all(userEventTotalsPromises) as Array<ContractEventsByAddress>
const userEventTotalsSum = userEventTotals.reduce((acc, curr) => {
Expand Down Expand Up @@ -144,9 +144,9 @@ export default function useBreakdownMetrics() {
async function getCurrentStaked(): Promise<BreakdownAmount> {
const addresses = (user.value as UserWithAccountsAndOperators).accounts.map((account: Account) => account.address) as string[]
try {
const defaultManagerPromises = addresses.map((address) => (defaultManager as CasimirManager).getUserStake(address))
const baseManagerPromises = addresses.map((address) => (baseManager as CasimirManager).getUserStake(address))
const eigenManagerPromises = addresses.map((address) => (eigenManager as CasimirManager).getUserStake(address))
const promises = [...defaultManagerPromises, ...eigenManagerPromises]
const promises = [...baseManagerPromises, ...eigenManagerPromises]
const settledPromises = await Promise.allSettled(promises) as Array<PromiseFulfilledResult<ethers.BigNumber>>
const currentStaked = settledPromises
.filter((result) => result.status === 'fulfilled')
Expand Down Expand Up @@ -225,9 +225,9 @@ export default function useBreakdownMetrics() {
function listenForContractEvents() {
stopListeningForContractEvents() // Clear old listeners
try {
(defaultManager as CasimirManager).on('StakeDeposited', stakeDepositedListener);
(defaultManager as CasimirManager).on('StakeRebalanced', stakeRebalancedListener);
(defaultManager as CasimirManager).on('WithdrawalInitiated', withdrawalInitiatedListener);
(baseManager as CasimirManager).on('StakeDeposited', stakeDepositedListener);
(baseManager as CasimirManager).on('StakeRebalanced', stakeRebalancedListener);
(baseManager as CasimirManager).on('WithdrawalInitiated', withdrawalInitiatedListener);
(eigenManager as CasimirManager).on('StakeDeposited', stakeDepositedListener);
(eigenManager as CasimirManager).on('StakeRebalanced', stakeRebalancedListener);
(eigenManager as CasimirManager).on('WithdrawalInitiated', withdrawalInitiatedListener)
Expand All @@ -237,9 +237,9 @@ export default function useBreakdownMetrics() {
}

function stopListeningForContractEvents() {
(defaultManager as CasimirManager).removeListener('StakeDeposited', stakeDepositedListener);
(defaultManager as CasimirManager).removeListener('StakeRebalanced', stakeRebalancedListener);
(defaultManager as CasimirManager).removeListener('WithdrawalInitiated', withdrawalInitiatedListener);
(baseManager as CasimirManager).removeListener('StakeDeposited', stakeDepositedListener);
(baseManager as CasimirManager).removeListener('StakeRebalanced', stakeRebalancedListener);
(baseManager as CasimirManager).removeListener('WithdrawalInitiated', withdrawalInitiatedListener);
(eigenManager as CasimirManager).removeListener('StakeDeposited', stakeDepositedListener);
(eigenManager as CasimirManager).removeListener('StakeRebalanced', stakeRebalancedListener);
(eigenManager as CasimirManager).removeListener('WithdrawalInitiated', withdrawalInitiatedListener)
Expand Down Expand Up @@ -272,8 +272,8 @@ export default function useBreakdownMetrics() {

async function initializeBreakdownMetricsComposable(){
if (isInitialized.value) return
const { defaultManager: defaultManagerFromContracts, eigenManager: eigenManagerFromContracts } = await getContracts()
defaultManager = defaultManagerFromContracts
const { baseManager: baseManagerFromContracts, eigenManager: eigenManagerFromContracts } = await getContracts()
baseManager = baseManagerFromContracts
eigenManager = eigenManagerFromContracts

try {
Expand All @@ -292,8 +292,8 @@ export default function useBreakdownMetrics() {
}

async function uninitializeBreakdownMetricsComposable(){
const { defaultManager: defaultManagerFromContracts, eigenManager: eigenManagerFromContracts } = await getContracts()
defaultManager = defaultManagerFromContracts
const { baseManager: baseManagerFromContracts, eigenManager: eigenManagerFromContracts } = await getContracts()
baseManager = baseManagerFromContracts
eigenManager = eigenManagerFromContracts
provider.removeAllListeners('block')
stopListeningForContractEvents()
Expand Down
21 changes: 11 additions & 10 deletions apps/web/src/composables/contracts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,22 @@ const { provider, factory } = useEnvironment()

export default function useContracts() {
async function getContracts() {
const managerConfigs: ManagerConfig[] = await Promise.all((await factory.getManagerIds()).map(async (id: number) => {
const [baseManagerConfig, eigenManagerConfig] = await Promise.all((await factory.getManagerIds()).map(async (id: number) => {
return await factory.getManagerConfig(id)
}))
const defaultManager = new ethers.Contract(managerConfigs[0].managerAddress, ICasimirManagerAbi, provider) as CasimirManager
const defaultRegistry = new ethers.Contract(managerConfigs[0].registryAddress, ICasimirRegistryAbi, provider) as CasimirRegistry
const defaultViews = new ethers.Contract(managerConfigs[0].viewsAddress, ICasimirViewsAbi, provider) as CasimirViews

const eigenManager = new ethers.Contract(managerConfigs[1].managerAddress, ICasimirManagerAbi, provider) as CasimirManager
const eigenRegistry = new ethers.Contract(managerConfigs[1].registryAddress, ICasimirRegistryAbi, provider) as CasimirRegistry
const eigenViews = new ethers.Contract(managerConfigs[1].viewsAddress, ICasimirViewsAbi, provider) as CasimirViews
const baseManager = new ethers.Contract(baseManagerConfig.managerAddress, ICasimirManagerAbi, provider) as CasimirManager
const baseRegistry = new ethers.Contract(baseManagerConfig.registryAddress, ICasimirRegistryAbi, provider) as CasimirRegistry
const baseViews = new ethers.Contract(baseManagerConfig.viewsAddress, ICasimirViewsAbi, provider) as CasimirViews

const eigenManager = new ethers.Contract(eigenManagerConfig?.managerAddress || ethers.constants.AddressZero, ICasimirManagerAbi, provider) as CasimirManager
const eigenRegistry = new ethers.Contract(eigenManagerConfig?.registryAddress || ethers.constants.AddressZero, ICasimirRegistryAbi, provider) as CasimirRegistry
const eigenViews = new ethers.Contract(eigenManagerConfig?.viewsAddress || ethers.constants.AddressZero, ICasimirViewsAbi, provider) as CasimirViews

return {
defaultManager,
defaultRegistry,
defaultViews,
baseManager,
baseRegistry,
baseViews,
eigenManager,
eigenRegistry,
eigenViews
Expand Down
26 changes: 13 additions & 13 deletions apps/web/src/composables/operators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import useWallets from '@/composables/wallets'
import useWalletConnectV2 from '@/composables/walletConnectV2'
import { CasimirManager, CasimirRegistry, CasimirViews } from '@casimir/ethereum/build/@types'

let defaultManager: CasimirManager
let defaultRegistry: CasimirRegistry
let defaultViews: CasimirViews
let baseManager: CasimirManager
let baseRegistry: CasimirRegistry
let baseViews: CasimirViews

let eigenManager: CasimirManager
let eigenRegistry: CasimirRegistry
Expand Down Expand Up @@ -97,7 +97,7 @@ export default function useOperators() {

async function _getRegisteredOperators(ssvOperators: Operator[], type: 'default' | 'eigen'): Promise<RegisteredOperator[]> {
const casimirOperators: RegisteredOperator[] = []
const registry = type === 'default' ? defaultRegistry : eigenRegistry
const registry = type === 'default' ? baseRegistry : eigenRegistry
for (const operator of ssvOperators) {
const { active, collateral, poolCount, resharing } = await (registry as CasimirRegistry).getOperator(operator.id)
const registered = active || collateral.gt(0) || poolCount.gt(0) || resharing
Expand Down Expand Up @@ -133,16 +133,16 @@ export default function useOperators() {
const pools: PoolConfig[] = []

const defaultPoolIds = [
...await (defaultManager as CasimirManager).getPendingPoolIds(),
...await (defaultManager as CasimirManager).getStakedPoolIds()
...await (baseManager as CasimirManager).getPendingPoolIds(),
...await (baseManager as CasimirManager).getStakedPoolIds()
]
const eigenPoolIds = [
...await (eigenManager as CasimirManager).getPendingPoolIds(),
...await (eigenManager as CasimirManager).getStakedPoolIds()
]

const poolIds = type === 'default' ? defaultPoolIds : eigenPoolIds
const views = type === 'default' ? defaultViews : eigenViews
const views = type === 'default' ? baseViews : eigenViews

for (const poolId of poolIds) {
const poolConfig = await (views as CasimirViews).getPoolConfig(poolId)
Expand All @@ -161,11 +161,11 @@ export default function useOperators() {
async function initializeOperatorComposable(){
try {
/* Get Manager, Views, and Registry */
const { defaultManager: managerContract, defaultRegistry: registryContract, defaultViews: viewsContract } = await getContracts()
const { baseManager: managerContract, baseRegistry: registryContract, baseViews: viewsContract } = await getContracts()
const { eigenManager: eigenManagerContract, eigenRegistry: eigenRegistryContract, eigenViews: eigenViewsContract } = await getContracts()
defaultManager = managerContract
defaultRegistry = registryContract
defaultViews = viewsContract
baseManager = managerContract
baseRegistry = registryContract
baseViews = viewsContract
eigenManager = eigenManagerContract
eigenRegistry = eigenRegistryContract
eigenViews = eigenViewsContract
Expand All @@ -183,7 +183,7 @@ export default function useOperators() {

function listenForContractEvents() {
try {
(defaultRegistry as CasimirRegistry).on('OperatorRegistered', () => getUserOperators());
(baseRegistry as CasimirRegistry).on('OperatorRegistered', () => getUserOperators());
(eigenRegistry as CasimirRegistry).on('OperatorRegistered', () => getUserOperators())

// (registry as CasimirRegistry).on('OperatorDeregistered', getUserOperators)
Expand Down Expand Up @@ -214,7 +214,7 @@ export default function useOperators() {
} else {
throw new Error(`Invalid wallet provider: ${walletProvider}`)
}
const result = await (defaultRegistry as CasimirRegistry).connect(signer as ethers.Signer).registerOperator(operatorId, { from: address, value: ethers.utils.parseEther(collateral)})
const result = await (baseRegistry as CasimirRegistry).connect(signer as ethers.Signer).registerOperator(operatorId, { from: address, value: ethers.utils.parseEther(collateral)})
// TODO: @shanejearley - How many confirmations do we want to wait?
await result?.wait(1)
await addOperator({address, nodeUrl})
Expand Down
16 changes: 8 additions & 8 deletions apps/web/src/composables/staking.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const { getWalletConnectSignerV2 } = useWalletConnectV2()

const stakingComposableInitialized = ref(false)

let defaultManager: CasimirManager
let baseManager: CasimirManager
let eigenManager: CasimirManager

export default function useStaking() {
Expand All @@ -29,8 +29,8 @@ export default function useStaking() {
if (stakingComposableInitialized.value) return
try {
/* Get Managers */
const { defaultManager: defaultManagerFromContracts, eigenManager: eigenManagerFromContracts } = await getContracts()
defaultManager = defaultManagerFromContracts
const { baseManager: baseManagerFromContracts, eigenManager: eigenManagerFromContracts } = await getContracts()
baseManager = baseManagerFromContracts
eigenManager = eigenManagerFromContracts
stakingComposableInitialized.value = true
} catch (error) {
Expand Down Expand Up @@ -58,7 +58,7 @@ export default function useStaking() {
} else {
throw new Error(`Invalid wallet provider: ${walletProvider}`)
}
const manager = type === 'default' ? defaultManager : eigenManager
const manager = type === 'default' ? baseManager : eigenManager
const managerSigner = (manager as CasimirManager).connect(signer as ethers.Signer)
const fees = await getDepositFees()
const depositAmount = parseFloat(amount) * ((100 + fees) / 100)
Expand Down Expand Up @@ -86,8 +86,8 @@ export default function useStaking() {
async function getUserStake(address: string): Promise<number> {
if (!stakingComposableInitialized.value) return 0
try {
const defaultManagerBigNumber = await (defaultManager as CasimirManager).getUserStake(address)
const number = parseFloat(ethers.utils.formatEther(defaultManagerBigNumber))
const baseManagerBigNumber = await (baseManager as CasimirManager).getUserStake(address)
const number = parseFloat(ethers.utils.formatEther(baseManagerBigNumber))
const eigenManagerBigNumber = await (eigenManager as CasimirManager).getUserStake(address)
const number2 = parseFloat(ethers.utils.formatEther(eigenManagerBigNumber))
const total = number + number2
Expand All @@ -111,7 +111,7 @@ export default function useStaking() {
} else {
throw new Error(`Invalid wallet provider: ${walletProvider}`)
}
const manager = type === 'default' ? defaultManager : eigenManager
const manager = type === 'default' ? baseManager : eigenManager
const managerSigner = (manager as CasimirManager).connect(signer as ethers.Signer)
const withdrawableBalance = await managerSigner.getWithdrawableBalance()
const withdrawableBalanceEther = ethers.utils.formatEther(withdrawableBalance)
Expand All @@ -137,7 +137,7 @@ export default function useStaking() {
} else {
throw new Error(`Invalid wallet provider: ${walletProvider}`)
}
const manager = type === 'default' ? defaultManager : eigenManager
const manager = type === 'default' ? baseManager : eigenManager
const managerSigner = (manager as CasimirManager).connect(signer as ethers.Signer)
const value = ethers.utils.parseEther(amount)
return await managerSigner.requestWithdrawal(value)
Expand Down
4 changes: 2 additions & 2 deletions contracts/ethereum/scripts/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,12 @@ void async function () {
privateOperators: false,
verifiedOperators: false
}
const deployDefaultManager = await factory.deployManager(
const deployBaseManager = await factory.deployManager(
daoOracle.address,
functionsOracle.address,
defaultStrategy
)
await deployDefaultManager.wait()
await deployBaseManager.wait()
const [managerId] = await factory.getManagerIds()
const [managerAddress, registryAddress, upkeepAddress, viewsAddress] = await factory.getManagerConfig(managerId)
console.log(`Default CasimirManager contract deployed to ${managerAddress}`)
Expand Down
Loading

0 comments on commit 18db2e8

Please sign in to comment.