diff --git a/mm-bot/docs/README.md b/mm-bot/docs/README.md index 5ef56c57..209f61cb 100644 --- a/mm-bot/docs/README.md +++ b/mm-bot/docs/README.md @@ -21,7 +21,26 @@ Payment Registry contract. - The bot must be able to retry failed orders. - The bot must be able to perform adequate logs for the orders tracking. -[Version simplificada de la arquitectura] +### Simplified Class Diagram +```plantuml +@startuml +class Bot { + -order: Order + -paymentRegistry: PaymentRegistry + -database: Database + +run() + +readOrder() + +transfer() + +withdraw() + +storeOrder() + +updateOrder() + +storeError() + +retryOrder() +} +@enduml +``` +![MM_Diagram_Class.svg](images%2FMM_Diagram_Class.svg) +![MM_Diagram_Class_Full.svg](images%2FMM_Diagram_Class_Full.svg) ## Development View (TODO) diff --git a/mm-bot/docs/diagrams/class_diagrams.puml b/mm-bot/docs/diagrams/class_diagrams.puml index 9c3b7ff1..d83c4502 100644 --- a/mm-bot/docs/diagrams/class_diagrams.puml +++ b/mm-bot/docs/diagrams/class_diagrams.puml @@ -5,15 +5,22 @@ hide members class MM { run() - process_order_events() - create_order_tasks() - process_order() - failed_orders_job() - process_failed_orders() - set_order_events_from_accepted_blocks_job() - process_orders_from_accepted_blocks() - transfer() - wait_transfer() + process_order_events(order_events: list, order_service: OrderService, + eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore) + create_order_tasks(order: Order, order_service: OrderService, eth_lock: asyncio.Lock, + herodotus_semaphore: asyncio.Semaphore) + process_order(order: Order, order_service: OrderService, + eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore) + failed_orders_job(order_service: OrderService, + eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore) + process_failed_orders(order_service: OrderService, + eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore) + set_order_events_from_accepted_blocks_job(order_service: OrderService, block_dao: BlockDao, + eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore) + process_orders_from_accepted_blocks(order_service: OrderService, block_dao: BlockDao, + eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore) + transfer(order: Order, order_service: OrderService) + wait_transfer(order: Order, order_service: OrderService) } package services { diff --git a/mm-bot/docs/images/MM_Diagram_Class.svg b/mm-bot/docs/images/MM_Diagram_Class.svg new file mode 100644 index 00000000..d2e2206e --- /dev/null +++ b/mm-bot/docs/images/MM_Diagram_Class.svg @@ -0,0 +1 @@ +MM Diagram ClassservicesethereumstarknetwithdrawerspersistencemodelsHerodotusOrderServiceOverallFeeCalculatorEthereumEthereumRpcNodeStarknetStarknetRpcNodeMMFullNodeClientSetOrderEventWithdrawerEthereumWithdrawerHerodotusWithdrawerBlockDaoErrorDaoOrderDaoBlockErrorOrderOrderStatusMM \ No newline at end of file diff --git a/mm-bot/docs/images/MM_Diagram_Class_Full.svg b/mm-bot/docs/images/MM_Diagram_Class_Full.svg new file mode 100644 index 00000000..5c197ab3 --- /dev/null +++ b/mm-bot/docs/images/MM_Diagram_Class_Full.svg @@ -0,0 +1 @@ +MM Diagram ClassservicesethereumstarknetwithdrawerspersistencemodelsHerodotusherodotus_prove(block, order_id, slot): strherodotus_status(task_id): strherodotus_poll_status(task_id): boolOrderServicecreate_order(order: Order): Orderget_order(order_id): Order | Noneget_order(order_id): Order | Noneget_failed_orders()already_exists(order_id): boolset_order_processing(order: Order): Orderset_order_transferring(order: Order, tx_hash): Orderset_order_fulfilled(order: Order): Orderset_order_proving_herodotus(order: Order, task_id, block, slot): Orderset_order_proving_ethereum(order: Order, tx_hash): Orderset_order_proved(order: Order): Orderset_order_completed(order: Order): Orderset_order_dropped(order: Order): Orderset_order_failed(order: Order, error_message: str): Orderreset_failed_order(order: Order): Orderset_failed(order: Order, failed: bool): OrderOverallFeeCalculatorestimate_overall_fee(order: Order): intestimate_transfer_fee(order: Order): intestimate_yab_withdraw_fee(): intestimate_message_fee(order: Order):Ethereumtransfer(deposit_id, dst_addr, amount)withdraw(deposit_id, dst_addr, amount, value)get_is_used_order(order_id, recipient_address, amount, rpc_node): bool main methodsget_latest_block(rpc_node): intget_balance(rpc_node): inthas_funds(amount: int): boolcreate_transfer(deposit_id, dst_addr_bytes, amount, rpc_node)create_withdraw(deposit_id, dst_addr_bytes, amount, value, rpc_node)get_nonce(w3: Web3, address)estimate_transaction_fee(transaction, rpc_node)get_gas_price(rpc_node)has_enough_funds(amount: int, gas_fee: int): boolsend_raw_transaction(signed_tx, rpc_node)wait_for_transaction_receipt(tx_hash, rpc_node)auxiliary methodsEthereumRpcNodew3accountcontractStarknetget_starknet_events(from_block_number: Literal["pending", "latest"] | int | None,to_block_number: Literal["pending", "latest"] | int | None,continuation_token, rpc_node)get_order_events(from_block_number, to_block_number): list[SetOrderEvent]withdraw(order_id, block, slot): bool main methodscreate_set_order_event(event)get_order_id(event): intget_recipient_address(event): strget_amount(event): intparse_u256_from_double_u128(low, high): intget_fee(event): intget_latest_block(rpc_node): intsign_invoke_transaction(call: Call, max_fee: int, rpc_node)estimate_message_fee(from_address, to_address, entry_point_selector, payload, rpc_node)send_transaction(transaction, rpc_node)wait_for_tx(transaction_hash, rpc_node)auxiliary methodsStarknetRpcNodefull_node_clientaccountcontract_addressMMFullNodeClientSetOrderEventorder_idstarknet_tx_hashrecipient_addressamountfeeblock_numberis_usedWithdrawersend_withdraw(order: Order, order_service: OrderService)wait_for_withdraw(order: Order, order_service: OrderService)close_withdraw(order: Order, order_service: OrderService)EthereumWithdrawerestimate_withdraw_fallback_message_fee(order_id, recipient_address, amount)HerodotusWithdrawerBlockDaoget_latest_block(): intupdate_latest_block(latest_block: int)ErrorDaocreate_error(error: Error): ErrorOrderDaocreate_order(order: Order): Orderget_order(order_id: int): Order | Noneget_orders(criteria): list[Type[Order]]get_incomplete_orders() list[Type[Order]]get_failed_orders(): list[Type[Order]]already_exists(order_id): boolupdate_order(order: Order): OrderBlockidlatest_blockcreated_atErroridordermessagecreated_atOrderorder_idstarknet_tx_hashrecipient_addressamountfeestatusfailedtx_hashtransferred_atherodotus_task_idherodotus_blockherodotus_sloteth_withdraw_tx_hashcompleted_atcreated_atget_int_amount()get_int_fee()OrderStatusPENDINGPROCESSINGTRANSFERRINGFULFILLEDPROVINGPROVEDCOMPLETEDDROPPEDMMrun()process_order_events(order_events: list, order_service: OrderService,eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore)create_order_tasks(order: Order, order_service: OrderService, eth_lock: asyncio.Lock,herodotus_semaphore: asyncio.Semaphore)process_order(order: Order, order_service: OrderService,eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore)failed_orders_job(order_service: OrderService,eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore)process_failed_orders(order_service: OrderService,eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore)set_order_events_from_accepted_blocks_job(order_service: OrderService, block_dao: BlockDao,eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore)process_orders_from_accepted_blocks(order_service: OrderService, block_dao: BlockDao,eth_lock: asyncio.Lock, herodotus_semaphore: asyncio.Semaphore)transfer(order: Order, order_service: OrderService)wait_transfer(order: Order, order_service: OrderService) \ No newline at end of file