Skip to content
This repository has been archived by the owner on Jan 9, 2025. It is now read-only.

Commit

Permalink
split messaging contract deployments
Browse files Browse the repository at this point in the history
  • Loading branch information
enitrat committed Oct 10, 2024
1 parent 38c92f7 commit be5c816
Show file tree
Hide file tree
Showing 3 changed files with 124 additions and 72 deletions.
85 changes: 14 additions & 71 deletions kakarot_scripts/deployment/evm_deployments.py
Original file line number Diff line number Diff line change
@@ -1,54 +1,27 @@
import logging

from eth_utils.address import to_checksum_address

from kakarot_scripts.constants import ETH_TOKEN_ADDRESS, EVM_ADDRESS, NETWORK, RPC_CLIENT, STRK_TOKEN_ADDRESS, NetworkType
from kakarot_scripts.utils.kakarot import deploy as deploy_evm, get_deployments as get_evm_deployments
from kakarot_scripts.constants import (
ETH_TOKEN_ADDRESS,
EVM_ADDRESS,
NETWORK,
RPC_CLIENT,
STRK_TOKEN_ADDRESS,
NetworkType,
)
from kakarot_scripts.utils.kakarot import deploy as deploy_evm
from kakarot_scripts.utils.kakarot import deploy_and_fund_evm_address
from kakarot_scripts.utils.kakarot import dump_deployments as dump_evm_deployments
from kakarot_scripts.utils.kakarot import get_deployments as get_evm_deployments
from kakarot_scripts.utils.starknet import call, execute_calls
from kakarot_scripts.utils.starknet import get_deployments as get_starknet_deployments
from kakarot_scripts.utils.l1 import deploy_on_l1, dump_l1_addresses, get_l1_addresses, get_l1_contract
from kakarot_scripts.utils.starknet import call, execute_calls, get_balance, invoke
from web3.exceptions import ContractLogicError
from eth_utils.address import to_checksum_address
from eth_abi.exceptions import InsufficientDataBytes
from kakarot_scripts.utils.starknet import invoke

logger = logging.getLogger(__name__)


async def deploy_evm_contracts():
# %% L1
starknet_deployments = get_starknet_deployments()
l1_addresses = get_l1_addresses()

l1_kakarot_messaging = get_l1_contract(
"L1L2Messaging",
"L1KakarotMessaging",
address=l1_addresses.get("L1KakarotMessaging"),
)
l1_kakarot_messaging_registered_address = None
try:
l1_kakarot_messaging_registered_address = l1_kakarot_messaging.kakarotAddress()
except (ContractLogicError, InsufficientDataBytes):
pass

if l1_kakarot_messaging_registered_address != starknet_deployments["kakarot"]:
if NETWORK["type"] == NetworkType.DEV:
starknet_core = deploy_on_l1("Starknet", "StarknetMessagingLocal")
l1_addresses.update({"StarknetCore": starknet_core.address})
else:
if "StarknetCore" not in l1_addresses:
raise ValueError("StarknetCore missing in L1 addresses")

l1_kakarot_messaging = deploy_on_l1(
"L1L2Messaging",
"L1KakarotMessaging",
l1_addresses["StarknetCore"],
starknet_deployments["kakarot"],
)
l1_addresses.update({"L1KakarotMessaging": l1_kakarot_messaging.address})

dump_l1_addresses(l1_addresses)

if not EVM_ADDRESS:
logger.info("ℹ️ No EVM address provided, skipping EVM deployments")
return
Expand Down Expand Up @@ -109,37 +82,6 @@ async def deploy_evm_contracts():
1,
)

# %% Messaging
deployment = evm_deployments.get("L2KakarotMessaging")
starknet_address = None
if deployment is not None:
starknet_address = (
await call("kakarot", "get_starknet_address", deployment["address"])
).starknet_address

if deployment is None or deployment["starknet_address"] != starknet_address:
l2_kakarot_messaging = await deploy_evm("L1L2Messaging", "L2KakarotMessaging")
await invoke(
"kakarot",
"set_authorized_cairo_precompile_caller",
int(l2_kakarot_messaging.address, 16),
1,
)
evm_deployments["L2KakarotMessaging"] = {
"address": int(l2_kakarot_messaging.address, 16),
"starknet_address": l2_kakarot_messaging.starknet_address,
}

l1_messaging_contract_address = (
await call("kakarot", "get_l1_messaging_contract_address")
).l1_messaging_contract_address
if l1_messaging_contract_address != int(l1_kakarot_messaging.address, 16):
await invoke(
"kakarot",
"set_l1_messaging_contract_address",
int(l1_kakarot_messaging.address, 16),
)

# %% Coinbase
coinbase = (await call("kakarot", "get_coinbase")).coinbase
if evm_deployments.get("Coinbase", {}).get("address") != coinbase:
Expand All @@ -158,6 +100,7 @@ async def deploy_evm_contracts():
await execute_calls()
dump_evm_deployments(evm_deployments)


if __name__ == "__main__":
from uvloop import run

Expand Down
4 changes: 3 additions & 1 deletion kakarot_scripts/deployment/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from kakarot_scripts.deployment.declarations import declare_contracts
from kakarot_scripts.deployment.evm_deployments import deploy_evm_contracts
from kakarot_scripts.deployment.kakarot_deployment import deploy_or_upgrade_kakarot
from kakarot_scripts.deployment.messaging_deployments import deploy_messaging_contracts
from kakarot_scripts.deployment.pre_eip155_deployments import (
deploy_pre_eip155_contracts,
whitelist_pre_eip155_contracts,
Expand Down Expand Up @@ -38,13 +39,14 @@ async def main():
await execute_calls()

# %% EVM Deployments
# Whitelists depend on a deployed kakarot
# These deployments depend on a deployed kakarot
await whitelist_pre_eip155_contracts()
await deploy_evm_contracts()
await execute_calls()
remove_lazy_account(account.address)

# Must be sequential
await deploy_messaging_contracts()
await deploy_pre_eip155_contracts()

# %% Tear down
Expand Down
107 changes: 107 additions & 0 deletions kakarot_scripts/deployment/messaging_deployments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import logging

from eth_abi.exceptions import InsufficientDataBytes
from web3.exceptions import ContractLogicError

from kakarot_scripts.constants import NETWORK, RPC_CLIENT, NetworkType
from kakarot_scripts.utils.kakarot import deploy as deploy_evm
from kakarot_scripts.utils.kakarot import dump_deployments as dump_evm_deployments
from kakarot_scripts.utils.kakarot import get_deployments as get_evm_deployments
from kakarot_scripts.utils.l1 import (
deploy_on_l1,
dump_l1_addresses,
get_l1_addresses,
get_l1_contract,
)
from kakarot_scripts.utils.starknet import call
from kakarot_scripts.utils.starknet import get_deployments as get_starknet_deployments
from kakarot_scripts.utils.starknet import invoke

logger = logging.getLogger(__name__)


async def deploy_l1_contracts():
# %% L1
starknet_deployments = get_starknet_deployments()
l1_addresses = get_l1_addresses()

l1_kakarot_messaging = get_l1_contract(
"L1L2Messaging",
"L1KakarotMessaging",
address=l1_addresses.get("L1KakarotMessaging"),
)
l1_kakarot_messaging_registered_address = None
try:
l1_kakarot_messaging_registered_address = l1_kakarot_messaging.kakarotAddress()
except (ContractLogicError, InsufficientDataBytes):
pass

if l1_kakarot_messaging_registered_address != starknet_deployments["kakarot"]:
if NETWORK["type"] == NetworkType.DEV:
starknet_core = deploy_on_l1("Starknet", "StarknetMessagingLocal")
l1_addresses.update({"StarknetCore": starknet_core.address})
else:
if "StarknetCore" not in l1_addresses:
raise ValueError("StarknetCore missing in L1 addresses")

l1_kakarot_messaging = deploy_on_l1(
"L1L2Messaging",
"L1KakarotMessaging",
l1_addresses["StarknetCore"],
starknet_deployments["kakarot"],
)
l1_addresses.update({"L1KakarotMessaging": l1_kakarot_messaging.address})

dump_l1_addresses(l1_addresses)


async def deploy_messaging_contracts():
# %% Messaging
evm_deployments = get_evm_deployments()
l1_kakarot_messaging_address = get_l1_addresses()["L1KakarotMessaging"]
deployment = evm_deployments.get("L2KakarotMessaging")
starknet_address = None
if deployment is not None:
starknet_address = (
await call("kakarot", "get_starknet_address", deployment["address"])
).starknet_address

if deployment is None or deployment["starknet_address"] != starknet_address:
l2_kakarot_messaging = await deploy_evm("L1L2Messaging", "L2KakarotMessaging")
await invoke(
"kakarot",
"set_authorized_cairo_precompile_caller",
int(l2_kakarot_messaging.address, 16),
1,
)
evm_deployments["L2KakarotMessaging"] = {
"address": int(l2_kakarot_messaging.address, 16),
"starknet_address": l2_kakarot_messaging.starknet_address,
}

l1_messaging_contract_address = (
await call("kakarot", "get_l1_messaging_contract_address")
).l1_messaging_contract_address
if l1_messaging_contract_address != int(l1_kakarot_messaging_address, 16):
await invoke(
"kakarot",
"set_l1_messaging_contract_address",
int(l1_kakarot_messaging_address, 16),
)

dump_evm_deployments(evm_deployments)


if __name__ == "__main__":
from uvloop import run

async def main():
try:
await RPC_CLIENT.get_class_hash_at(get_starknet_deployments()["kakarot"])
except Exception:
logger.error("❌ Kakarot is not deployed, exiting...")
return
await deploy_l1_contracts()
await deploy_messaging_contracts()

run(main())

0 comments on commit be5c816

Please sign in to comment.