Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improvements to state synchronization bridge #102

Merged
merged 8 commits into from
Sep 8, 2023
14 changes: 12 additions & 2 deletions ape-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@ deployments:
mainnet:
- contract_type: DAI
address: '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063'
- contract_type: fx_child
address: '0x8397259c983751DAf40400790063935a11afa28a'
mumbai:
- contract_type: DAI
address: '0x001B3B4d0F3714Ca98ba10F6042DaEbF0B1B7b6F'
- contract_type: StakeInfo
address: '0xC1379866Fb0c100DCBFAb7b470009C4827D47DD8'
- fx_child: '0xCf73231F28B7331BBe3124B907840A94851f9f11'
- verify: False
- contract_type: fx_child
address: '0xCf73231F28B7331BBe3124B907840A94851f9f11'
ethereum:
local:
- nu_token_supply: 1_000_000_000
Expand Down Expand Up @@ -83,6 +85,10 @@ deployments:
max_dkg_size: 8
pre_application: '0x685b8Fd02aB87d8FfFff7346cB101A5cE4185bf3'
verify: True
- contract_type: fx_root
address: '0x3d1d3E34f7fB6D26245E6640E1c50710eFFf15bA'
- contract_type: checkpoint_manager
address: '0x2890bA17EfE978480615e330ecB65333b880928e'
mumbai:
- stake_info_contract: '0xC1379866Fb0c100DCBFAb7b470009C4827D47DD8'
max_dkg_size: 16
Expand All @@ -98,6 +104,10 @@ deployments:
pre_min_authorization: 40000000000000000000000
pre_min_operator_seconds: 86400 # one day in seconds
verify: True
- contract_type: fx_root
address: '0xfe5e5D361b2ad62c541bAb87C45a0B9B018389a2'
- contract_type: checkpoint_manager
address: '0x86e4dc95c7fbdbf52e33d563bbdb00823894c287'


test:
Expand Down
1 change: 1 addition & 0 deletions contracts/contracts/coordination/StakeInfo.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ contract StakeInfo is AccessControl, IUpdatableStakeInfo, IAccessControlApplicat
}

constructor(address[] memory updaters) {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
derekpierre marked this conversation as resolved.
Show resolved Hide resolved
for (uint256 i = 0; i < updaters.length; i++) {
_grantRole(UPDATE_ROLE, updaters[i]);
}
Expand Down
3 changes: 0 additions & 3 deletions contracts/xchain/PolygonChild.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import "@fx-portal/contracts/tunnel/FxBaseChildTunnel.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract PolygonChild is FxBaseChildTunnel, Ownable {
event MessageReceived(address indexed sender, bytes data);

address public stakeInfoAddress;

constructor(address _fxChild) FxBaseChildTunnel(_fxChild) {}
Expand All @@ -16,7 +14,6 @@ contract PolygonChild is FxBaseChildTunnel, Ownable {
address sender,
bytes memory data
) internal override validateSender(sender) {
emit MessageReceived(sender, data);
derekpierre marked this conversation as resolved.
Show resolved Hide resolved
// solhint-disable-next-line avoid-low-level-calls
stakeInfoAddress.call(data);
}
Expand Down
4 changes: 3 additions & 1 deletion contracts/xchain/PolygonRoot.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ contract PolygonRoot is FxBaseRootTunnel, IUpdatableStakeInfo {
constructor(
address _checkpointManager,
address _fxRoot,
address _source
address _source,
address _fxChildTunnel
) FxBaseRootTunnel(_checkpointManager, _fxRoot) {
require(_source != address(0), "Wrong input parameters");
source = _source;
fxChildTunnel = _fxChildTunnel;
}

/**
Expand Down
24 changes: 17 additions & 7 deletions scripts/check_xchain.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,30 @@
import time

from ape import networks, project
from ape import accounts, networks, project


def main():
deployer = accounts.load("TGoerli")
print("*******")
print("WARNING: This script will take 40 mins to run to allow messages to sync from L1 to L2")
print("*******")
with networks.ethereum.goerli.use_provider("infura"):
root = project.PolygonRoot.at("0xdc90A337DF9561705EB85B92391ab8F55d114D53")
root = project.PolygonRoot.at("0x55D1E362b81FDC6BaA359630bf3Ffa5900F66777")
root.updateOperator(
"0x3B42d26E19FF860bC4dEbB920DD8caA53F93c600",
"0x3B42d26E19FF860bC4dEbB920DD8caA53F93c600",
sender=deployer,
)
time.sleep(60 * 40)
with networks.polygon.mumbai.use_provider("infura"):
stake_info = project.StakeInfo.at("0x40D0107ACa3503CB345E4117a9F92E8220EEEb3C")
print(stake_info.operatorToProvider("0xAe87D865F3A507185656aD0ef52a8E0B9f3d58f8"))
print(stake_info.operatorToProvider("0x3B42d26E19FF860bC4dEbB920DD8caA53F93c600"))
# check every 5 minutes
print("Now: {}".format(time.time()))
for i in range(12):
time.sleep(60 * i * 5)
print("Now: {}".format(time.time()))
with networks.polygon.mumbai.use_provider("infura"):
stake_info = project.StakeInfo.at("0x96e7dBa88f79e5CCAEBf0c7678539F6C0d719c99")
print(
stake_info.stakingProviderFromOperator("0xAe87D865F3A507185656aD0ef52a8E0B9f3d58f8")
)
print(
stake_info.stakingProviderFromOperator("0x3B42d26E19FF860bC4dEbB920DD8caA53F93c600")
Comment on lines +26 to +29
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where are these addresses obtained from?

)
77 changes: 77 additions & 0 deletions scripts/deploy_coordinator_with_fee_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/usr/bin/python3

import os

from ape import config, project, networks
from ape.cli import account_option, network_option, NetworkBoundCommand
from ape.utils import ZERO_ADDRESS

from ape_etherscan.utils import API_KEY_ENV_KEY_MAP

import click


@click.command(cls=NetworkBoundCommand)
@network_option()
@account_option()
@click.option('--currency', default=ZERO_ADDRESS)
@click.option('--rate', default=None)
@click.option('--timeout', default=None)
@click.option('--admin', default=None)
@click.option('--max_size', default=None)
@click.option('--verify/--no-verify', default=True)
def cli(network, account, currency, rate, timeout, admin, max_size, verify):

deployer = account
click.echo(f"Deployer: {deployer}")

if rate and currency == ZERO_ADDRESS:
raise ValueError("ERC20 contract address needed for currency")

# Network
ecosystem_name = networks.provider.network.ecosystem.name
network_name = networks.provider.network.name
provider_name = networks.provider.name
click.echo(f"You are connected to network '{ecosystem_name}:{network_name}:{provider_name}'.")

# TODO: Move this to a common deployment utilities module
# Validate Etherscan verification parameters.
# This import fails if called before the click network options are evaluated
from scripts.utils import LOCAL_BLOCKCHAIN_ENVIRONMENTS
is_public_deployment = network_name not in LOCAL_BLOCKCHAIN_ENVIRONMENTS
if not is_public_deployment:
verify = False
elif verify:
env_var_key = API_KEY_ENV_KEY_MAP.get(ecosystem_name)
api_key = os.environ.get(env_var_key)
print(api_key)
if not api_key:
raise ValueError(f"{env_var_key} is not set")

# Use deployment information for currency, if possible
try:
deployments = config.deployments[ecosystem_name][network_name]
except KeyError:
pass # TODO: Further validate currency address?
else:
print(deployments)
try:
currency = next(d for d in deployments if d["contract_type"] == currency)["address"]
except StopIteration:
pass

try:
stakes = next(d for d in deployments if d["contract_type"] == "StakeInfo")["address"]
except StopIteration:
raise ValueError("StakeInfo deployment needed")

# Parameter defaults
admin = admin or deployer
rate = rate or 1
timeout = timeout or 60*60
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To confirm, this is our default ritual timeout which is 1hr.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we put those defaults into @click.option(..., defaults=...) or ape-config.yaml?

max_size = max_size or 64

params = (stakes, timeout, max_size, admin, currency, rate)
print("Deployment parameters:", params)
return project.Coordinator.deploy(*params, sender=deployer, publish=verify)

89 changes: 61 additions & 28 deletions scripts/deploy_xchain_test.py
Original file line number Diff line number Diff line change
@@ -1,53 +1,86 @@
import click
from ape import accounts, config, networks, project
from ape.cli import NetworkBoundCommand, account_option


def deploy_eth_contracts(deployer):
# Connect to the Ethereum network
with networks.ethereum.goerli.use_provider("infura"):
DEPLOYMENTS_CONFIG = config.get_config("deployments")["ethereum"]["goerli"][0]
def convert_config(config):
result = {}
for item in config:
if "contract_type" in item:
result[item["contract_type"]] = item["address"]
else:
result.update(item)
return result


# Deploy the FxStateRootTunnel contract
def deploy_eth_contracts(deployer, source, child_address, config, eth_network):
# Connect to the Ethereum network
with eth_network.use_provider("infura"):
polygon_root = project.PolygonRoot.deploy(
DEPLOYMENTS_CONFIG.get("checkpoint_manager"),
DEPLOYMENTS_CONFIG.get("fx_root"),
config["checkpoint_manager"],
config["fx_root"],
source,
child_address,
sender=deployer,
publish=DEPLOYMENTS_CONFIG.get("verify"),
publish=False,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we be getting this value from the config (verify)? Same for deploy_polygon_contracts below?

Or is it that we never publish? If so, how come?

)

return polygon_root


def deploy_polygon_contracts(deployer):
def deploy_polygon_contracts(deployer, config, poly_network):
# Connect to the Polygon network
with networks.polygon.mumbai.use_provider("infura"):
DEPLOYMENTS_CONFIG = config.get_config("deployments")["polygon"]["mumbai"][0]

# Deploy the FxStateChildTunnel contract
polygon_child = project.PolygonChild.deploy(
DEPLOYMENTS_CONFIG.get("fx_child"),
with poly_network.use_provider("infura"):
stake_info = project.StakeInfo.deploy(
[deployer.address],
sender=deployer,
publish=DEPLOYMENTS_CONFIG.get("verify"),
publish=False,
)
stake_info = project.StakeInfo.deploy(
[deployer.address, polygon_child.address],

polygon_child = project.PolygonChild.deploy(
config["fx_child"],
stake_info.address,
sender=deployer,
publish=DEPLOYMENTS_CONFIG.get("verify"),
publish=False,
)

return polygon_child, stake_info


def main(account_id=None):
deployer = accounts.load("TGoerli")
# TODO: Figure out better way to retrieve the TACo app contract address
@click.command(cls=NetworkBoundCommand)
@click.option("--network_type", type=click.Choice(["mainnet", "testnet"]))
@account_option()
def cli(network_type, account):
deployer = account
if network_type == "mainnet":
eth_config = config.get_config("deployments")["ethereum"]["mainnet"]
poly_config = config.get_config("deployments")["polygon"]["mainnet"]
eth_network = networks.ethereum.mainnet
poly_network = networks.polygon.mainnet
elif network_type == "testnet":
eth_config = config.get_config("deployments")["ethereum"]["goerli"]
poly_config = config.get_config("deployments")["polygon"]["mumbai"]
eth_network = networks.ethereum.goerli
poly_network = networks.polygon.mumbai

print("Deployer: {}".format(deployer))
print("ETH CONFIG: {}".format(eth_config))
print("POLYGON CONFIG: {}".format(poly_config))

with accounts.use_sender(deployer):
root = deploy_eth_contracts(deployer)
child, stake_info = deploy_polygon_contracts(deployer)
child, stake_info = deploy_polygon_contracts(
deployer, convert_config(poly_config), poly_network
)
root = deploy_eth_contracts(
deployer, deployer.address, child.address, convert_config(eth_config), eth_network
)

# Set the root contract address in the child contract
with networks.polygon.mumbai.use_provider("infura"):
with poly_network.use_provider("infura"):
child.setFxRootTunnel(root.address)
child.setStakeInfoAddress(stake_info.address)
stake_info.addUpdaters([child.address])

# Set the child contract address in the root contract
with networks.ethereum.goerli.use_provider("infura"):
root.setFxChildTunnel(child.address)
print("CHILD: {}".format(child.address))
print("STAKE INFO: {}".format(stake_info.address))
print("ROOT: {}".format(root.address))
Loading