Skip to content

Commit

Permalink
Merge pull request #32 from BeanstalkFarms/fix/sk/migrate
Browse files Browse the repository at this point in the history
Fix fert mint message on migrate
  • Loading branch information
soilking authored Oct 14, 2024
2 parents 18222ee + 32292c3 commit 511217a
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 101 deletions.
8 changes: 1 addition & 7 deletions src/bots/discord_bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,7 @@ def __init__(self, prod=False, telegram_token=None, dry_run=None):
self.market_monitor = MarketMonitor(self.send_msg_market, prod=prod, dry_run=dry_run)
self.market_monitor.start()

self.barn_raise_monitor = BarnRaiseMonitor(
self.send_msg_barn_raise,
report_events=True,
report_summaries=False,
prod=prod,
dry_run=dry_run,
)
self.barn_raise_monitor = BarnRaiseMonitor(self.send_msg_barn_raise, prod=prod, dry_run=dry_run)
self.barn_raise_monitor.start()

self.contract_migration_monitor = ContractsMigrated(
Expand Down
4 changes: 1 addition & 3 deletions src/bots/telegram_bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,7 @@ def __init__(self, token, prod=False, dry_run=None):
self.market_monitor = MarketMonitor(self.send_msg, prod=prod, dry_run=dry_run)
self.market_monitor.start()

self.barn_raise_monitor = BarnRaiseMonitor(
self.send_msg, report_events=True, report_summaries=False, prod=prod, dry_run=dry_run
)
self.barn_raise_monitor = BarnRaiseMonitor(self.send_msg, prod=prod, dry_run=dry_run)
self.barn_raise_monitor.start()

def send_msg(self, msg):
Expand Down
2 changes: 1 addition & 1 deletion src/bots/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ def event_in_logs(name, event_logs):


def remove_events_from_logs_by_name(name, event_logs):
for event_log in event_logs:
for event_log in event_logs[:]:
if event_log.event == name:
event_logs.remove(event_log)

Expand Down
11 changes: 9 additions & 2 deletions src/data_access/contracts/eth_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,14 @@ def add_event_to_dict(signature, sig_dict, sig_list):
FERTILIZER_EVENT_MAP,
FERTILIZER_SIGNATURES_LIST,
)
# Needed to identify when fert mints should be ignored
add_event_to_dict(
"L1FertilizerMigrated(address,address,uint256[],uint128[],uint128)",
FERTILIZER_EVENT_MAP,
FERTILIZER_SIGNATURES_LIST,
)

# L2 Migration events
CONTRACTS_MIGRATED_EVENT_MAP = {}
CONTRACTS_MIGRATED_SIGNATURES_LIST = []
add_event_to_dict(
Expand Down Expand Up @@ -238,8 +245,8 @@ def __init__(self, event_client_type, addresses=[]):
self._events_dict = MARKET_EVENT_MAP
self._signature_list = MARKET_SIGNATURES_LIST
elif self._event_client_type == EventClientType.BARN_RAISE:
self._contracts = [get_fertilizer_contract(self._web3)]
self._contract_addresses = [FERTILIZER_ADDR]
self._contracts = [get_fertilizer_contract(self._web3), get_beanstalk_contract(self._web3)]
self._contract_addresses = [FERTILIZER_ADDR, BEANSTALK_ADDR]
self._events_dict = FERTILIZER_EVENT_MAP
self._signature_list = FERTILIZER_SIGNATURES_LIST
elif self._event_client_type == EventClientType.CONTRACT_MIGRATED:
Expand Down
92 changes: 13 additions & 79 deletions src/monitors/barn.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,12 @@ class BarnRaiseMonitor(Monitor):
def __init__(
self,
message_function,
report_events=True,
report_summaries=False,
prod=False,
dry_run=None,
):
super().__init__(
"BarnRaise", message_function, BARN_RAISE_CHECK_RATE, prod=prod, dry_run=dry_run
)
# Used for special init cases
# self.SUMMARY_BLOCK_RANGE = self._web3.eth.get_block('latest').number - 14918083
self.SUMMARY_BLOCK_RANGE = 1430 # ~ 6 hours
# self.SUMMARY_BLOCK_RANGE = 5720 + 1192 # ~ 24 hours, offset by 5 hours
self.EMOJI_RANKS = ["🥇", "🥈", "🥉"]
self.report_events = report_events
self.report_summaries = report_summaries
self.bean_client = BeanClient()
self.barn_raise_client = BarnRaiseClient()
self._eth_event_client = EthEventsClient(EventClientType.BARN_RAISE)
Expand All @@ -44,96 +35,39 @@ def _monitor_method(self):
continue
last_check_time = time.time()

# If reporting summaries and a 6 hour block has passed.
if self.report_summaries:
current_block = safe_get_block(self._web3, "latest")
if (current_block.number - 14915799) % self.SUMMARY_BLOCK_RANGE == 0:
# if True:
from_block = safe_get_block(
self._web3, current_block.number - self.SUMMARY_BLOCK_RANGE
)
time_range = current_block.timestamp - from_block.timestamp
all_events_in_time_range = []
for txn_pair in self._eth_event_client.get_log_range(
from_block=from_block.number, to_block=current_block.number
):
event_logs = txn_pair.logs
all_events_in_time_range.extend(event_logs)
# Do not report a summary if nothing happened.
if len(all_events_in_time_range) == 0:
logging.info("No events detected to summarize. Skipping summary.")
continue
# Sort events based on size.
all_events_in_time_range = sorted(
all_events_in_time_range,
key=lambda event: event.args.get("value") or sum(event.args.get("values")),
reverse=True,
)
# all_events_in_time_range = sorted(all_events_in_time_range, lambda(event: int(event.args.value)))
total_raised = 0
for event in all_events_in_time_range:
usdc_amount = int(event.args.value)
total_raised += usdc_amount
msg_str = f"🚛 In the past {round_num(time_range/3600, 1)} hours, ${round_num(total_raised, 0)} was raised from {len(all_events_in_time_range)} txns"
remaining = self.barn_raise_client.remaining()
msg_str += f"\n🪴 {round_num(remaining, 0)} Fertilizer remaining"
msg_str += f"\n"
for i in range(3):
try:
event = all_events_in_time_range[i]
# There may not be 3 events in a time block.
except IndexError:
break
# msg_str += f'\n{self.EMOJI_RANKS[i]} ${round_num(event.args.value, 0)} ({event.args["to"]})' # {event.transactionHash.hex()}
msg_str += f"\n{self.EMOJI_RANKS[i]} ${round_num(event.args.value, 0)} (https://arbiscan.io/tx/{event.transactionHash.hex()})"

self.message_function(msg_str)

# If reporting events.
if self.report_events:
# Check for new Bids, Bid updates, and Sows.
all_events = []
for txn_pair in self._eth_event_client.get_new_logs(dry_run=self._dry_run):
all_events.extend(txn_pair.logs)
for event_log in all_events:
self._handle_event_log(event_log)
all_events = []
for txn_pair in self._eth_event_client.get_new_logs(dry_run=self._dry_run):
event_logs = txn_pair.logs
if event_in_logs("L1FertilizerMigrated", event_logs):
# Ignore fertilizer mint as a result of contract migrating barn
remove_events_from_logs_by_name("TransferSingle", event_logs)
all_events.extend(event_logs)
for event_log in all_events:
self._handle_event_log(event_log)

def _handle_event_log(self, event_log):
"""Process a single event log for the Barn Raise."""
# Mint single.
if (
event_log.address == FERTILIZER_ADDR
and event_log.event in ["TransferSingle", "TransferBatch"]
and event_log.event in ["TransferSingle"]
and event_log.args["from"] == NULL_ADDR
):
if event_log.event == "TransferSingle":
amount = int(event_log.args.value)
# Mint batch. <- is this even possible???
elif event_log.event == "TransferBatch":
amount = sum([int(value) for value in event_log.args.values])
amount = int(event_log.args.value)
self.last_total_bought += amount

wsteth_amount = token_to_float(
get_tokens_sent(WSTETH, event_log.transactionHash, event_log.address, event_log.logIndex), 18
)

event_str = f"🚛 Fertilizer Purchased - {round_num(amount, 0)} Fert for {round_num(wsteth_amount, 3)} wstETH @ 20% Humidity"
total_bought = self.beanstalk_graph_client.get_fertilizer_bought()

# The subgraph is slower to update, so may need to calculate total bought here.
if total_bought <= self.last_total_bought + 1:
self.last_total_bought = total_bought + amount
else:
self.last_total_bought = total_bought

event_str += f" - Total sold: {round_num(self.last_total_bought, 0)}"
# event_str += f' ({round_num(self.barn_raise_client.remaining(), 0)} Available Fertilizer)'
event_str += f"\n{value_to_emojis(amount)}"
# Transfer or some other uninteresting transaction.
else:
# Transfer or some other uninteresting transaction.
return

event_str += f"\n<https://arbiscan.io/tx/{event_log.transactionHash.hex()}>"
# Empty line that does not get stripped.
event_str += "\n_ _"
self.message_function(event_str)
logging.info(f"\n\n\nfull barn message here {event_str}\n\n\n")
2 changes: 1 addition & 1 deletion src/monitors/beanstalk.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ def single_event_str(self, event_log):
bean_price = self.bean_client.avg_bean_price()

# Ignore these events
if event_log.event in ["RemoveWithdrawal", "RemoveWithdrawals" "Plant", "Pick"]:
if event_log.event in ["RemoveWithdrawal", "RemoveWithdrawals" "Plant", "Pick", "L1DepositsMigrated"]:
return ""
# Sow event.
elif event_log.event in ["Sow", "Harvest"]:
Expand Down
16 changes: 8 additions & 8 deletions src/monitors/contracts_migrated.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,31 +43,31 @@ def _handle_txn_logs(self, event_logs):
if event_log.event == "L1BeansMigrated":
beans = round_num(token_to_float(event_log.args.get("amount"), 6))
destination = 'circulating' if event_log.args.get("toMode") == 0 else 'internal'
breakdown_str += f"- Received {beans} Beans to {destination} balance"
breakdown_str += f"\n- Received {beans} Beans to {destination} balance"
elif event_log.event == "L1DepositsMigrated":
all_bdv = event_log.args.get("bdvs")
breakdown_str += f"- Received {round_num(sum(token_to_float(bdv, 6) for bdv in all_bdv))} bdv to the silo"
breakdown_str += f"\n- Received {round_num(sum(token_to_float(bdv, 6) for bdv in all_bdv))} bdv to the silo"
elif event_log.event == "L1PlotsMigrated":
all_pods = event_log.args.get("pods")
breakdown_str += f"- Received {round_num(sum(token_to_float(pods, 6) for pods in all_pods))} pods"
breakdown_str += f"\n- Received {round_num(sum(token_to_float(pods, 6) for pods in all_pods))} pods"
elif event_log.event == "L1InternalBalancesMigrated":
tokens = event_log.args.get("tokens")
breakdown_str += f"- Received balances of {len(tokens)} tokens to internal balance"
breakdown_str += f"\n- Received balances of {len(tokens)} tokens to internal balance"
elif event_log.event == "L1FertilizerMigrated":
amounts = event_log.args.get("amounts")
breakdown_str += f"- Received {sum(amounts)} fertilizer units across {len(amounts)} unique id(s)"
breakdown_str += f"\n- Received {sum(amounts)} fertilizer units across {len(amounts)} unique id(s)"
elif event_log.event == "ReceiverApproved":
breakdown_str += f"- Approved L2 receiver: {shorten_eth_address(receiver)}"
breakdown_str += f"\n- Approved L2 receiver: {shorten_eth_address(receiver)}"
else:
continue

if not breakdown_str:
return

if owner:
event_str += f"L1 Owner: {shorten_eth_address(owner)}\n"
event_str += f"L1 Owner: {shorten_eth_address(owner)}"

event_str += f"L2 Receiver: {shorten_eth_address(receiver)}\n"
event_str += f"\nL2 Receiver: {shorten_eth_address(receiver)}"
event_str += breakdown_str
event_str += f"\n<https://arbiscan.io/tx/{event_logs[0].transactionHash.hex()}>"
event_str += "\n_ _"
Expand Down

0 comments on commit 511217a

Please sign in to comment.