import asyncio import os from tonsdk.boc import begin_cell from app.core._blockchain.ton.platform import platform from app.core._blockchain.ton.toncenter import toncenter from app.core._config import MY_FUND_ADDRESS from app.core._secrets import service_wallet from app.core._utils.send_status import send_status from app.core.logger import make_log async def get_sw_seqno(): sw_seqno_result = await toncenter.run_get_method(service_wallet.address.to_string(1, 1, 1), 'seqno') if sw_seqno_result.get('exit_code', -1) != 0: sw_seqno_value = 0 else: sw_seqno_value = int(sw_seqno_result.get('stack', [['num', '0x0']])[0][1].replace('0x', ''), 16) return sw_seqno_value async def main_fn(): make_log("TON", f"Service started, SW = {service_wallet.address.to_string(1, 1, 1)}", level="info") sw_seqno_value = await get_sw_seqno() make_log("TON", f"Service wallet run seqno method: {sw_seqno_value}", level="info") if sw_seqno_value == 0: make_log("TON", "Service wallet is not deployed, deploying...", level="info") await toncenter.send_boc( service_wallet.create_transfer_message( [{ 'address': service_wallet.address.to_string(1, 1, 1), 'amount': 1, 'send_mode': 1, 'payload': begin_cell().store_uint(0, 32).store_bytes(b"Init MY Node").end_cell() }], 0 )['message'].to_boc(False) ) await asyncio.sleep(5) return await main_fn() if os.getenv("TON_BEGIN_COMMAND_WITHDRAW"): await toncenter.send_boc( service_wallet.create_transfer_message( [{ 'address': MY_FUND_ADDRESS, 'amount': 1, 'send_mode': 128, 'payload': begin_cell().end_cell() }], sw_seqno_value )['message'].to_boc(False) ) make_log("TON", "Withdraw command sent", level="info") await asyncio.sleep(10) return await main_fn() platform_state = await toncenter.get_account(platform.address.to_string(1, 1, 1)) if not platform_state.get('code'): make_log("TON", "Platform contract is not deployed, send deploy transaction..", level="info") await toncenter.send_boc( service_wallet.create_transfer_message( [{ 'address': platform.address.to_string(1, 1, 1), 'amount': int(0.08 * 10 ** 9), 'send_mode': 1, 'payload': begin_cell().store_uint(0, 32).store_uint(0, 64).end_cell(), 'state_init': platform.create_state_init()['state_init'] }], sw_seqno_value )['message'].to_boc(False) ) await send_status("ton_daemon", "working: deploying platform") await asyncio.sleep(15) return await main_fn() while True: try: sw_seqno_value = await get_sw_seqno() make_log("TON", f"Service running ({sw_seqno_value})", level="debug") # with db_session() as session: # for stored_content in session.query(StoredContent).filter(StoredContent.uploaded == False).all(): # pass await asyncio.sleep(5) await send_status("ton_daemon", f"working (seqno={sw_seqno_value})") except BaseException as e: make_log("TON", f"Error: {e}", level="error") await asyncio.sleep(3) # if __name__ == '__main__': # loop = asyncio.get_event_loop() # loop.run_until_complete(main()) # loop.close()