Commit 331eb987 authored by Karl Floersch's avatar Karl Floersch Committed by GitHub

Add messenger proxy (#53)

* Started proxy bridge

* Fix L1MessengerProxy deploy

* Attempt 2

* Fix bug in ResolvedDelegateProxy

* Fix bug in L1XDomainMessenger

* Reduce nodes in Merkle Trie tests

* Fix rebase error

* Add clarifying comment to delegate proxy
Co-authored-by: default avatarKelvin Fichter <kelvinfichter@gmail.com>
parent eabd6a95
...@@ -5,6 +5,7 @@ pragma experimental ABIEncoderV2; ...@@ -5,6 +5,7 @@ pragma experimental ABIEncoderV2;
/* Library Imports */ /* Library Imports */
import { Lib_OVMCodec } from "../../libraries/codec/Lib_OVMCodec.sol"; import { Lib_OVMCodec } from "../../libraries/codec/Lib_OVMCodec.sol";
import { Lib_AddressResolver } from "../../libraries/resolver/Lib_AddressResolver.sol"; import { Lib_AddressResolver } from "../../libraries/resolver/Lib_AddressResolver.sol";
import { Lib_AddressManager } from "../../libraries/resolver/Lib_AddressManager.sol";
import { Lib_SecureMerkleTrie } from "../../libraries/trie/Lib_SecureMerkleTrie.sol"; import { Lib_SecureMerkleTrie } from "../../libraries/trie/Lib_SecureMerkleTrie.sol";
/* Interface Imports */ /* Interface Imports */
...@@ -24,12 +25,24 @@ contract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCros ...@@ -24,12 +25,24 @@ contract OVM_L1CrossDomainMessenger is iOVM_L1CrossDomainMessenger, OVM_BaseCros
* Constructor * * Constructor *
***************/ ***************/
/**
* Pass a default zero address to the address resolver. This will be updated when initialized.
*/
constructor()
Lib_AddressResolver(address(0))
{}
/** /**
* @param _libAddressManager Address of the Address Manager. * @param _libAddressManager Address of the Address Manager.
*/ */
constructor( function initialize(
address _libAddressManager address _libAddressManager
) Lib_AddressResolver(_libAddressManager) {} )
public
{
require(address(libAddressManager) == address(0), "L1CrossDomainMessenger already intialized.");
libAddressManager = Lib_AddressManager(_libAddressManager);
}
/******************** /********************
......
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.7.0;
/* Library Imports */
import { Lib_AddressManager } from "./Lib_AddressManager.sol";
/**
* @title Lib_ResolvedDelegateProxy
*/
contract Lib_ResolvedDelegateProxy {
/*************
* Variables *
*************/
// Using mappings to store fields to avoid overwriting storage slots in the
// implementation contract. For example, instead of storing these fields at
// storage slot `0` & `1`, they are stored at `hash(${FIELD_NAME} + address(this))`
// See: https://solidity.readthedocs.io/en/v0.7.0/internals/layout_in_storage.html
mapping(address=>string) private implementationName;
mapping(address=>Lib_AddressManager) private addressManager;
/***************
* Constructor *
***************/
/**
* @param _libAddressManager Address of the Lib_AddressManager.
* @param _implementationName implementationName of the contract to proxy to.
*/
constructor(
address _libAddressManager,
string memory _implementationName
)
{
addressManager[address(this)] = Lib_AddressManager(_libAddressManager);
implementationName[address(this)] = _implementationName;
}
/*********************
* Fallback Function *
*********************/
fallback()
external
{
address target = addressManager[address(this)].getAddress((implementationName[address(this)]));
require(
target != address(0),
"Target address must be initialized."
);
(bool success, bytes memory returndata) = target.delegatecall(msg.data);
if (success == true) {
assembly {
return(add(returndata, 0x20), mload(returndata))
}
} else {
assembly {
revert(add(returndata, 0x20), mload(returndata))
}
}
}
}
...@@ -43,7 +43,17 @@ export const makeContractDeployConfig = async ( ...@@ -43,7 +43,17 @@ export const makeContractDeployConfig = async (
return { return {
OVM_L1CrossDomainMessenger: { OVM_L1CrossDomainMessenger: {
factory: getContractFactory('OVM_L1CrossDomainMessenger'), factory: getContractFactory('OVM_L1CrossDomainMessenger'),
params: [AddressManager.address], params: [],
},
Proxy__OVM_L1CrossDomainMessenger: {
factory: getContractFactory('Lib_ResolvedDelegateProxy'),
params: [AddressManager.address, 'OVM_L1CrossDomainMessenger'],
afterDeploy: async (contracts): Promise<void> => {
const xDomainMessenger = getContractFactory(
'OVM_L1CrossDomainMessenger'
).attach(contracts.Proxy__Proxy__OVM_L1CrossDomainMessenger.address)
await xDomainMessenger.initialize(AddressManager.address)
},
}, },
OVM_L2CrossDomainMessenger: { OVM_L2CrossDomainMessenger: {
factory: getContractFactory('OVM_L2CrossDomainMessenger'), factory: getContractFactory('OVM_L2CrossDomainMessenger'),
......
...@@ -34,6 +34,20 @@ const getXDomainCalldata = ( ...@@ -34,6 +34,20 @@ const getXDomainCalldata = (
).encodeFunctionData('relayMessage', [target, sender, message, messageNonce]) ).encodeFunctionData('relayMessage', [target, sender, message, messageNonce])
} }
const deployProxyXDomainMessenger = async (
addressManager: Contract,
l1XDomainMessenger: Contract
): Promise<Contract> => {
await addressManager.setAddress(
'OVM_L1CrossDomainMessenger',
l1XDomainMessenger.address
)
const proxy = await (await ethers.getContractFactory(
'Lib_ResolvedDelegateProxy'
)).deploy(addressManager.address, 'OVM_L1CrossDomainMessenger')
return l1XDomainMessenger.attach(proxy.address)
}
describe('OVM_L1CrossDomainMessenger', () => { describe('OVM_L1CrossDomainMessenger', () => {
let signer: Signer let signer: Signer
before(async () => { before(async () => {
...@@ -89,9 +103,10 @@ describe('OVM_L1CrossDomainMessenger', () => { ...@@ -89,9 +103,10 @@ describe('OVM_L1CrossDomainMessenger', () => {
let OVM_L1CrossDomainMessenger: Contract let OVM_L1CrossDomainMessenger: Contract
beforeEach(async () => { beforeEach(async () => {
OVM_L1CrossDomainMessenger = await Factory__OVM_L1CrossDomainMessenger.deploy( const xDomainMessenerImpl = await Factory__OVM_L1CrossDomainMessenger.deploy()
AddressManager.address // We use an upgradable proxy for the XDomainMessenger--deploy & set up the proxy.
) OVM_L1CrossDomainMessenger = await deployProxyXDomainMessenger(AddressManager, xDomainMessenerImpl)
await OVM_L1CrossDomainMessenger.initialize(AddressManager.address)
}) })
describe('sendMessage', () => { describe('sendMessage', () => {
......
...@@ -7,7 +7,7 @@ import { Contract } from 'ethers' ...@@ -7,7 +7,7 @@ import { Contract } from 'ethers'
/* Internal Imports */ /* Internal Imports */
import { TrieTestGenerator } from '../../../helpers' import { TrieTestGenerator } from '../../../helpers'
const NODE_COUNTS = [1, 2, 128, 256, 512, 1024, 2048, 4096] const NODE_COUNTS = [1, 2, 128]
describe('Lib_MerkleTrie', () => { describe('Lib_MerkleTrie', () => {
let Lib_MerkleTrie: Contract let Lib_MerkleTrie: Contract
......
...@@ -7,7 +7,7 @@ import { Contract } from 'ethers' ...@@ -7,7 +7,7 @@ import { Contract } from 'ethers'
/* Internal Imports */ /* Internal Imports */
import { TrieTestGenerator } from '../../../helpers' import { TrieTestGenerator } from '../../../helpers'
const NODE_COUNTS = [1, 2, 128, 256, 512, 1024, 2048, 4096] const NODE_COUNTS = [1, 2, 128]
describe('Lib_SecureMerkleTrie', () => { describe('Lib_SecureMerkleTrie', () => {
let Lib_SecureMerkleTrie: Contract let Lib_SecureMerkleTrie: Contract
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment