monad_testcoin_balance.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. # -*- coding: utf-8 -*-
  2. from odoo import models, fields
  3. from web3 import Web3
  4. import time
  5. class MonadTestcoinBalance(models.Model):
  6. _name = 'monad.testcoin.balance'
  7. _description = 'Monad Testcoin Balance'
  8. wallet_address = fields.Char(string='Wallet Address')
  9. balance = fields.Float(string='Balance')
  10. message = fields.Char(string='Message')
  11. def execute(self):
  12. rpc_url = "https://testnet-rpc.monad.xyz"
  13. web3 = Web3(Web3.HTTPProvider(rpc_url))
  14. if not web3.is_connected():
  15. print("无法连接到链节点,请检查 URL 是否正确")
  16. else:
  17. print("已成功连接到链节点。正在查询钱包余额...")
  18. for record in self:
  19. retry_count = 0
  20. max_retries = 3
  21. delay = 2
  22. result_message = ''
  23. result_balance = -1
  24. while retry_count < max_retries:
  25. try:
  26. checksum_address = web3.to_checksum_address(record.wallet_address)
  27. balance = web3.eth.get_balance(checksum_address)
  28. balance_eth = web3.from_wei(balance, "ether")
  29. result_message = f"Wallet address: {record.wallet_address}, balance: {balance_eth:.8f} $MON"
  30. result_balance = "{:.8f}".format(balance_eth)
  31. print(result_message)
  32. break
  33. except Exception as e:
  34. print(f"查询钱包 {record.wallet_address} 余额时发生错误: {e}")
  35. retry_count += 1
  36. print(f"正在重试...(第 {retry_count} 次)")
  37. time.sleep(delay)
  38. if retry_count == max_retries:
  39. result_message = f"钱包 {record.wallet_address} 查询余额失败,已达到最大重试次数。"
  40. print(result_message)
  41. record.update({
  42. 'balance': result_balance,
  43. 'message': result_message
  44. })
  45. return {
  46. 'type': 'ir.actions.client',
  47. 'tag': 'display_notification',
  48. 'params': {
  49. 'title': '提示',
  50. 'message': '操作成功!',
  51. 'sticky': False,
  52. }
  53. }