From 4ee7e44a30d61c091501dfbcfa80f11ef9541e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Walter?= Date: Wed, 9 Oct 2024 15:41:47 +0200 Subject: [PATCH] Wait for multisig txs (#1485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **Add wait_for_tx for multisig** - **Add env var for relayers** - **Deploy WETH and Coinbase only if required** - - - This change is [Reviewable](https://reviewable.io/reviews/kkrt-labs/kakarot/1485) --- .env.example | 5 ++++ kakarot_scripts/constants.py | 37 ++++++++++++++++------------ kakarot_scripts/deploy_kakarot.py | 41 ++++++++++++++++++++----------- kakarot_scripts/utils/kakarot.py | 22 ++++++++--------- kakarot_scripts/utils/starknet.py | 23 ++++++++++++++--- 5 files changed, 84 insertions(+), 44 deletions(-) diff --git a/.env.example b/.env.example index 80cc4030d..a4a4a78b6 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,11 @@ SHARINGAN_RPC_URL="https://sharingan.madara.zone" STARKNET_DEVNET_ACCOUNT_ADDRESS=0x64b48806902a367c8598f4f95c305e8c1a1acba5f082d294a43793113115691 STARKNET_DEVNET_PRIVATE_KEY=0x71d7bb07b9a64f6f78ac4c816aff4da9 +STARKNET_SEPOLIA_RELAYER_ACCOUNT_ADDRESS= +STARKNET_SEPOLIA_RELAYER_PRIVATE_KEY= +STARKNET_SEPOLIA_ACCOUNT_ADDRESS= +STARKNET_SEPOLIA_PRIVATE_KEY= + KATANA_ACCOUNT_ADDRESS=0xb3ff441a68610b30fd5e2abbf3a1548eb6ba6f3559f2862bf2dc757e5828ca KATANA_PRIVATE_KEY=0x2bbf4f9fd0bbb2e60b0316c1fe0b76cf7a4d0198bd493ced9b8df2a3a24d68a diff --git a/kakarot_scripts/constants.py b/kakarot_scripts/constants.py index b9548c9be..f9b6dbf58 100644 --- a/kakarot_scripts/constants.py +++ b/kakarot_scripts/constants.py @@ -336,22 +336,27 @@ def __next__(self) -> Account: return relayer -NETWORK["relayers"] = RelayerPool( - NETWORK.get( - "relayers", - ( - [ - { - "address": int(NETWORK["account_address"], 16), - "private_key": int(NETWORK["private_key"], 16), - } - ] - if NETWORK["account_address"] is not None - and NETWORK["private_key"] is not None - else [] - ), - ) -) +if ( + os.getenv(f"{prefix}_RELAYER_ACCOUNT_ADDRESS") is not None + and os.getenv(f"{prefix}_RELAYER_PRIVATE_KEY") is not None +): + default_relayer = { + "address": int(os.environ[f"{prefix}_RELAYER_ACCOUNT_ADDRESS"], 16), + "private_key": int(os.environ[f"{prefix}_RELAYER_PRIVATE_KEY"], 16), + } +elif NETWORK["account_address"] is not None and NETWORK["private_key"] is not None: + default_relayer = { + "address": int(NETWORK["account_address"], 16), + "private_key": int(NETWORK["private_key"], 16), + } +else: + default_relayer = None + +if default_relayer is None and NETWORK.get("relayers") is None: + raise ValueError("No account nor relayers defined for this network") + +NETWORK["relayers"] = RelayerPool(NETWORK.get("relayers", [default_relayer])) + logger.info( f"ℹ️ Connected to Starknet chain id {bytes.fromhex(f'{ChainId.starknet_chain_id.value:x}')} " diff --git a/kakarot_scripts/deploy_kakarot.py b/kakarot_scripts/deploy_kakarot.py index 054e16528..fa70170b8 100644 --- a/kakarot_scripts/deploy_kakarot.py +++ b/kakarot_scripts/deploy_kakarot.py @@ -169,15 +169,20 @@ async def main(): EVM_ADDRESS, amount=100 if NETWORK["type"] is NetworkType.DEV else 0.01 ) - bridge = await deploy_evm("CairoPrecompiles", "EthStarknetBridge") - evm_deployments["Bridge"] = { - "address": int(bridge.address, 16), - "starknet_address": bridge.starknet_address, - } - await invoke( - "kakarot", "set_authorized_cairo_precompile_caller", int(bridge.address, 16), 1 - ) - await invoke("kakarot", "set_coinbase", int(bridge.address, 16)) + coinbase = (await call("kakarot", "get_coinbase")).coinbase + if evm_deployments.get("Bridge", {}).get("address") != coinbase: + bridge = await deploy_evm("CairoPrecompiles", "EthStarknetBridge") + evm_deployments["Bridge"] = { + "address": int(bridge.address, 16), + "starknet_address": bridge.starknet_address, + } + await invoke( + "kakarot", + "set_authorized_cairo_precompile_caller", + int(bridge.address, 16), + 1, + ) + await invoke("kakarot", "set_coinbase", int(bridge.address, 16)) coinbase = (await call("kakarot", "get_coinbase")).coinbase if coinbase == 0: @@ -185,11 +190,19 @@ async def main(): else: logger.info(f"✅ Coinbase set to: 0x{coinbase:040x}") - weth = await deploy_evm("WETH", "WETH9") - evm_deployments["WETH"] = { - "address": int(weth.address, 16), - "starknet_address": weth.starknet_address, - } + weth_starknet_address = ( + await call( + "kakarot", + "get_starknet_address", + evm_deployments.get("WETH", {}).get("address", 0), + ) + ).starknet_address + if evm_deployments.get("WETH", {}).get("starknet_address") != weth_starknet_address: + weth = await deploy_evm("WETH", "WETH9") + evm_deployments["WETH"] = { + "address": int(weth.address, 16), + "starknet_address": weth.starknet_address, + } dump_evm_deployments(evm_deployments) balance_after = await get_balance(account.address) diff --git a/kakarot_scripts/utils/kakarot.py b/kakarot_scripts/utils/kakarot.py index 9001790cf..45c3c606d 100644 --- a/kakarot_scripts/utils/kakarot.py +++ b/kakarot_scripts/utils/kakarot.py @@ -478,14 +478,6 @@ async def send_pre_eip155_transaction( await _invoke_starknet( "kakarot", "set_authorized_pre_eip155_tx", int(evm_address, 16), msg_hash ) - nonce = ( - await _call_starknet("account_contract", "get_nonce", address=starknet_address) - ).nonce - if nonce != 0: - logger.info( - f"ℹ️ Nonce for {evm_address} is not 0 ({nonce}), skipping transaction" - ) - return if WEB3.is_connected(): tx_hash = WEB3.eth.send_raw_transaction(signed_tx) @@ -754,12 +746,20 @@ async def deploy_with_presigned_tx( deployer_starknet_address = await deploy_and_fund_evm_address( deployer_evm_address, amount ) + nonce = ( + await _call_starknet( + "account_contract", "get_nonce", address=deployer_starknet_address + ) + ).nonce + if nonce != 0: + logger.info( + f"ℹ️ Nonce for {deployer_evm_address} is not 0 ({nonce}), skipping transaction" + ) + return + response = await send_pre_eip155_transaction( deployer_evm_address, deployer_starknet_address, signed_tx, max_fee ) - if response is None: - logger.info("ℹ️ Transaction already executed") - return receipt, response, success, gas_used = response deployed_address = response[1] diff --git a/kakarot_scripts/utils/starknet.py b/kakarot_scripts/utils/starknet.py index cbd97b270..26fdc3672 100644 --- a/kakarot_scripts/utils/starknet.py +++ b/kakarot_scripts/utils/starknet.py @@ -1,3 +1,4 @@ +import asyncio import functools import json import logging @@ -147,7 +148,6 @@ async def get_starknet_account( f"Public key of account 0x{address:064x} is not consistent with provided private key" ) if len(public_keys) > 1: - register_lazy_account(address) register_multisig_account(address) logger.info("ℹ️ Account is a multisig") else: @@ -611,9 +611,26 @@ async def execute_v1(account, calls): f"{NETWORK['argent_multisig_api']}/0x{account.address:064x}/request", json=data, ) + content = response.json()["content"] + transaction_id = content["id"] + status = content["state"] + while status not in {"TX_ACCEPTED_L2", "REVERTED"}: + response = requests.get( + f"{NETWORK['argent_multisig_api']}/0x{account.address:064x}/request" + ) + contents = [ + content + for content in response.json()["content"] + if content["id"] == transaction_id + ] + if len(contents) == 0: + raise Exception("Transaction not found") + content = contents[0] + status = content["state"] + await asyncio.sleep(5) return { - "transaction_hash": response.json()["content"]["transactionHash"], - "status": response.json()["content"]["state"], + "transaction_hash": content["transactionHash"], + "status": content["state"], } params = _create_broadcasted_txn(transaction=transaction)