Skip to content

Commit

Permalink
Merge branch 'develop' into kacper/feat/oct-2263-community-onboarding…
Browse files Browse the repository at this point in the history
…-through-sablier
  • Loading branch information
aziolek authored Jan 15, 2025
2 parents 5c06820 + 5d5d16d commit b40d187
Show file tree
Hide file tree
Showing 130 changed files with 3,546 additions and 1,301 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/tpl-deploy-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,8 @@ env:
SKIP_LOCAL_SUBGRAPH_UPDATE: ${{ inputs.skip-local-subgraph-update }}
ANVIL_BLOCK_TIME: ${{ inputs.anvil-block-time }}
SECRET_WORDS: test test test test test test test test test test test junk
PROPOSALS_ADDRESSES: 0x09A38B6187a2c44B6ba71c277c50764B5878b824,0x5597cD8d55D2Db56b10FF4F8fe69C8922BF6C537,0x3250c2CEE20FA34D1c4F68eAA87E53512e95A62a,0x0B7246eF74Ca7b37Fdc3D15be4f0b49876622F95,0x15c941a44a343B8c46a28F2BB9aFc7a54E255A4f,0xe7d4Ac3c77cF3683E0d15C15eaba7CDB8c092D98,0xa83a92297B3d80A70cC396bf74424971A9890704,0x7380A42137D16a0E7684578d8b3d32e1fbD021B5,0x53390590476dC98860316e4B46Bb9842AF55efc4,0x576edCed7475D8F64a5e2D5227c93Ca57d7f5d20,0x809C9f8dd8CA93A41c3adca4972Fa234C28F7714,0x4C6fd545fc18C6538eC304Ae549717CA58f0D6eb,0xfFbD35255008F86322051F2313D4b343540e0e00,0x9be7267002CAD0b8501f7322d50612CB13788Bcf,0x7Dd488f03E0A043b550E82D3C2685aA83B96407C,0x2DCDF80f439843D7E0aD1fEF9E7a439B7917eAc9,0xd1B8dB70Ded72dB850713b2ce7e1A4FfAfAD95d1,0x08e40e1C0681D072a54Fc5868752c02bb3996FFA,0x0cbF31Ef6545EE30f47651D1A991Bf0aeB03DF29,0x02Cb3C150BEdca124d0aE8CcCb72fefbe705c953,0x9531C059098e3d194fF87FebB587aB07B30B1306,0xBCA48834b3653ec795411EB0FCBE4038F8527d62,0xa095Ee27B11FCAac8e1be84891ab62C74F08C854,0xF41a98D4F2E52aa1ccB48F0b6539e955707b8F7a,0x87fEEd6162CB7dFe6B62F64366742349bF4D1B05,0x1337E2624ffEC537087c6774e9A18031CFEAf0a9,0x00080706a7D99CBC163D52dcF435205B1aD940D1,0x992A3a242D6471d24783b4C2C6AF3EC7df871761,0xFC1436689F68079Fc17A931666b7947789229ed8,0xfcBf17200C64E860F6639aa12B525015d115F863
PROPOSALS_CID: QmdtFLK3sB7EwQTNaqtmBnZqnN2pYZcu6GmUSTrpvb9wcq
PROPOSALS_ADDRESSES: 0x898b2500C4Fed262D7cc564dD892A34B33DA0a41,0x09A38B6187a2c44B6ba71c277c50764B5878b824,0x3250c2CEE20FA34D1c4F68eAA87E53512e95A62a,0x8D3AcA27963D5BAD978d3e953D3F3680cEa3FAeC,0xa39E7b901570120f6F963bccE8F5Ea4D883Cb2EE,0xe1887fF140BfA9D3b45D0B2077b7471124acD242,0x2B76AbD0889620597d6A52fccc4865d04004eAa7,0x242ba6d68FfEb4a098B591B32d370F973FF882B7,0x15c941a44a343B8c46a28F2BB9aFc7a54E255A4f,0xa83a92297B3d80A70cC396bf74424971A9890704,0x53390590476dC98860316e4B46Bb9842AF55efc4,0x576edCed7475D8F64a5e2D5227c93Ca57d7f5d20,0x9438b8B447179740cD97869997a2FCc9b4AA63a2,0x004C1193262542ffF59e64fF29404DEAeb3F3dEC,0xB3f2b4a0b5F2f99e6B6bfc71D5E18a59B92D5606,0x08e40e1C0681D072a54Fc5868752c02bb3996FFA,0x0cbF31Ef6545EE30f47651D1A991Bf0aeB03DF29,0xaaBC0D621F375Ec70fB0e83CdC6FE60281697854,0x9531C059098e3d194fF87FebB587aB07B30B1306,0xBCA48834b3653ec795411EB0FCBE4038F8527d62,0xa095Ee27B11FCAac8e1be84891ab62C74F08C854,0x7DAC9Fc15C1Db4379D75A6E3f330aE849dFfcE18,0x74D8967e812de34702eCD3D453a44bf37440b10b,0xF41a98D4F2E52aa1ccB48F0b6539e955707b8F7a,0x87fEEd6162CB7dFe6B62F64366742349bF4D1B05,0x1337E2624ffEC537087c6774e9A18031CFEAf0a9,0x00080706a7D99CBC163D52dcF435205B1aD940D1,0xFC1436689F68079Fc17A931666b7947789229ed8,0x7340F1a1e4e38F43d2FCC85cdb2b764de36B40c0,0xfcBf17200C64E860F6639aa12B525015d115F863
PROPOSALS_CID: bafybeifs53yk5oycvy5lu5r42oefk3vh7qkvfdkklkvaw2ocubmycgvche
MULTISIG_ADDRESS: "${{ vars.MULTISIG_ADDRESS }}"
TESTNET_DEPLOYER_PRIVATE_KEY: "${{ secrets.TESTNET_DEPLOYER_PRIVATE_KEY }}"
TESTNET_MULTISIG_PRIVATE_KEY: "${{ secrets.TESTNET_MULTISIG_PRIVATE_KEY }}"
Expand Down
663 changes: 324 additions & 339 deletions backend/app/constants.py

Large diffs are not rendered by default.

9 changes: 2 additions & 7 deletions backend/app/engine/epochs_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ def register_epoch_settings():
),
user=UserSettings(
budget=PreliminaryUserBudget(),
effective_deposit=DefaultWeightedAverageEffectiveDeposit(),
),
project=ProjectSettings(
rewards=PreliminaryProjectRewards(
Expand All @@ -95,10 +94,6 @@ def register_epoch_settings():
user=UserSettings(effective_deposit=DefaultWeightedAverageEffectiveDeposit()),
project=ProjectSettings(rewards=PreliminaryProjectRewards()),
)
SETTINGS[4] = EpochSettings(
user=UserSettings(effective_deposit=DefaultWeightedAverageEffectiveDeposit())
)
SETTINGS[5] = EpochSettings(
user=UserSettings(effective_deposit=DefaultWeightedAverageEffectiveDeposit())
)
SETTINGS[4] = EpochSettings()
SETTINGS[5] = EpochSettings()
SETTINGS[6] = EpochSettings()
6 changes: 3 additions & 3 deletions backend/app/engine/user/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
from app.engine.user.budget import UserBudget
from app.engine.user.budget.with_ppf import UserBudgetWithPPF
from app.engine.user.effective_deposit import UserEffectiveDeposit
from app.engine.user.effective_deposit.weighted_average.default_with_sablier_timebox import (
DefaultWeightedAverageWithSablierTimebox,
from app.engine.user.effective_deposit.weighted_average.default import (
DefaultWeightedAverageEffectiveDeposit,
)


@dataclass
class UserSettings:
effective_deposit: UserEffectiveDeposit = field(
default_factory=DefaultWeightedAverageWithSablierTimebox
default_factory=DefaultWeightedAverageEffectiveDeposit
)
budget: UserBudget = field(default_factory=UserBudgetWithPPF)
1 change: 0 additions & 1 deletion backend/app/engine/user/effective_deposit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ class UserEffectiveDepositPayload:
epoch_start: int = None
epoch_end: int = None
lock_events_by_addr: LockEventsByAddr = None
sablier_unlock_grace_period: int = None


@dataclass
Expand Down

This file was deleted.

4 changes: 2 additions & 2 deletions backend/app/infrastructure/contracts/erc20.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def glm_fund(self, to_address, nonce):
return self.w3.eth.send_raw_transaction(signed_tx.rawTransaction)

def transfer(self, sender, receiver: str, amount: int):
nonce = self.w3.eth.get_transaction_count(sender.address)
nonce = self.w3.eth.get_transaction_count(sender.address, "pending")
transaction = self.contract.functions.transfer(
receiver, amount
).build_transaction({"from": sender.address, "nonce": nonce})
Expand All @@ -26,7 +26,7 @@ def approve(self, owner, benefactor, wad: int):
print("owner address: ", owner.address)
print("owner key: ", owner.key)
print("benefactor of lock: ", benefactor)
nonce = self.w3.eth.get_transaction_count(owner.address)
nonce = self.w3.eth.get_transaction_count(owner.address, "pending")
transaction = self.contract.functions.approve(
benefactor, wad
).build_transaction({"from": owner.address, "nonce": nonce})
Expand Down
6 changes: 1 addition & 5 deletions backend/app/modules/common/effective_deposits.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,13 @@ def calculate_effective_deposits(
epoch_details: EpochDetails,
epoch_settings: EpochSettings,
events: Dict[str, List[DepositEvent]],
sablier_unlock_grace_period: int = None,
) -> Tuple[List[UserDeposit], int]:
start = epoch_details.start_sec
end = epoch_details.end_sec
effective_deposit_calculator = epoch_settings.user.effective_deposit

return effective_deposit_calculator.calculate_users_effective_deposits(
UserEffectiveDepositPayload(
epoch_start=start,
epoch_end=end,
lock_events_by_addr=events,
sablier_unlock_grace_period=sablier_unlock_grace_period,
epoch_start=start, epoch_end=end, lock_events_by_addr=events
)
)
13 changes: 8 additions & 5 deletions backend/app/modules/modules_factory/current.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,12 +100,15 @@ def _prepare_simulation_data(
@staticmethod
def create(chain_id: int) -> "CurrentServices":
is_mainnet = compare_blockchain_types(chain_id, ChainTypes.MAINNET)

user_deposits = CalculatedUserDeposits(
events_generator=DbAndGraphEventsGenerator(),
sablier_unlock_grace_period=SABLIER_UNLOCK_GRACE_PERIOD_24_HRS
sablier_unlock_grace_period = (
SABLIER_UNLOCK_GRACE_PERIOD_24_HRS
if is_mainnet
else TEST_SABLIER_UNLOCK_GRACE_PERIOD_15_MIN,
else TEST_SABLIER_UNLOCK_GRACE_PERIOD_15_MIN
)
user_deposits = CalculatedUserDeposits(
events_generator=DbAndGraphEventsGenerator(
sablier_unlock_grace_period=sablier_unlock_grace_period
)
)

octant_rewards = CurrentServices._prepare_simulation_data(
Expand Down
12 changes: 8 additions & 4 deletions backend/app/modules/modules_factory/pre_pending.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,16 @@ class PrePendingServices(Model):
@staticmethod
def create(chain_id: int) -> "PrePendingServices":
is_mainnet = compare_blockchain_types(chain_id, ChainTypes.MAINNET)
sablier_unlock_grace_period = (
SABLIER_UNLOCK_GRACE_PERIOD_24_HRS
if is_mainnet
else TEST_SABLIER_UNLOCK_GRACE_PERIOD_15_MIN
)

user_deposits = CalculatedUserDeposits(
events_generator=DbAndGraphEventsGenerator(),
sablier_unlock_grace_period=SABLIER_UNLOCK_GRACE_PERIOD_24_HRS
if is_mainnet
else TEST_SABLIER_UNLOCK_GRACE_PERIOD_15_MIN,
events_generator=DbAndGraphEventsGenerator(
sablier_unlock_grace_period=sablier_unlock_grace_period
)
)
octant_rewards = CalculatedOctantRewards(
staking_proceeds=(
Expand Down
6 changes: 3 additions & 3 deletions backend/app/modules/projects/details/controller.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import List, Dict
from typing import List

from app.context.manager import epoch_context
from app.modules.registry import get_services
Expand All @@ -7,7 +7,7 @@

def get_projects_details_for_multiple_params(
epochs: List[int], search_phrases: List[str]
) -> List[Dict[str, str]]:
) -> list[dict[str, str]]:
searched_projects = []
for epoch in epochs:
for search_phrase in search_phrases:
Expand All @@ -16,7 +16,7 @@ def get_projects_details_for_multiple_params(
return searched_projects


def get_projects_details(epoch: int, search_phrase: str) -> List[Dict[str, str]]:
def get_projects_details(epoch: int, search_phrase: str) -> list[dict[str, str]]:
context = epoch_context(epoch)

service = get_services(context.epoch_state).projects_details_service
Expand Down
2 changes: 1 addition & 1 deletion backend/app/modules/score_delegation/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from app.modules.common.delegation import HashedAddresses, hash_addresses
from app.modules.dto import ScoreDelegationPayload

MIN_SCORE = 20
MIN_SCORE = 15


class ActionType(Enum):
Expand Down
5 changes: 1 addition & 4 deletions backend/app/modules/user/budgets/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,7 @@ def estimate_epoch_budget(
ZERO_ADDRESS: simulate_user_events(epoch_details, lock_duration, glm_amount)
}
user_effective_deposits, _ = calculate_effective_deposits(
epoch_details,
epoch_settings,
events,
sablier_unlock_grace_period=sablier_unlock_grace_period,
epoch_details, epoch_settings, events
)
effective_deposit = (
user_effective_deposits[0].effective_deposit if user_effective_deposits else 0
Expand Down
17 changes: 3 additions & 14 deletions backend/app/modules/user/deposits/service/calculated.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,39 +28,28 @@ def get_all_users_events(self, context: Context) -> Dict[str, List[DepositEvent]

class CalculatedUserDeposits(Model):
events_generator: EventsGenerator
sablier_unlock_grace_period: int

def get_all_effective_deposits(
self, context: Context
) -> Tuple[List[UserDeposit], int]:
events = self.events_generator.get_all_users_events(context)
return calculate_effective_deposits(
context.epoch_details,
context.epoch_settings,
events,
self.sablier_unlock_grace_period,
context.epoch_details, context.epoch_settings, events
)

def get_total_effective_deposit(self, context: Context) -> int:
events = self.events_generator.get_all_users_events(context)
_, total = calculate_effective_deposits(
context.epoch_details,
context.epoch_settings,
events,
self.sablier_unlock_grace_period,
context.epoch_details, context.epoch_settings, events
)
return total

def get_user_effective_deposit(self, context: Context, user_address: str) -> int:
events = {
user_address: self.events_generator.get_user_events(context, user_address)
}
print("events", events)
deposits, _ = calculate_effective_deposits(
context.epoch_details,
context.epoch_settings,
events,
self.sablier_unlock_grace_period,
context.epoch_details, context.epoch_settings, events
)
return deposits[0].effective_deposit

Expand Down
72 changes: 59 additions & 13 deletions backend/app/modules/user/events_generator/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
from app.engine.user.effective_deposit import DepositEvent, EventType, DepositSource


def unify_deposit_balances(events: List[DepositEvent]) -> List[DepositEvent]:
def unify_deposit_balances(
events: List[DepositEvent], sablier_unlock_grace_period: int
) -> List[DepositEvent]:
"""
Unify deposit balance for each event in the list of events. Events are expected to be sorted by timestamp.
The first event is taken from deposits, but it already includes deposit from Sablier from the past.
Expand All @@ -17,23 +19,67 @@ def unify_deposit_balances(events: List[DepositEvent]) -> List[DepositEvent]:
acc_balance_sablier = 0
acc_balance_octant = events[0].deposit_before # balance from previous epoch

for event in modified_events[1:]:
i = 0
while i < len(modified_events) - 1:
current_event = modified_events[i]
next_event = modified_events[i + 1]

if current_event.type == EventType.UNLOCK and next_event.type == EventType.LOCK:
if (
current_event.source == DepositSource.SABLIER
and next_event.source == DepositSource.OCTANT
and next_event.timestamp - current_event.timestamp
< sablier_unlock_grace_period
):
unlocked_amount = current_event.amount
locked_amount = next_event.amount

if locked_amount == unlocked_amount:
# Scenario 1: Transparent unlock and lock
del modified_events[i : i + 2]
continue
elif locked_amount > unlocked_amount:
# Scenario 3: Transparent unlock, only record the excess lock
excess_amount = locked_amount - unlocked_amount
next_event.amount = excess_amount
next_event.deposit_before = acc_balance_sablier + acc_balance_octant
next_event.deposit_after = next_event.deposit_before + excess_amount
del modified_events[i] # Remove the unlock event
continue

# Update balances for normal event processing
combined_balance = acc_balance_sablier + acc_balance_octant
event.deposit_before = combined_balance
current_event.deposit_before = combined_balance

if event.type == EventType.LOCK:
if event.source == DepositSource.SABLIER:
acc_balance_sablier += event.amount
if current_event.type == EventType.LOCK:
if current_event.source == DepositSource.SABLIER:
acc_balance_sablier += current_event.amount
else:
acc_balance_octant += event.amount
acc_balance_octant += current_event.amount

event.deposit_after = event.deposit_before + event.amount
elif event.type == EventType.UNLOCK:
if event.source == DepositSource.SABLIER:
acc_balance_sablier -= event.amount
current_event.deposit_after = (
current_event.deposit_before + current_event.amount
)
elif current_event.type == EventType.UNLOCK:
if current_event.source == DepositSource.SABLIER:
acc_balance_sablier -= current_event.amount
else:
acc_balance_octant -= event.amount
acc_balance_octant -= current_event.amount

event.deposit_after = event.deposit_before - event.amount
current_event.deposit_after = (
current_event.deposit_before - current_event.amount
)

i += 1

# Process the last event
if modified_events:
last_event = modified_events[-1]
combined_balance = acc_balance_sablier + acc_balance_octant
last_event.deposit_before = combined_balance
if last_event.type == EventType.LOCK:
last_event.deposit_after = last_event.deposit_before + last_event.amount
elif last_event.type == EventType.UNLOCK:
last_event.deposit_after = last_event.deposit_before - last_event.amount

return modified_events
Loading

0 comments on commit b40d187

Please sign in to comment.