Skip to content
Merged
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
50 changes: 30 additions & 20 deletions mytoncore/mytoncore.py
Original file line number Diff line number Diff line change
Expand Up @@ -1318,8 +1318,7 @@ def GetStake(self, account, args=None):
stake = account.balance - 10
#end if

pool_version = self.GetVersionFromCodeHash(account.codeHash)
is_single_nominator = pool_version is not None and 'spool' in pool_version
is_single_nominator = self.is_account_single_nominator(account)

if stake is None and usePool and not is_single_nominator:
stake = account.balance - 20
Expand Down Expand Up @@ -1408,6 +1407,7 @@ def ElectionEntry(self, args=None):
if (startWorkTime - now) > self.local.db["participateBeforeEnd"] and \
(now + self.local.db["periods"]["elections"]) < startWorkTime:
return
#end if

vconfig = self.GetValidatorConfig()

Expand All @@ -1417,8 +1417,10 @@ def ElectionEntry(self, args=None):
if base64.b64decode(a.id) == adnl_addr_bytes:
have_adnl = True
break
#end for
if not have_adnl:
raise Exception('ADNL address is not found')
#end if

# Check if election entry already completed
entries = self.GetElectionEntries()
Expand All @@ -1428,14 +1430,13 @@ def ElectionEntry(self, args=None):
#end if

if usePool:
pool = self.GetPool(mode="stake")
pool = self.get_pool()
addrB64 = pool.addrB64
elif useController:
controllerAddr = self.GetController(mode="stake")
self.CheckController(controllerAddr)
self.CreateLoanRequest(controllerAddr)
addrB64 = controllerAddr
#end if

# Calculate stake
account = self.GetAccount(addrB64)
Expand Down Expand Up @@ -3549,35 +3550,44 @@ def GetPools(self):
return pools
#end define

def GetPool(self, mode):
def get_pool(self):
pools = self.GetPools()
for pool in pools:
if mode == "stake" and self.IsPoolReadyToStake(pool.addrB64):
return pool
if mode == "vote" and self.IsPoolReadyToVote(pool.addrB64):
if self.is_pool_ready_to_stake(pool):
return pool
raise Exception("Validator pool not found or not ready")
#end define

def GetPoolLastSentStakeTime(self, addrB64):
poolData = self.GetPoolData(addrB64)
return poolData["stakeAt"]
def get_pool_last_sent_stake_time(self, addrB64):
pool_data = self.GetPoolData(addrB64)
return pool_data["stakeAt"]
#end define

def IsPoolReadyToStake(self, addrB64):
def is_pool_ready_to_stake(self, pool: Pool):
addr = pool.addrB64
account = self.GetAccount(addr)
is_single_nominator = self.is_account_single_nominator(account)
if self.using_single_nominator() and not is_single_nominator:
return False
try: # check that account balance is enough for stake
stake = self.GetStake(account)
if not stake:
raise Exception(f'Stake is {stake}')
except Exception as e:
self.local.add_log(f"Failed to get stake for pool {addr}: {e}", "debug")
return False
now = get_timestamp()
config15 = self.GetConfig15()
lastSentStakeTime = self.GetPoolLastSentStakeTime(addrB64)
stakeFreezeDelay = config15["validatorsElectedFor"] + config15["stakeHeldFor"]
result = lastSentStakeTime + stakeFreezeDelay < now
print(f"{addrB64}: {result}. {lastSentStakeTime}, {stakeFreezeDelay}, {now}")
last_sent_stake_time = self.get_pool_last_sent_stake_time(addr)
stake_freeze_delay = config15["validatorsElectedFor"] + config15["stakeHeldFor"]
result = last_sent_stake_time + stake_freeze_delay < now
print(f"{addr}: {result}. {last_sent_stake_time}, {stake_freeze_delay}, {now}")
return result
#end define

def IsPoolReadyToVote(self, addrB64):
vwl = self.GetValidatorsWalletsList()
result = addrB64 in vwl
return result
def is_account_single_nominator(self, account: Account):
account_version = self.GetVersionFromCodeHash(account.codeHash)
return account_version is not None and 'spool' in account_version
#end define

def GetPoolData(self, addrB64):
Expand Down