Skip to content

Commit

Permalink
Update to hyperdrive v1.0.6 (#1466)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sheng Lundquist authored May 14, 2024
1 parent e867ffd commit e20f0af
Show file tree
Hide file tree
Showing 45 changed files with 558 additions and 154 deletions.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/hyperdrive/src/abis/LPMath.sol/LPMath.json

Large diffs are not rendered by default.

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ dependencies = [
"flask",
"flask-expects-json",
"hexbytes",
"hyperdrivepy==0.15.2",
"hyperdrivepy==0.15.3",
"ipython",
"matplotlib",
"mplfinance",
Expand Down
4 changes: 3 additions & 1 deletion src/agent0/chainsync/dashboard/plot_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ def reduce_plot_data(data: pd.DataFrame, x_column_name: str, y_column_name: str)
# We always keep the first and last rows
# Diff always puts the first row as nan,
# we explicitly set the last row as nan
plot_data_diff.iloc[-1] = float("nan")
if len(plot_data_diff) > 0:
# pandas doesn't play nice with types
plot_data_diff.iloc[-1] = float("nan") # type: ignore

# Filter out intermediate rows with no difference
# Note that nans will always not equal 0
Expand Down
67 changes: 59 additions & 8 deletions src/agent0/chainsync/db/hyperdrive/chain_to_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,13 @@ def trade_events_to_db(
transfer_events_df.loc[receive_idx, "token_delta"] = transfer_events_df.loc[receive_idx, "value"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
# Base delta is always 0
# Base and vault share delta is always 0
transfer_events_df["base_delta"] = Decimal(0)
transfer_events_df["vault_share_delta"] = Decimal(0)
# asBase and vaultSharePrice doesn't make sense here, we keep as nan
# We use camel case to match the other event fields before rename
transfer_events_df["asBase"] = np.nan
transfer_events_df["vaultSharePrice"] = np.nan

# Drop all transfer single events
events_df = events_df[events_df["event"] != "TransferSingle"].reset_index(drop=True)
Expand Down Expand Up @@ -310,7 +315,12 @@ def trade_events_to_db(
events_df.loc[events_idx, "token_delta"] = events_df.loc[events_idx, "bondAmount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[events_idx, "base_delta"] = -events_df.loc[events_idx, "baseAmount"].apply(
as_base_idx = events_df["asBase"] & events_idx
as_shares_idx = ~events_df["asBase"] & events_idx
events_df.loc[as_base_idx, "base_delta"] = -events_df.loc[as_base_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[as_shares_idx, "vault_share_delta"] = -events_df.loc[as_shares_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)

Expand All @@ -320,7 +330,12 @@ def trade_events_to_db(
events_df.loc[events_idx, "token_delta"] = -events_df.loc[events_idx, "bondAmount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[events_idx, "base_delta"] = events_df.loc[events_idx, "baseAmount"].apply(
as_base_idx = events_df["asBase"] & events_idx
as_shares_idx = ~events_df["asBase"] & events_idx
events_df.loc[as_base_idx, "base_delta"] = events_df.loc[as_base_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[as_shares_idx, "vault_share_delta"] = events_df.loc[as_shares_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)

Expand All @@ -338,7 +353,12 @@ def trade_events_to_db(
events_df.loc[events_idx, "token_delta"] = events_df.loc[events_idx, "bondAmount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[events_idx, "base_delta"] = -events_df.loc[events_idx, "baseAmount"].apply(
as_base_idx = events_df["asBase"] & events_idx
as_shares_idx = ~events_df["asBase"] & events_idx
events_df.loc[as_base_idx, "base_delta"] = -events_df.loc[as_base_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[as_shares_idx, "vault_share_delta"] = -events_df.loc[as_shares_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)

Expand All @@ -348,7 +368,12 @@ def trade_events_to_db(
events_df.loc[events_idx, "token_delta"] = -events_df.loc[events_idx, "bondAmount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[events_idx, "base_delta"] = events_df.loc[events_idx, "baseAmount"].apply(
as_base_idx = events_df["asBase"] & events_idx
as_shares_idx = ~events_df["asBase"] & events_idx
events_df.loc[as_base_idx, "base_delta"] = events_df.loc[as_base_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[as_shares_idx, "vault_share_delta"] = events_df.loc[as_shares_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)

Expand All @@ -369,7 +394,12 @@ def trade_events_to_db(
events_df.loc[events_idx, "token_delta"] = events_df.loc[events_idx, "lpAmount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[events_idx, "base_delta"] = -events_df.loc[events_idx, "baseAmount"].apply(
as_base_idx = events_df["asBase"] & events_idx
as_shares_idx = ~events_df["asBase"] & events_idx
events_df.loc[as_base_idx, "base_delta"] = -events_df.loc[as_base_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[as_shares_idx, "vault_share_delta"] = -events_df.loc[as_shares_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)

Expand All @@ -379,7 +409,12 @@ def trade_events_to_db(
events_df.loc[events_idx, "token_delta"] = -events_df.loc[events_idx, "lpAmount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[events_idx, "base_delta"] = events_df.loc[events_idx, "baseAmount"].apply(
as_base_idx = events_df["asBase"] & events_idx
as_shares_idx = ~events_df["asBase"] & events_idx
events_df.loc[as_base_idx, "base_delta"] = events_df.loc[as_base_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[as_shares_idx, "vault_share_delta"] = events_df.loc[as_shares_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
# We need to also add any withdrawal shares as additional rows
Expand All @@ -392,6 +427,7 @@ def trade_events_to_db(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
withdrawal_rows["base_delta"] = Decimal(0)
withdrawal_rows["vault_share_delta"] = Decimal(0)
events_df = pd.concat([events_df, withdrawal_rows], axis=0)

events_idx = events_df["event"] == "RedeemWithdrawalShares"
Expand All @@ -407,7 +443,12 @@ def trade_events_to_db(
events_df.loc[events_idx, "token_delta"] = -events_df.loc[events_idx, "withdrawalShareAmount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[events_idx, "base_delta"] = events_df.loc[events_idx, "baseAmount"].apply(
as_base_idx = events_df["asBase"] & events_idx
as_shares_idx = ~events_df["asBase"] & events_idx
events_df.loc[as_base_idx, "base_delta"] = events_df.loc[as_base_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)
events_df.loc[as_shares_idx, "vault_share_delta"] = events_df.loc[as_shares_idx, "amount"].apply(
lambda x: Decimal(x) / Decimal(1e18) # type: ignore
)

Expand All @@ -426,9 +467,19 @@ def trade_events_to_db(
"token_id": "token_id",
"token_delta": "token_delta",
"base_delta": "base_delta",
"vault_share_delta": "vault_share_delta",
"asBase": "as_base",
"vaultSharePrice": "vault_share_price",
}

events_df = events_df[list(rename_dict.keys())].rename(columns=rename_dict)

# Token deltas should always be a number
assert (~events_df["token_delta"].isnull()).all()
# Replace any nans in deltas with 0
# pandas doesn't play nice with types and decimals
events_df["base_delta"] = events_df["base_delta"].fillna(Decimal(0)) # type: ignore
events_df["vault_share_delta"] = events_df["vault_share_delta"].fillna(Decimal(0)) # type: ignore

# Add to db
df_to_db(events_df, TradeEvent, db_session)
14 changes: 7 additions & 7 deletions src/agent0/chainsync/db/hyperdrive/convert_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ def _build_wallet_deltas(logs: list[dict], tx_hash: str, block_number) -> list[W
if log["event"] == "AddLiquidity":
wallet_addr = log["args"]["provider"]
token_delta = _convert_scaled_value_to_decimal(log["args"]["lpAmount"])
base_delta = _convert_scaled_value_to_decimal(-log["args"]["baseAmount"])
base_delta = _convert_scaled_value_to_decimal(-log["args"]["amount"])
wallet_deltas.extend(
[
WalletDelta(
Expand All @@ -244,7 +244,7 @@ def _build_wallet_deltas(logs: list[dict], tx_hash: str, block_number) -> list[W
elif log["event"] == "OpenLong":
wallet_addr = log["args"]["trader"]
token_delta = _convert_scaled_value_to_decimal(log["args"]["bondAmount"])
base_delta = _convert_scaled_value_to_decimal(-log["args"]["baseAmount"])
base_delta = _convert_scaled_value_to_decimal(-log["args"]["amount"])
maturity_time = log["args"]["maturityTime"]
wallet_deltas.extend(
[
Expand All @@ -271,7 +271,7 @@ def _build_wallet_deltas(logs: list[dict], tx_hash: str, block_number) -> list[W
elif log["event"] == "OpenShort":
wallet_addr = log["args"]["trader"]
token_delta = _convert_scaled_value_to_decimal(log["args"]["bondAmount"])
base_delta = _convert_scaled_value_to_decimal(-log["args"]["baseAmount"])
base_delta = _convert_scaled_value_to_decimal(-log["args"]["amount"])
maturity_time = log["args"]["maturityTime"]
wallet_deltas.extend(
[
Expand Down Expand Up @@ -300,7 +300,7 @@ def _build_wallet_deltas(logs: list[dict], tx_hash: str, block_number) -> list[W
# Two deltas, one for withdrawal shares, one for lp tokens
lp_delta = _convert_scaled_value_to_decimal(-log["args"]["lpAmount"])
withdrawal_delta = _convert_scaled_value_to_decimal(log["args"]["withdrawalShareAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["baseAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["amount"])
wallet_deltas.extend(
[
WalletDelta(
Expand Down Expand Up @@ -333,7 +333,7 @@ def _build_wallet_deltas(logs: list[dict], tx_hash: str, block_number) -> list[W
elif log["event"] == "CloseLong":
wallet_addr = log["args"]["trader"]
token_delta = _convert_scaled_value_to_decimal(-log["args"]["bondAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["baseAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["amount"])
maturity_time = log["args"]["maturityTime"]
wallet_deltas.extend(
[
Expand All @@ -360,7 +360,7 @@ def _build_wallet_deltas(logs: list[dict], tx_hash: str, block_number) -> list[W
elif log["event"] == "CloseShort":
wallet_addr = log["args"]["trader"]
token_delta = _convert_scaled_value_to_decimal(-log["args"]["bondAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["baseAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["amount"])
maturity_time = log["args"]["maturityTime"]
wallet_deltas.extend(
[
Expand Down Expand Up @@ -388,7 +388,7 @@ def _build_wallet_deltas(logs: list[dict], tx_hash: str, block_number) -> list[W
wallet_addr = log["args"]["provider"]
maturity_time = None
token_delta = _convert_scaled_value_to_decimal(-log["args"]["withdrawalShareAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["baseAmount"])
base_delta = _convert_scaled_value_to_decimal(log["args"]["amount"])
wallet_deltas.extend(
[
WalletDelta(
Expand Down
12 changes: 12 additions & 0 deletions src/agent0/chainsync/db/hyperdrive/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,18 @@ class TradeEvent(Base):
"""
The change in base tokens for the event with respect to the wallet address.
"""
vault_share_delta: Mapped[Union[Decimal, None]] = mapped_column(FIXED_NUMERIC, default=None)
"""
The change in vault share tokens for the event with respect to the wallet address.
"""
as_base: Mapped[Union[bool, None]] = mapped_column(Boolean, default=None)
"""
A flag defining if the trade was made in units of base or vault shares.
"""
vault_share_price: Mapped[Union[Decimal, None]] = mapped_column(FIXED_NUMERIC, default=None)
"""
The vault share price at the time of the emitted event.
"""


# TODO: either make a more general TokenDelta, or rename this to HyperdriveDelta
Expand Down
56 changes: 28 additions & 28 deletions src/agent0/core/hyperdrive/interactive/event_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ class OpenLong:
"""The encoded asset id for this long."""
maturity_time: int
"""The maturity time for the opened long."""
base_amount: FixedPoint
"""The amount of longs opened in units of base."""
vault_share_amount: FixedPoint
"""The amount of longs opened in units of shares."""
amount: FixedPoint
"""The amount of longs opened, units dependent on `as_base` flag."""
vault_share_price: FixedPoint
"""The share price at the time of this trade."""
as_base: bool
"""If the input amount for the trade was in base or shares."""
bond_amount: FixedPoint
Expand All @@ -44,10 +44,10 @@ class CloseLong:
"""The encoded asset id for this long."""
maturity_time: int
"""The maturity time for the closed long."""
base_amount: FixedPoint
"""The amount of longs closed in units of base."""
vault_share_amount: FixedPoint
"""The amount of longs closed in units of shares."""
amount: FixedPoint
"""The amount of longs closed, units dependent on `as_base` flag."""
vault_share_price: FixedPoint
"""The share price at the time of this trade."""
as_base: bool
"""If the input amount for the trade was in base or shares."""
bond_amount: FixedPoint
Expand All @@ -67,10 +67,10 @@ class OpenShort:
"""The encoded asset id for this short."""
maturity_time: int
"""The maturity time for the opened short."""
base_amount: FixedPoint
"""The amount spent from opening the short, in units of base."""
vault_share_amount: FixedPoint
"""The amount spent from opening the short, in units of shares."""
amount: FixedPoint
"""The amount spent from opening the short, units dependent on `as_base` flag."""
vault_share_price: FixedPoint
"""The share price at the time of this trade."""
as_base: bool
"""If the input amount for the trade was in base or shares."""
base_proceeds: FixedPoint
Expand All @@ -94,10 +94,10 @@ class CloseShort:
"""The encoded asset id for this short."""
maturity_time: int
"""The maturity time for the closed short."""
base_amount: FixedPoint
"""The amount retrieved from closing the short, in units of base."""
vault_share_amount: FixedPoint
"""The amount retrieved from closing the short, in units of shares."""
amount: FixedPoint
"""The amount spent from closing the short, units dependent on `as_base` flag."""
vault_share_price: FixedPoint
"""The share price at the time of this trade."""
as_base: bool
"""If the input amount for the trade was in base or shares."""
base_payment: FixedPoint
Expand All @@ -117,10 +117,10 @@ class AddLiquidity:
"""The address of the lp provider."""
lp_amount: FixedPoint
"""The amount of liquidity added in units of lp."""
base_amount: FixedPoint
"""The amount of liquidity added, in units of base."""
vault_share_amount: FixedPoint
"""The amount of liquidity added, in units of shares."""
amount: FixedPoint
"""The amount of liquidity added, units dependent on `as_base` flag."""
vault_share_price: FixedPoint
"""The share price at the time of this trade."""
as_base: bool
"""If the input amount for the trade was in base or shares."""
lp_share_price: FixedPoint
Expand All @@ -140,10 +140,10 @@ class RemoveLiquidity:
"""The address that receives the proceeds of the trade."""
lp_amount: FixedPoint
"""The amount of liquidity removed in units of lp."""
base_amount: FixedPoint
"""The amount of liquidity removed, in units of base."""
vault_share_amount: FixedPoint
"""The amount of liquidity removed, in units of shares."""
amount: FixedPoint
"""The amount of liquidity removed, units dependent on `as_base` flag."""
vault_share_price: FixedPoint
"""The share price at the time of this trade."""
as_base: bool
"""If the input amount for the trade was in base or shares."""
withdrawal_share_amount: FixedPoint
Expand All @@ -165,10 +165,10 @@ class RedeemWithdrawalShares:
"""The address that receives the proceeds of the trade."""
withdrawal_share_amount: FixedPoint
"""The amount of withdrawal shares redeemed, in units of withdrawal shares."""
base_amount: FixedPoint
"""The amount of withdrawal shares redeemed, in units of base."""
vault_share_amount: FixedPoint
"""The amount of withdrawal shares redeemed, in units of shares."""
amount: FixedPoint
"""The amount of withdrawal shares redeemed, units dependent on `as_base` flag."""
vault_share_price: FixedPoint
"""The share price at the time of this trade."""
as_base: bool
"""If the input amount for the trade was in base or shares."""

Expand Down
Loading

0 comments on commit e20f0af

Please sign in to comment.