Skip to content

Commit

Permalink
Merge fd80024 into 7d033bd
Browse files Browse the repository at this point in the history
  • Loading branch information
patitonar committed Oct 22, 2019
2 parents 7d033bd + fd80024 commit db50b48
Show file tree
Hide file tree
Showing 18 changed files with 389 additions and 102 deletions.
14 changes: 14 additions & 0 deletions contracts/upgradeable_contracts/BaseERC677Bridge.sol
Expand Up @@ -5,6 +5,7 @@ import "./BasicTokenBridge.sol";
import "../interfaces/ERC677.sol";
import "../interfaces/ERC677Receiver.sol";
import "./ERC677Storage.sol";
import "../libraries/Bytes.sol";

contract BaseERC677Bridge is BasicTokenBridge, ERC677Receiver, ERC677Storage {
function erc677token() public view returns (ERC677) {
Expand All @@ -25,6 +26,19 @@ contract BaseERC677Bridge is BasicTokenBridge, ERC677Receiver, ERC677Storage {
return true;
}

function chooseReceiver(address _from, bytes _data) internal view returns (address recipient) {
recipient = _from;
if (_data.length > 0) {
require(_data.length == 20);
recipient = Bytes.bytesToAddress(_data);
require(recipient != address(0));
require(recipient != bridgeContractOnOtherSide());
}
}

/* solcov ignore next */
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, uint256 _value, bytes _data) internal;

/* solcov ignore next */
function bridgeContractOnOtherSide() internal view returns (address);
}
3 changes: 2 additions & 1 deletion contracts/upgradeable_contracts/ERC677Bridge.sol
@@ -1,8 +1,9 @@
pragma solidity 0.4.24;

import "./BaseERC677Bridge.sol";
import "./OtherSideBridgeStorage.sol";

contract ERC677Bridge is BaseERC677Bridge {
contract ERC677Bridge is BaseERC677Bridge, OtherSideBridgeStorage {
function bridgeSpecificActionsOnTokenTransfer(
ERC677, /*_token*/
address _from,
Expand Down
Expand Up @@ -4,13 +4,8 @@ import "./ERC677Bridge.sol";
import "../interfaces/IBurnableMintableERC677Token.sol";

contract ERC677BridgeForBurnableMintableToken is ERC677Bridge {
function bridgeSpecificActionsOnTokenTransfer(
ERC677 _token,
address _from,
uint256 _value,
bytes /*_data*/
) internal {
function bridgeSpecificActionsOnTokenTransfer(ERC677 _token, address _from, uint256 _value, bytes _data) internal {
IBurnableMintableERC677Token(_token).burn(_value);
fireEventOnTokenTransfer(_from, _value);
fireEventOnTokenTransfer(chooseReceiver(_from, _data), _value);
}
}
2 changes: 1 addition & 1 deletion contracts/upgradeable_contracts/InitializableBridge.sol
Expand Up @@ -3,7 +3,7 @@ pragma solidity 0.4.24;
import "./Initializable.sol";

contract InitializableBridge is Initializable {
bytes32 internal constant DEPLOYED_AT_BLOCK = 0xb120ceec05576ad0c710bc6e85f1768535e27554458f05dcbb5c65b8c7a749b0; // keccak256(abi.encodePacked("deployedAtBlock"));
bytes32 internal constant DEPLOYED_AT_BLOCK = 0xb120ceec05576ad0c710bc6e85f1768535e27554458f05dcbb5c65b8c7a749b0; // keccak256(abi.encodePacked("deployedAtBlock"))

function deployedAtBlock() external view returns (uint256) {
return uintStorage[DEPLOYED_AT_BLOCK];
Expand Down
15 changes: 15 additions & 0 deletions contracts/upgradeable_contracts/OtherSideBridgeStorage.sol
@@ -0,0 +1,15 @@
pragma solidity 0.4.24;

import "../upgradeability/EternalStorage.sol";

contract OtherSideBridgeStorage is EternalStorage {
bytes32 internal constant BRIDGE_CONTRACT = 0x71483949fe7a14d16644d63320f24d10cf1d60abecc30cc677a340e82b699dd2; // keccak256(abi.encodePacked("bridgeOnOtherSide"))

function _setBridgeContractOnOtherSide(address _bridgeContract) internal {
addressStorage[BRIDGE_CONTRACT] = _bridgeContract;
}

function bridgeContractOnOtherSide() internal view returns (address) {
return addressStorage[BRIDGE_CONTRACT];
}
}
Expand Up @@ -67,14 +67,8 @@ contract BasicAMBErc677ToErc677 is
return isInitialized();
}

function chooseReceiver(address _from, bytes _data) internal view returns (address recipient) {
recipient = _from;
if (_data.length > 0) {
require(_data.length == 20);
recipient = Bytes.bytesToAddress(_data);
require(recipient != address(0));
require(recipient != mediatorContractOnOtherSide());
}
function bridgeContractOnOtherSide() internal view returns (address) {
return mediatorContractOnOtherSide();
}

function passMessage(address _from, uint256 _value) internal {
Expand Down
@@ -1,8 +1,6 @@
pragma solidity 0.4.24;

import "./BasicAMBErc677ToErc677.sol";
import "../ERC677Bridge.sol";
import "openzeppelin-solidity/contracts/AddressUtils.sol";

contract ForeignAMBErc677ToErc677 is BasicAMBErc677ToErc677 {
function executeActionOnBridgedTokens(address _recipient, uint256 _value) internal {
Expand Down
Expand Up @@ -2,7 +2,6 @@ pragma solidity 0.4.24;

import "./BasicAMBErc677ToErc677.sol";
import "../../interfaces/IBurnableMintableERC677Token.sol";
import "openzeppelin-solidity/contracts/AddressUtils.sol";

contract HomeAMBErc677ToErc677 is BasicAMBErc677ToErc677 {
function executeActionOnBridgedTokens(address _recipient, uint256 _value) internal {
Expand Down
Expand Up @@ -2,13 +2,12 @@ pragma solidity 0.4.24;

import "../BasicForeignBridge.sol";
import "../ERC20Bridge.sol";
import "../OtherSideBridgeStorage.sol";

contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge {
contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge, OtherSideBridgeStorage {
event RelayedMessage(address recipient, uint256 value, bytes32 transactionHash);
event UserRequestForAffirmation(address recipient, uint256 value);

bytes32 internal constant BRIDGE_CONTRACT = 0x71483949fe7a14d16644d63320f24d10cf1d60abecc30cc677a340e82b699dd2; // keccak256(abi.encodePacked("bridgeOnOtherSide"))

function initialize(
address _validatorContract,
address _erc20token,
Expand Down Expand Up @@ -79,14 +78,6 @@ contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge {
revert();
}

function _setBridgeContractOnOtherSide(address _bridgeContract) internal {
addressStorage[BRIDGE_CONTRACT] = _bridgeContract;
}

function bridgeContractOnOtherSide() public view returns (address) {
return addressStorage[BRIDGE_CONTRACT];
}

function _relayTokens(address _sender, address _receiver, uint256 _amount) internal {
require(_receiver != address(0));
require(_receiver != address(this));
Expand Down
Expand Up @@ -4,7 +4,6 @@ import "../../libraries/Message.sol";
import "../../upgradeability/EternalStorage.sol";
import "../../interfaces/IBlockReward.sol";
import "../BasicHomeBridge.sol";
import "../ERC677Bridge.sol";
import "../OverdrawManagement.sol";
import "./RewardableHomeBridgeErcToNative.sol";
import "../BlockRewardBridge.sol";
Expand Down
Expand Up @@ -22,7 +22,8 @@ contract ForeignBridgeNativeToErc is
uint256 _requiredBlockConfirmations,
uint256[] _homeDailyLimitHomeMaxPerTxArray, // [ 0 = _homeDailyLimit, 1 = _homeMaxPerTx ]
address _owner,
uint256 _decimalShift
uint256 _decimalShift,
address _bridgeOnOtherSide
) external returns (bool) {
_initialize(
_validatorContract,
Expand All @@ -32,7 +33,8 @@ contract ForeignBridgeNativeToErc is
_requiredBlockConfirmations,
_homeDailyLimitHomeMaxPerTxArray,
_owner,
_decimalShift
_decimalShift,
_bridgeOnOtherSide
);
setInitialize();
return isInitialized();
Expand All @@ -48,7 +50,8 @@ contract ForeignBridgeNativeToErc is
address _owner,
address _feeManager,
uint256 _homeFee,
uint256 _decimalShift
uint256 _decimalShift,
address _bridgeOnOtherSide
) external returns (bool) {
_initialize(
_validatorContract,
Expand All @@ -58,7 +61,8 @@ contract ForeignBridgeNativeToErc is
_requiredBlockConfirmations,
_homeDailyLimitHomeMaxPerTxArray,
_owner,
_decimalShift
_decimalShift,
_bridgeOnOtherSide
);
require(AddressUtils.isContract(_feeManager));
addressStorage[FEE_MANAGER_CONTRACT] = _feeManager;
Expand All @@ -83,7 +87,8 @@ contract ForeignBridgeNativeToErc is
uint256 _requiredBlockConfirmations,
uint256[] _homeDailyLimitHomeMaxPerTxArray, // [ 0 = _homeDailyLimit, 1 = _homeMaxPerTx ]
address _owner,
uint256 _decimalShift
uint256 _decimalShift,
address _bridgeOnOtherSide
) internal {
require(!isInitialized());
require(AddressUtils.isContract(_validatorContract));
Expand All @@ -109,6 +114,7 @@ contract ForeignBridgeNativeToErc is
uintStorage[EXECUTION_MAX_PER_TX] = _homeDailyLimitHomeMaxPerTxArray[1];
uintStorage[DECIMAL_SHIFT] = _decimalShift;
setOwner(_owner);
_setBridgeContractOnOtherSide(_bridgeOnOtherSide);

emit RequiredBlockConfirmationChanged(_requiredBlockConfirmations);
emit GasPriceChanged(_foreignGasPrice);
Expand Down
Expand Up @@ -8,12 +8,12 @@ import "../Sacrifice.sol";

contract HomeBridgeNativeToErc is EternalStorage, BasicHomeBridge, RewardableHomeBridgeNativeToErc {
function() public payable {
nativeTransfer();
require(msg.data.length == 0);
nativeTransfer(msg.sender);
}

function nativeTransfer() internal {
function nativeTransfer(address _receiver) internal {
require(msg.value > 0);
require(msg.data.length == 0);
require(withinLimit(msg.value));
setTotalSpentPerDay(getCurrentDay(), totalSpentPerDay(getCurrentDay()).add(msg.value));
uint256 valueToTransfer = msg.value;
Expand All @@ -22,7 +22,11 @@ contract HomeBridgeNativeToErc is EternalStorage, BasicHomeBridge, RewardableHom
uint256 fee = calculateFee(valueToTransfer, false, feeManager, HOME_FEE);
valueToTransfer = valueToTransfer.sub(fee);
}
emit UserRequestForSignature(msg.sender, valueToTransfer);
emit UserRequestForSignature(_receiver, valueToTransfer);
}

function relayTokens(address _receiver) external payable {
nativeTransfer(_receiver);
}

function initialize(
Expand Down
2 changes: 1 addition & 1 deletion deploy/deploy.js
Expand Up @@ -12,7 +12,7 @@ async function deployNativeToErc() {
const deployForeign = require('./src/native_to_erc/foreign')
await preDeploy()
const { homeBridge } = await deployHome()
const { foreignBridge, erc677 } = await deployForeign()
const { foreignBridge, erc677 } = await deployForeign(homeBridge.address)
console.log('\nDeployment has been completed.\n\n')
console.log(`[ Home ] HomeBridge: ${homeBridge.address} at block ${homeBridge.deployedBlockNumber}`)
console.log(`[ Foreign ] ForeignBridge: ${foreignBridge.address} at block ${foreignBridge.deployedBlockNumber}`)
Expand Down
17 changes: 11 additions & 6 deletions deploy/src/native_to_erc/foreign.js
Expand Up @@ -64,7 +64,7 @@ if (isRewardableBridge) {
VALIDATORS_REWARD_ACCOUNTS = env.VALIDATORS_REWARD_ACCOUNTS.split(' ')
}

async function initializeBridge({ validatorsBridge, bridge, erc677bridgeToken, initialNonce }) {
async function initializeBridge({ validatorsBridge, bridge, erc677bridgeToken, initialNonce, homeBridgeAddress }) {
let nonce = initialNonce
let initializeFBridgeData

Expand Down Expand Up @@ -95,7 +95,8 @@ async function initializeBridge({ validatorsBridge, bridge, erc677bridgeToken, i
FOREIGN_BRIDGE_OWNER: ${FOREIGN_BRIDGE_OWNER},
Fee Manager: ${feeManager.options.address},
Home Fee: ${homeFeeInWei} which is ${HOME_TRANSACTIONS_FEE * 100}%,
FOREIGN_TO_HOME_DECIMAL_SHIFT: ${foreignToHomeDecimalShift}`)
FOREIGN_TO_HOME_DECIMAL_SHIFT: ${foreignToHomeDecimalShift}
Home bridge Address: ${homeBridgeAddress}`)

initializeFBridgeData = await bridge.methods
.rewardableInitialize(
Expand All @@ -108,7 +109,8 @@ async function initializeBridge({ validatorsBridge, bridge, erc677bridgeToken, i
FOREIGN_BRIDGE_OWNER,
feeManager.options.address,
homeFeeInWei,
foreignToHomeDecimalShift
foreignToHomeDecimalShift,
homeBridgeAddress
)
.encodeABI({ from: DEPLOYMENT_ACCOUNT_ADDRESS })
} else {
Expand All @@ -126,6 +128,7 @@ async function initializeBridge({ validatorsBridge, bridge, erc677bridgeToken, i
HOME_MAX_AMOUNT_PER_TX: ${HOME_MAX_AMOUNT_PER_TX} which is ${Web3Utils.fromWei(HOME_MAX_AMOUNT_PER_TX)} in eth,
FOREIGN_BRIDGE_OWNER: ${FOREIGN_BRIDGE_OWNER},
FOREIGN_TO_HOME_DECIMAL_SHIFT: ${foreignToHomeDecimalShift}
Home bridge Address: ${homeBridgeAddress}
`)

initializeFBridgeData = await bridge.methods
Expand All @@ -137,7 +140,8 @@ async function initializeBridge({ validatorsBridge, bridge, erc677bridgeToken, i
FOREIGN_REQUIRED_BLOCK_CONFIRMATIONS,
[HOME_DAILY_LIMIT, HOME_MAX_AMOUNT_PER_TX],
FOREIGN_BRIDGE_OWNER,
foreignToHomeDecimalShift
foreignToHomeDecimalShift,
homeBridgeAddress
)
.encodeABI({ from: DEPLOYMENT_ACCOUNT_ADDRESS })
}
Expand All @@ -159,7 +163,7 @@ async function initializeBridge({ validatorsBridge, bridge, erc677bridgeToken, i
return nonce
}

async function deployForeign() {
async function deployForeign(homeBridgeAddress) {
let nonce = await web3Foreign.eth.getTransactionCount(DEPLOYMENT_ACCOUNT_ADDRESS)
console.log('========================================')
console.log('deploying ForeignBridge')
Expand Down Expand Up @@ -259,7 +263,8 @@ async function deployForeign() {
validatorsBridge: storageValidatorsForeign,
bridge: foreignBridgeImplementation,
erc677bridgeToken,
initialNonce: nonce
initialNonce: nonce,
homeBridgeAddress
})

console.log('\nset bridge contract on ERC677BridgeToken')
Expand Down
6 changes: 3 additions & 3 deletions test/erc_to_erc/home_bridge.test.js
Expand Up @@ -1439,7 +1439,7 @@ contract('HomeBridge_ERC20_to_ERC20', async accounts => {
await token.mint(user, value, { from: owner }).should.be.fulfilled

// When
await token.transferAndCall(homeBridge.address, value, '0x00', { from: user }).should.be.fulfilled
await token.transferAndCall(homeBridge.address, value, '0x', { from: user }).should.be.fulfilled

// Then
const events = await getEvents(homeBridge, { event: 'UserRequestForSignature' })
Expand Down Expand Up @@ -1481,7 +1481,7 @@ contract('HomeBridge_ERC20_to_ERC20', async accounts => {
await token.mint(user, value, { from: owner }).should.be.fulfilled

// When
await token.transferAndCall(homeBridge.address, value, '0x00', { from: user }).should.be.fulfilled
await token.transferAndCall(homeBridge.address, value, '0x', { from: user }).should.be.fulfilled

// Then
const events = await getEvents(homeBridge, { event: 'UserRequestForSignature' })
Expand Down Expand Up @@ -1969,7 +1969,7 @@ contract('HomeBridge_ERC20_to_ERC20', async accounts => {
await token.mint(user, value, { from: owner }).should.be.fulfilled

// When
await token.transferAndCall(homeBridge.address, value, '0x00', { from: user }).should.be.fulfilled
await token.transferAndCall(homeBridge.address, value, '0x', { from: user }).should.be.fulfilled

// Then
const events = await getEvents(homeBridge, { event: 'UserRequestForSignature' })
Expand Down

0 comments on commit db50b48

Please sign in to comment.