diff --git a/.gitignore b/.gitignore index 70849b9..d9127fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,5 @@ .idea TNLS-Relayers/etherscan_api_key.txt -TNLS-Relayers/infura_api_endpoint.txt -*/*/*/infura_api_endpoint.txt */.* */venv */__pycache__ @@ -24,7 +22,6 @@ TNLS-Gateways/secret/contract.wasm TNLS-Gateways/secret/contract.wasm.gz .env __pycache__/ -*.example TNLS-Gateways/public-gateway/broadcast/* TNLS-Gateways/public-gateway/lib/* *.gz diff --git a/TNLS-Gateways/public-gateway/script/ChangeAdmin.s.sol b/TNLS-Gateways/public-gateway/script/ChangeAdmin.s.sol index 171662e..47ae662 100644 --- a/TNLS-Gateways/public-gateway/script/ChangeAdmin.s.sol +++ b/TNLS-Gateways/public-gateway/script/ChangeAdmin.s.sol @@ -15,7 +15,7 @@ contract ChangeAdmin is Script { vm.startBroadcast(); // Initialize the ProxyAdmin - gatewayProxyAdmin = ProxyAdmin(0x59D8C9591dB7179c5d592c5bCD42694021885aFC); + gatewayProxyAdmin = ProxyAdmin(0xb352D4449dC7355d4478784027d7AfAe69843085); // Get the current owner of the ProxyAdmin address currentOwner = gatewayProxyAdmin.owner(); diff --git a/TNLS-Relayers/Gateway.json b/TNLS-Relayers/Gateway.json deleted file mode 100644 index d14d86d..0000000 --- a/TNLS-Relayers/Gateway.json +++ /dev/null @@ -1 +0,0 @@ -[{"type":"constructor","inputs":[{"name":"secretGatewaySignerAddr","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"VRF_routing_code_hash","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"VRF_routing_info","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"increaseTaskId","inputs":[{"name":"_newTaskId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"initialize","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"payoutBalance","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"postExecution","inputs":[{"name":"_taskId","type":"uint256","internalType":"uint256"},{"name":"_sourceNetwork","type":"string","internalType":"string"},{"name":"_info","type":"tuple","internalType":"struct Gateway.PostExecutionInfo","components":[{"name":"payload_hash","type":"bytes32","internalType":"bytes32"},{"name":"packet_hash","type":"bytes32","internalType":"bytes32"},{"name":"callback_address","type":"bytes20","internalType":"bytes20"},{"name":"callback_selector","type":"bytes4","internalType":"bytes4"},{"name":"callback_gas_limit","type":"bytes4","internalType":"bytes4"},{"name":"packet_signature","type":"bytes","internalType":"bytes"},{"name":"result","type":"bytes","internalType":"bytes"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"requestRandomness","inputs":[{"name":"_numWords","type":"uint32","internalType":"uint32"},{"name":"_callbackGasLimit","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"requestId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"secret_gateway_signer_address","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"send","inputs":[{"name":"_payloadHash","type":"bytes32","internalType":"bytes32"},{"name":"_userAddress","type":"address","internalType":"address"},{"name":"_routingInfo","type":"string","internalType":"string"},{"name":"_info","type":"tuple","internalType":"struct Gateway.ExecutionInfo","components":[{"name":"user_key","type":"bytes","internalType":"bytes"},{"name":"user_pubkey","type":"bytes","internalType":"bytes"},{"name":"routing_code_hash","type":"string","internalType":"string"},{"name":"task_destination_network","type":"string","internalType":"string"},{"name":"handle","type":"string","internalType":"string"},{"name":"nonce","type":"bytes12","internalType":"bytes12"},{"name":"callback_gas_limit","type":"uint32","internalType":"uint32"},{"name":"payload","type":"bytes","internalType":"bytes"},{"name":"payload_signature","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"_taskId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"taskId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"task_destination_network","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"tasks","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"payload_hash_reduced","type":"bytes31","internalType":"bytes31"},{"name":"completed","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeHandler","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"FulfilledRandomWords","inputs":[{"name":"requestId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TaskCompleted","inputs":[{"name":"taskId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"callbackSuccessful","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"logNewTask","inputs":[{"name":"task_id","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"source_network","type":"string","indexed":false,"internalType":"string"},{"name":"user_address","type":"address","indexed":false,"internalType":"address"},{"name":"routing_info","type":"string","indexed":false,"internalType":"string"},{"name":"payload_hash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"info","type":"tuple","indexed":false,"internalType":"struct Gateway.ExecutionInfo","components":[{"name":"user_key","type":"bytes","internalType":"bytes"},{"name":"user_pubkey","type":"bytes","internalType":"bytes"},{"name":"routing_code_hash","type":"string","internalType":"string"},{"name":"task_destination_network","type":"string","internalType":"string"},{"name":"handle","type":"string","internalType":"string"},{"name":"nonce","type":"bytes12","internalType":"bytes12"},{"name":"callback_gas_limit","type":"uint32","internalType":"uint32"},{"name":"payload","type":"bytes","internalType":"bytes"},{"name":"payload_signature","type":"bytes","internalType":"bytes"}]}],"anonymous":false},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]}] \ No newline at end of file diff --git a/TNLS-Relayers/eth_interface.py b/TNLS-Relayers/eth_interface.py index 1463f44..29b1141 100644 --- a/TNLS-Relayers/eth_interface.py +++ b/TNLS-Relayers/eth_interface.py @@ -3,7 +3,7 @@ from logging import getLogger, basicConfig, INFO, StreamHandler from typing import List from concurrent.futures import ThreadPoolExecutor, as_completed -from threading import Lock, Thread, Event +from threading import Lock, Timer from web3 import Web3, middleware, auto from web3.datastructures import AttributeDict @@ -46,21 +46,21 @@ def __init__(self, private_key="", provider=None, contract_address="", chain_id= self.timer = None self.sync_interval = sync_interval - self.stop_event = Event() - self.sync_thread = Thread(target=self.sync_loop) - self.sync_thread.start() + self.sync_interval = sync_interval + self.executor = ThreadPoolExecutor(max_workers=1) + self.schedule_sync() - def sync_loop(self): + def schedule_sync(self): """ - Continuously sync nonce at specified intervals. + Schedule the sync task with the executor and restart the timer """ - while not self.stop_event.is_set(): - try: - self.sync_nonce() - except Exception as e: - self.logger.error(f"Error during Ethereum nonce sync: {e}") - # Wait for the sync interval or until the stop event is set - self.stop_event.wait(self.sync_interval) + try: + self.executor.submit(self.sync_nonce) + except Exception as e: + self.logger.error(f"Error during Secret sequence sync: {e}") + finally: + self.timer = Timer(self.sync_interval, self.schedule_sync) + self.timer.start() def sync_nonce(self): """ diff --git a/TNLS-Relayers/scrt_interface.py b/TNLS-Relayers/scrt_interface.py index 983ab76..7e4befc 100644 --- a/TNLS-Relayers/scrt_interface.py +++ b/TNLS-Relayers/scrt_interface.py @@ -260,7 +260,8 @@ def construct_txn(self, function_schema, function_name, args): account_number=self.interface.account_number, ) fee = self.interface.provider.tx.estimate_fee(options=tx_options) - fee.granter = self.interface.feegrant_address + if self.interface.feegrant_address is not None: + fee.granter = self.interface.feegrant_address tx_options = CreateTxOptions( msgs=[txn_msgs], gas=gas, diff --git a/TNLS-Relayers/web_app.py b/TNLS-Relayers/web_app.py index edb7fe5..785ab5a 100644 --- a/TNLS-Relayers/web_app.py +++ b/TNLS-Relayers/web_app.py @@ -14,8 +14,8 @@ from dotenv import load_dotenv load_dotenv() -with open(f'{Path(__file__).parent.absolute()}/Gateway.json', 'r') as file: - eth_contract_schema = json.load(file) +with open(f'{Path(__file__).parent.absolute()}/gateway.json', 'r') as file: + eth_contract_schema = file.read() def generate_eth_config(config_dict, provider=None): @@ -89,7 +89,7 @@ def generate_scrt_config(config_dict, provider=None): api_endpoint = config_dict['api_endpoint'] chain_id = config_dict['chain_id'] code_hash = config_dict['code_hash'] - feegrant_address = config_dict['feegrant_address'] + feegrant_address = config_dict['feegrant_address'] if 'feegrant_address' in config_dict else None with open(f'{Path(__file__).parent.absolute()}/secret_abi.json') as f: contract_schema = f.read() event_name = 'wasm' @@ -142,11 +142,11 @@ def generate_full_config(config_file, providers=None): chains_dict[chain] = generate_eth_config(config_dict[chain], provider=provider_eth) except Exception as e: logger.error(f"Error generating ETH config for chain '{chain}': {e}") - + for chain in solana_chains: if config_dict[chain]['active']: chains_dict[chain] = generate_solana_config(config_dict[chain], provider=provider_solana) - + for chain in scrt_chains: if config_dict[chain]['active']: try: