Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
582 changes: 582 additions & 0 deletions spot-contracts/exported-artifacts/FeePolicy.json

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions spot-staking-subgraph/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,9 @@ type BillBrokerDailyStat @entity {
perpPrice: BigDecimal!
usdPrice: BigDecimal!
totalSupply: BigDecimal!
usdSwapAmt: BigDecimal!
perpSwapAmt: BigDecimal!
usdFeeAmt: BigDecimal!
perpFeeAmt: BigDecimal!
swapValue: BigDecimal!
feeValue: BigDecimal!
feeYield: BigDecimal!
tvl:BigDecimal!
price:BigDecimal!
}
Expand All @@ -50,7 +49,8 @@ type BillBrokerSwap @entity {
nonce: BigInt!
type: String!
swapAmt: BigDecimal!
feeAmt: BigDecimal!
swapValue: BigDecimal!
feeValue: BigDecimal!
tx: String!
}

Expand Down
143 changes: 120 additions & 23 deletions spot-staking-subgraph/src/billBroker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import {
import {
BillBroker__computePerpToUSDSwapAmt1InputSStruct,
BillBroker__computeUSDToPerpSwapAmtInputSStruct,
BillBroker__computeMintAmtWithUSD1InputSStruct,
BillBroker__computeMintAmtWithPerp1InputSStruct,
} from '../generated/BillBroker/BillBroker'
import { BillBroker as BillBrokerABI } from '../generated/BillBroker/BillBroker'
import { ERC20 as ERC20ABI } from '../generated/BillBroker/ERC20'
Expand Down Expand Up @@ -74,7 +76,10 @@ export function fetchBillBroker(address: Address): BillBroker {
return vault as BillBroker
}

export function fetchBillBrokerDailyStat(vault: BillBroker, timestamp: BigInt): BillBrokerDailyStat {
export function fetchBillBrokerDailyStat(
vault: BillBroker,
timestamp: BigInt,
): BillBrokerDailyStat {
let id = vault.id.concat('-').concat(timestamp.toString())
let dailyStat = BillBrokerDailyStat.load(id)
if (dailyStat === null) {
Expand All @@ -86,10 +91,9 @@ export function fetchBillBrokerDailyStat(vault: BillBroker, timestamp: BigInt):
dailyStat.perpPrice = BIGDECIMAL_ZERO
dailyStat.usdPrice = BIGDECIMAL_ZERO
dailyStat.totalSupply = BIGDECIMAL_ZERO
dailyStat.usdSwapAmt = BIGDECIMAL_ZERO
dailyStat.perpSwapAmt = BIGDECIMAL_ZERO
dailyStat.usdFeeAmt = BIGDECIMAL_ZERO
dailyStat.perpFeeAmt = BIGDECIMAL_ZERO
dailyStat.swapValue = BIGDECIMAL_ZERO
dailyStat.feeValue = BIGDECIMAL_ZERO
dailyStat.feeYield = BIGDECIMAL_ZERO
dailyStat.tvl = BIGDECIMAL_ZERO
dailyStat.price = BIGDECIMAL_ZERO
dailyStat.save()
Expand All @@ -106,7 +110,8 @@ function fetchBillBrokerSwap(vault: BillBroker, nonce: BigInt): BillBrokerSwap {
swap.nonce = nonce
swap.type = ''
swap.swapAmt = BIGDECIMAL_ZERO
swap.feeAmt = BIGDECIMAL_ZERO
swap.swapValue = BIGDECIMAL_ZERO
swap.feeValue = BIGDECIMAL_ZERO
swap.tx = '0x'
swap.timestamp = BIGINT_ZERO
swap.save()
Expand Down Expand Up @@ -152,6 +157,7 @@ export function handleSwapPerpsForUSD(event: SwapPerpsForUSD): void {
vault.usdPrice = formatBalance(event.params.preOpState.usdPrice, vault.decimals)
vault.tvl = vault.usdBal.times(vault.usdPrice).plus(vault.perpBal.times(vault.perpPrice))
vault.price = vault.tvl.div(vault.totalSupply)
vault.swapNonce = vault.swapNonce.plus(BIGINT_ONE)
vault.save()

dailyStat.perpPrice = vault.perpPrice
Expand All @@ -162,6 +168,7 @@ export function handleSwapPerpsForUSD(event: SwapPerpsForUSD): void {

swap.type = 'perps'
swap.swapAmt = formatBalance(event.params.perpAmtIn, vault.perpDecimals)
swap.swapValue = swap.swapAmt.times(vault.perpPrice)
swap.tx = event.transaction.hash.toHex()
swap.timestamp = event.block.timestamp
swap.save()
Expand All @@ -180,15 +187,16 @@ export function handleSwapPerpsForUSD(event: SwapPerpsForUSD): void {
let r = vaultContract.try_computePerpToUSDSwapAmt1(event.params.perpAmtIn, reserveStateStruct)
if (!r.reverted) {
let swapAmts = r.value
dailyStat.perpSwapAmt = dailyStat.perpSwapAmt.plus(
formatBalance(event.params.perpAmtIn, vault.perpDecimals),
)
dailyStat.usdFeeAmt = dailyStat.usdFeeAmt.plus(
formatBalance(swapAmts.value1, vault.usdDecimals),
)
let perpAmtIn = swap.swapAmt
let usdAmtOut = formatBalance(swapAmts.value0, vault.usdDecimals)
let estUsdAmtOut = perpAmtIn.times(vault.perpPrice).div(vault.usdPrice)
let usdFeeAmt = estUsdAmtOut.minus(usdAmtOut)
let feeValue = usdFeeAmt.times(vault.usdPrice)
dailyStat.swapValue = dailyStat.swapValue.plus(swap.swapValue)
dailyStat.feeValue = dailyStat.feeValue.plus(feeValue)
dailyStat.feeYield = dailyStat.feeValue.div(dailyStat.tvl)
dailyStat.save()

swap.feeAmt = dailyStat.usdFeeAmt
swap.feeValue = feeValue
swap.save()
}
}
Expand All @@ -204,6 +212,7 @@ export function handleSwapUSDForPerps(event: SwapUSDForPerps): void {
vault.usdPrice = formatBalance(event.params.preOpState.usdPrice, vault.decimals)
vault.tvl = vault.usdBal.times(vault.usdPrice).plus(vault.perpBal.times(vault.perpPrice))
vault.price = vault.tvl.div(vault.totalSupply)
vault.swapNonce = vault.swapNonce.plus(BIGINT_ONE)
vault.save()

dailyStat.perpPrice = vault.perpPrice
Expand All @@ -213,7 +222,8 @@ export function handleSwapUSDForPerps(event: SwapUSDForPerps): void {
dailyStat.save()

swap.type = 'usd'
swap.swapAmt = formatBalance(event.params.usdAmtIn, vault.perpDecimals)
swap.swapAmt = formatBalance(event.params.usdAmtIn, vault.usdDecimals)
swap.swapValue = swap.swapAmt.times(vault.usdPrice)
swap.tx = event.transaction.hash.toHex()
swap.timestamp = event.block.timestamp
swap.save()
Expand All @@ -232,15 +242,16 @@ export function handleSwapUSDForPerps(event: SwapUSDForPerps): void {
let r = vaultContract.try_computeUSDToPerpSwapAmt(event.params.usdAmtIn, reserveStateStruct)
if (!r.reverted) {
let swapAmts = r.value
dailyStat.usdSwapAmt = dailyStat.usdSwapAmt.plus(
formatBalance(event.params.usdAmtIn, vault.usdDecimals),
)
dailyStat.perpFeeAmt = dailyStat.perpFeeAmt.plus(
formatBalance(swapAmts.value1, vault.perpDecimals),
)
let usdAmtIn = swap.swapAmt
let perpAmtOut = formatBalance(swapAmts.value0, vault.perpDecimals)
let estPerpAmtOut = usdAmtIn.times(vault.usdPrice).div(vault.perpPrice)
let perpFeeAmt = estPerpAmtOut.minus(perpAmtOut)
let feeValue = perpFeeAmt.times(vault.perpPrice)
dailyStat.swapValue = dailyStat.swapValue.plus(swap.swapValue)
dailyStat.feeValue = dailyStat.feeValue.plus(feeValue)
dailyStat.feeYield = dailyStat.feeValue.div(dailyStat.tvl)
dailyStat.save()

swap.feeAmt = dailyStat.perpFeeAmt
swap.feeValue = feeValue
swap.save()
}
}
Expand All @@ -249,6 +260,7 @@ export function handleDepositUSD(event: DepositUSD): void {
log.warning('triggered single sided deposit', [])
let vault = fetchBillBroker(event.address)
let dailyStat = fetchBillBrokerDailyStat(vault, dayTimestamp(event.block.timestamp))
let swap = fetchBillBrokerSwap(vault, vault.swapNonce.plus(BIGINT_ONE))
refreshBillBrokerStats(vault, dailyStat)

vault.perpPrice = formatBalance(event.params.preOpState.perpPrice, vault.decimals)
Expand All @@ -262,12 +274,55 @@ export function handleDepositUSD(event: DepositUSD): void {
dailyStat.tvl = vault.tvl
dailyStat.price = vault.price
dailyStat.save()

let vaultContract = BillBrokerABI.bind(stringToAddress(vault.id))
let reserveStateValues: Array<ethereum.Value> = [
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.usdBalance),
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.perpBalance),
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.usdPrice),
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.perpPrice),
]
let reserveStateTuple = changetype<ethereum.Tuple>(reserveStateValues)
let reserveStateStruct = changetype<BillBroker__computeMintAmtWithUSD1InputSStruct>(
reserveStateTuple,
)
let r = vaultContract.try_computeMintAmtWithUSD1(event.params.usdAmtIn, reserveStateStruct)
if (!r.reverted) {
let usdAmtIn = formatBalance(event.params.usdAmtIn, vault.usdDecimals)
let valueIn = usdAmtIn.times(vault.usdPrice)
let estMintAmt = formatBalance(r.value, vault.decimals)
let mintAmt = valueIn.div(vault.tvl).times(vault.totalSupply)
let feePerc = estMintAmt.minus(mintAmt).div(estMintAmt)

let usdClaimPost = vault.usdBal.times(estMintAmt).div(vault.totalSupply)
let swapAmt = usdAmtIn.minus(usdClaimPost)
let feeValue = swapAmt.times(feePerc)

vault.swapNonce = vault.swapNonce.plus(BIGINT_ONE)
vault.save()

swap.type = 'usd'
swap.swapAmt = swapAmt
swap.swapValue = swap.swapAmt.times(vault.usdPrice)
swap.tx = event.transaction.hash.toHex()
swap.timestamp = event.block.timestamp
swap.save()

dailyStat.swapValue = dailyStat.swapValue.plus(swap.swapValue)
dailyStat.feeValue = dailyStat.feeValue.plus(feeValue)
dailyStat.feeYield = dailyStat.feeValue.div(dailyStat.tvl)
dailyStat.save()

swap.feeValue = feeValue
swap.save()
}
}

export function handleDepositPerp(event: DepositPerp): void {
log.warning('triggered single sided deposit', [])
let vault = fetchBillBroker(event.address)
let dailyStat = fetchBillBrokerDailyStat(vault, dayTimestamp(event.block.timestamp))
let swap = fetchBillBrokerSwap(vault, vault.swapNonce.plus(BIGINT_ONE))
refreshBillBrokerStats(vault, dailyStat)

vault.perpPrice = formatBalance(event.params.preOpState.perpPrice, vault.decimals)
Expand All @@ -281,4 +336,46 @@ export function handleDepositPerp(event: DepositPerp): void {
dailyStat.tvl = vault.tvl
dailyStat.price = vault.price
dailyStat.save()

let vaultContract = BillBrokerABI.bind(stringToAddress(vault.id))
let reserveStateValues: Array<ethereum.Value> = [
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.usdBalance),
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.perpBalance),
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.usdPrice),
ethereum.Value.fromUnsignedBigInt(event.params.preOpState.perpPrice),
]
let reserveStateTuple = changetype<ethereum.Tuple>(reserveStateValues)
let reserveStateStruct = changetype<BillBroker__computeMintAmtWithPerp1InputSStruct>(
reserveStateTuple,
)
let r = vaultContract.try_computeMintAmtWithPerp1(event.params.perpAmtIn, reserveStateStruct)
if (!r.reverted) {
let perpAmtIn = formatBalance(event.params.perpAmtIn, vault.perpDecimals)
let valueIn = perpAmtIn.times(vault.perpPrice)
let estMintAmt = formatBalance(r.value, vault.decimals)
let mintAmt = valueIn.div(vault.tvl).times(vault.totalSupply)
let feePerc = estMintAmt.minus(mintAmt).div(estMintAmt)

let perpClaimPost = vault.perpBal.times(estMintAmt).div(vault.totalSupply)
let swapAmt = perpAmtIn.minus(perpClaimPost)
let feeValue = swapAmt.times(feePerc)

vault.swapNonce = vault.swapNonce.plus(BIGINT_ONE)
vault.save()

swap.type = 'perp'
swap.swapAmt = swapAmt
swap.swapValue = swap.swapAmt.times(vault.perpPrice)
swap.tx = event.transaction.hash.toHex()
swap.timestamp = event.block.timestamp
swap.save()

dailyStat.swapValue = dailyStat.swapValue.plus(swap.swapValue)
dailyStat.feeValue = dailyStat.feeValue.plus(feeValue)
dailyStat.feeYield = dailyStat.feeValue.div(dailyStat.tvl)
dailyStat.save()

swap.feeValue = feeValue
swap.save()
}
}
23 changes: 17 additions & 6 deletions spot-staking-subgraph/src/charmVault.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export function fetchCharmVault(address: Address): CharmVault {
vault.tvl = BIGDECIMAL_ZERO
vault.price = BIGDECIMAL_ZERO
vault.totalSupply = BIGDECIMAL_ZERO

let context = new DataSourceContext()
context.setString('charmVault', id)
RebasingERC20.createWithContext(getUnderlyingAddress(token1Address), context)
Expand All @@ -68,7 +68,10 @@ export function fetchCharmVault(address: Address): CharmVault {
return vault as CharmVault
}

export function fetchCharmVaultDailyStat(vault: CharmVault, timestamp: BigInt): CharmVaultDailyStat {
export function fetchCharmVaultDailyStat(
vault: CharmVault,
timestamp: BigInt,
): CharmVaultDailyStat {
let id = vault.id.concat('-').concat(timestamp.toString())
let dailyStat = CharmVaultDailyStat.load(id)
if (dailyStat === null) {
Expand Down Expand Up @@ -103,7 +106,9 @@ export function refreshCharmVaultStats(vault: CharmVault, dailyStat: CharmVaultD
vault.token1Bal = formatBalance(tokenBals.value1, vault.token1Decimals)
vault.token0Price = BIGDECIMAL_ONE
vault.token1Price = prices[0]
vault.tvl = vault.token0Bal.times(vault.token0Price).plus(vault.token1Bal.times(vault.token1Price))
vault.tvl = vault.token0Bal
.times(vault.token0Price)
.plus(vault.token1Bal.times(vault.token1Price))
vault.totalSupply = formatBalance(vaultContract.totalSupply(), vault.decimals)
vault.price = vault.tvl.div(vault.totalSupply)
vault.save()
Expand Down Expand Up @@ -145,9 +150,15 @@ export function handleFees(event: CollectFees): void {
let dailyStat = fetchCharmVaultDailyStat(vault, dayTimestamp(event.block.timestamp))
refreshCharmVaultStats(vault, dailyStat)

dailyStat.token0Fees = dailyStat.token0Fees.plus(formatBalance(event.params.feesToVault0, vault.token0Decimals))
dailyStat.token1Fees = dailyStat.token1Fees.plus(formatBalance(event.params.feesToVault1, vault.token1Decimals))
dailyStat.totalFeeVal = dailyStat.token1Fees.times(dailyStat.token1Price).plus(dailyStat.token0Fees.times(dailyStat.token0Price))
dailyStat.token0Fees = dailyStat.token0Fees.plus(
formatBalance(event.params.feesToVault0, vault.token0Decimals),
)
dailyStat.token1Fees = dailyStat.token1Fees.plus(
formatBalance(event.params.feesToVault1, vault.token1Decimals),
)
dailyStat.totalFeeVal = dailyStat.token1Fees
.times(dailyStat.token1Price)
.plus(dailyStat.token0Fees.times(dailyStat.token0Price))
dailyStat.feeYield = dailyStat.totalFeeVal.div(dailyStat.tvl.minus(dailyStat.totalFeeVal))
dailyStat.save()
}
2 changes: 1 addition & 1 deletion spot-staking-subgraph/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,4 +67,4 @@ export function getUnderlyingAddress(tokenAddress: Address): Address {
return collateralResult.value
}
return Address.fromString('0x0000000000000000000000000000000000000000')
}
}
Loading