Skip to content

Commit

Permalink
Merge 27a7575 into c0ee608
Browse files Browse the repository at this point in the history
  • Loading branch information
patitonar committed Oct 23, 2019
2 parents c0ee608 + 27a7575 commit ae8ded2
Show file tree
Hide file tree
Showing 14 changed files with 357 additions and 127 deletions.
4 changes: 3 additions & 1 deletion contracts/upgradeable_contracts/BasicForeignBridge.sol
@@ -1,7 +1,7 @@
pragma solidity 0.4.24;

import "../upgradeability/EternalStorage.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "./Validatable.sol";
import "../libraries/Message.sol";
import "./BasicTokenBridge.sol";
Expand All @@ -13,6 +13,8 @@ import "./MessageRelay.sol";
contract BasicForeignBridge is EternalStorage, Validatable, BasicBridge, BasicTokenBridge, MessageRelay {
/// triggered when relay of deposit from HomeBridge is complete
event RelayedMessage(address recipient, uint256 value, bytes32 transactionHash);
event UserRequestForAffirmation(address recipient, uint256 value);

function executeSignatures(uint8[] vs, bytes32[] rs, bytes32[] ss, bytes message) external {
Message.hasEnoughValidSignatures(message, vs, rs, ss, validatorContract(), false);
address recipient;
Expand Down
2 changes: 1 addition & 1 deletion contracts/upgradeable_contracts/BasicHomeBridge.sol
Expand Up @@ -2,7 +2,7 @@ pragma solidity 0.4.24;

import "../upgradeability/EternalStorage.sol";
import "openzeppelin-solidity/contracts/math/SafeMath.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "./Validatable.sol";
import "../libraries/Message.sol";
import "./BasicBridge.sol";
Expand Down
2 changes: 1 addition & 1 deletion contracts/upgradeable_contracts/Claimable.sol
@@ -1,6 +1,6 @@
pragma solidity 0.4.24;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "./Sacrifice.sol";

contract Claimable {
Expand Down
24 changes: 22 additions & 2 deletions contracts/upgradeable_contracts/ERC20Bridge.sol
@@ -1,10 +1,10 @@
pragma solidity 0.4.24;

import "../upgradeability/EternalStorage.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "openzeppelin-solidity/contracts/AddressUtils.sol";
import "./BasicForeignBridge.sol";

contract ERC20Bridge is EternalStorage {
contract ERC20Bridge is BasicForeignBridge {
bytes32 internal constant ERC20_TOKEN = 0x15d63b18dbc21bf4438b7972d80076747e1d93c4f87552fe498c90cbde51665e; // keccak256(abi.encodePacked("erc20token"))

function erc20token() public view returns (ERC20) {
Expand All @@ -15,4 +15,24 @@ contract ERC20Bridge is EternalStorage {
require(AddressUtils.isContract(_token));
addressStorage[ERC20_TOKEN] = _token;
}

function _relayTokens(address _sender, address _receiver, uint256 _amount) internal {
require(_receiver != address(0));
require(_receiver != address(this));
require(_amount > 0);
require(withinLimit(_amount));
setTotalSpentPerDay(getCurrentDay(), totalSpentPerDay(getCurrentDay()).add(_amount));

erc20token().transferFrom(_sender, address(this), _amount);
emit UserRequestForAffirmation(_receiver, _amount);
}

function relayTokens(address _from, address _receiver, uint256 _amount) external {
require(_from == msg.sender || _from == _receiver);
_relayTokens(_from, _receiver, _amount);
}

function relayTokens(address _receiver, uint256 _amount) external {
_relayTokens(msg.sender, _receiver, _amount);
}
}
4 changes: 2 additions & 2 deletions contracts/upgradeable_contracts/ERC677Bridge.sol
Expand Up @@ -8,9 +8,9 @@ contract ERC677Bridge is BaseERC677Bridge, OtherSideBridgeStorage {
ERC677, /*_token*/
address _from,
uint256 _value,
bytes /*_data*/
bytes _data
) internal {
fireEventOnTokenTransfer(_from, _value);
fireEventOnTokenTransfer(chooseReceiver(_from, _data), _value);
}

/* solcov ignore next */
Expand Down
Expand Up @@ -9,32 +9,41 @@ contract BasicForeignBridgeErcToErc is BasicForeignBridge {
address _erc20token,
uint256 _requiredBlockConfirmations,
uint256 _gasPrice,
uint256[] _maxPerTxHomeDailyLimitHomeMaxPerTxArray, // [ 0 = _maxPerTx, 1 = _homeDailyLimit, 2 = _homeMaxPerTx ]
uint256[] _dailyLimitMaxPerTxMinPerTxArray, // [ 0 = _dailyLimit, 1 = _maxPerTx, 2 = _minPerTx ]
uint256[] _homeDailyLimitHomeMaxPerTxArray, // [ 0 = _homeDailyLimit, 1 = _homeMaxPerTx ]
address _owner,
uint256 _decimalShift
) internal {
require(!isInitialized());
require(AddressUtils.isContract(_validatorContract));
require(_requiredBlockConfirmations != 0);
require(_gasPrice > 0);
require(_maxPerTxHomeDailyLimitHomeMaxPerTxArray[2] < _maxPerTxHomeDailyLimitHomeMaxPerTxArray[1]); // _homeMaxPerTx < _homeDailyLimit
require(
_dailyLimitMaxPerTxMinPerTxArray[2] > 0 && // _minPerTx > 0
_dailyLimitMaxPerTxMinPerTxArray[1] > _dailyLimitMaxPerTxMinPerTxArray[2] && // _maxPerTx > _minPerTx
_dailyLimitMaxPerTxMinPerTxArray[0] > _dailyLimitMaxPerTxMinPerTxArray[1] // _dailyLimit > _maxPerTx
);
require(_homeDailyLimitHomeMaxPerTxArray[1] < _homeDailyLimitHomeMaxPerTxArray[0]); // _homeMaxPerTx < _homeDailyLimit
require(_owner != address(0));

addressStorage[VALIDATOR_CONTRACT] = _validatorContract;
setErc20token(_erc20token);
uintStorage[DEPLOYED_AT_BLOCK] = block.number;
uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _requiredBlockConfirmations;
uintStorage[GAS_PRICE] = _gasPrice;
uintStorage[MAX_PER_TX] = _maxPerTxHomeDailyLimitHomeMaxPerTxArray[0];
uintStorage[EXECUTION_DAILY_LIMIT] = _maxPerTxHomeDailyLimitHomeMaxPerTxArray[1];
uintStorage[EXECUTION_MAX_PER_TX] = _maxPerTxHomeDailyLimitHomeMaxPerTxArray[2];
uintStorage[DAILY_LIMIT] = _dailyLimitMaxPerTxMinPerTxArray[0];
uintStorage[MAX_PER_TX] = _dailyLimitMaxPerTxMinPerTxArray[1];
uintStorage[MIN_PER_TX] = _dailyLimitMaxPerTxMinPerTxArray[2];
uintStorage[EXECUTION_DAILY_LIMIT] = _homeDailyLimitHomeMaxPerTxArray[0];
uintStorage[EXECUTION_MAX_PER_TX] = _homeDailyLimitHomeMaxPerTxArray[1];
uintStorage[DECIMAL_SHIFT] = _decimalShift;
setOwner(_owner);
setInitialize();

emit RequiredBlockConfirmationChanged(_requiredBlockConfirmations);
emit GasPriceChanged(_gasPrice);
emit ExecutionDailyLimitChanged(_maxPerTxHomeDailyLimitHomeMaxPerTxArray[1]);
emit DailyLimitChanged(_dailyLimitMaxPerTxMinPerTxArray[0]);
emit ExecutionDailyLimitChanged(_homeDailyLimitHomeMaxPerTxArray[0]);
}

function getBridgeMode() external pure returns (bytes4 _data) {
Expand Down
Expand Up @@ -4,8 +4,6 @@ import "./BasicForeignBridgeErcToErc.sol";
import "../ERC677Bridge.sol";

contract ForeignBridgeErc677ToErc677 is ERC677Bridge, BasicForeignBridgeErcToErc {
event UserRequestForAffirmation(address recipient, uint256 value);

function initialize(
address _validatorContract,
address _erc20token,
Expand All @@ -16,30 +14,17 @@ contract ForeignBridgeErc677ToErc677 is ERC677Bridge, BasicForeignBridgeErcToErc
address _owner,
uint256 _decimalShift
) external returns (bool) {
require(
_dailyLimitMaxPerTxMinPerTxArray[2] > 0 && // _minPerTx > 0
_dailyLimitMaxPerTxMinPerTxArray[1] > _dailyLimitMaxPerTxMinPerTxArray[2] && // _maxPerTx > _minPerTx
_dailyLimitMaxPerTxMinPerTxArray[0] > _dailyLimitMaxPerTxMinPerTxArray[1] // _dailyLimit > _maxPerTx
);
uint256[] memory _maxPerTxHomeDailyLimitHomeMaxPerTxArray = new uint256[](3);
_maxPerTxHomeDailyLimitHomeMaxPerTxArray[0] = _dailyLimitMaxPerTxMinPerTxArray[1]; // _maxPerTx
_maxPerTxHomeDailyLimitHomeMaxPerTxArray[1] = _homeDailyLimitHomeMaxPerTxArray[0]; // _homeDailyLimit
_maxPerTxHomeDailyLimitHomeMaxPerTxArray[2] = _homeDailyLimitHomeMaxPerTxArray[1]; // _homeMaxPerTx
_initialize(
_validatorContract,
_erc20token,
_requiredBlockConfirmations,
_gasPrice,
_maxPerTxHomeDailyLimitHomeMaxPerTxArray, // [ 0 = _maxPerTx, 1 = _homeDailyLimit, 2 = _homeMaxPerTx ]
_dailyLimitMaxPerTxMinPerTxArray,
_homeDailyLimitHomeMaxPerTxArray,
_owner,
_decimalShift
);

uintStorage[DAILY_LIMIT] = _dailyLimitMaxPerTxMinPerTxArray[0];
uintStorage[MIN_PER_TX] = _dailyLimitMaxPerTxMinPerTxArray[2];

emit DailyLimitChanged(_dailyLimitMaxPerTxMinPerTxArray[0]);

return isInitialized();
}

Expand Down
Expand Up @@ -9,7 +9,8 @@ contract ForeignBridgeErcToErc is BasicForeignBridgeErcToErc, ERC20Bridge {
address _erc20token,
uint256 _requiredBlockConfirmations,
uint256 _gasPrice,
uint256[] _maxPerTxHomeDailyLimitHomeMaxPerTxArray, // [ 0 = _maxPerTx, 1 = _homeDailyLimit, 2 = _homeMaxPerTx ]
uint256[] _dailyLimitMaxPerTxMinPerTxArray, // [ 0 = _dailyLimit, 1 = _maxPerTx, 2 = _minPerTx ]
uint256[] _homeDailyLimitHomeMaxPerTxArray, // [ 0 = _homeDailyLimit, 1 = _homeMaxPerTx ]
address _owner,
uint256 _decimalShift
) external returns (bool) {
Expand All @@ -18,7 +19,8 @@ contract ForeignBridgeErcToErc is BasicForeignBridgeErcToErc, ERC20Bridge {
_erc20token,
_requiredBlockConfirmations,
_gasPrice,
_maxPerTxHomeDailyLimitHomeMaxPerTxArray,
_dailyLimitMaxPerTxMinPerTxArray,
_homeDailyLimitHomeMaxPerTxArray,
_owner,
_decimalShift
);
Expand Down
Expand Up @@ -5,9 +5,6 @@ import "../ERC20Bridge.sol";
import "../OtherSideBridgeStorage.sol";

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

function initialize(
address _validatorContract,
address _erc20token,
Expand Down Expand Up @@ -79,23 +76,7 @@ contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge, OtherSideB
}

function _relayTokens(address _sender, address _receiver, uint256 _amount) internal {
require(_receiver != address(0));
require(_receiver != address(this));
require(_receiver != bridgeContractOnOtherSide());
require(_amount > 0);
require(withinLimit(_amount));
setTotalSpentPerDay(getCurrentDay(), totalSpentPerDay(getCurrentDay()).add(_amount));

erc20token().transferFrom(_sender, address(this), _amount);
emit UserRequestForAffirmation(_receiver, _amount);
}

function relayTokens(address _from, address _receiver, uint256 _amount) external {
require(_from == msg.sender || _from == _receiver);
_relayTokens(_from, _receiver, _amount);
}

function relayTokens(address _receiver, uint256 _amount) external {
_relayTokens(msg.sender, _receiver, _amount);
super._relayTokens(_sender, _receiver, _amount);
}
}
Expand Up @@ -2,7 +2,7 @@ pragma solidity 0.4.24;

import "../../interfaces/IBurnableMintableERC677Token.sol";
import "../BasicForeignBridge.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
import "../ERC677BridgeForBurnableMintableToken.sol";
import "./RewardableForeignBridgeNativeToErc.sol";

Expand All @@ -11,9 +11,6 @@ contract ForeignBridgeNativeToErc is
ERC677BridgeForBurnableMintableToken,
RewardableForeignBridgeNativeToErc
{
/// Event created on money withdraw.
event UserRequestForAffirmation(address recipient, uint256 value);

function initialize(
address _validatorContract,
address _erc677token,
Expand Down
42 changes: 14 additions & 28 deletions deploy/src/erc_to_erc/foreign.js
Expand Up @@ -57,34 +57,20 @@ async function initializeBridge({ validatorsBridge, bridge, nonce }) {
FOREIGN_BRIDGE_OWNER: ${FOREIGN_BRIDGE_OWNER},
FOREIGN_TO_HOME_DECIMAL_SHIFT: ${foreignToHomeDecimalShift}
`)
let initializeFBridgeData

if (ERC20_EXTENDED_BY_ERC677) {
initializeFBridgeData = await bridge.methods
.initialize(
validatorsBridge.options.address,
ERC20_TOKEN_ADDRESS,
FOREIGN_REQUIRED_BLOCK_CONFIRMATIONS,
FOREIGN_GAS_PRICE,
[FOREIGN_DAILY_LIMIT, FOREIGN_MAX_AMOUNT_PER_TX, FOREIGN_MIN_AMOUNT_PER_TX],
[HOME_DAILY_LIMIT, HOME_MAX_AMOUNT_PER_TX],
FOREIGN_BRIDGE_OWNER,
foreignToHomeDecimalShift
)
.encodeABI()
} else {
initializeFBridgeData = await bridge.methods
.initialize(
validatorsBridge.options.address,
ERC20_TOKEN_ADDRESS,
FOREIGN_REQUIRED_BLOCK_CONFIRMATIONS,
FOREIGN_GAS_PRICE,
[FOREIGN_MAX_AMOUNT_PER_TX, HOME_DAILY_LIMIT, HOME_MAX_AMOUNT_PER_TX],
FOREIGN_BRIDGE_OWNER,
foreignToHomeDecimalShift
)
.encodeABI()
}

const initializeFBridgeData = await bridge.methods
.initialize(
validatorsBridge.options.address,
ERC20_TOKEN_ADDRESS,
FOREIGN_REQUIRED_BLOCK_CONFIRMATIONS,
FOREIGN_GAS_PRICE,
[FOREIGN_DAILY_LIMIT, FOREIGN_MAX_AMOUNT_PER_TX, FOREIGN_MIN_AMOUNT_PER_TX],
[HOME_DAILY_LIMIT, HOME_MAX_AMOUNT_PER_TX],
FOREIGN_BRIDGE_OWNER,
foreignToHomeDecimalShift
)
.encodeABI()

const txInitializeBridge = await sendRawTxForeign({
data: initializeFBridgeData,
nonce,
Expand Down
17 changes: 3 additions & 14 deletions deploy/src/loadEnv.js
Expand Up @@ -75,7 +75,6 @@ const {
VALIDATORS_REWARD_ACCOUNTS,
DEPLOY_REWARDABLE_TOKEN,
HOME_FEE_MANAGER_TYPE,
ERC20_EXTENDED_BY_ERC677,
HOME_EVM_VERSION,
FOREIGN_EVM_VERSION
} = process.env
Expand Down Expand Up @@ -223,14 +222,8 @@ if (BRIDGE_MODE === 'ERC_TO_ERC') {
BRIDGEABLE_TOKEN_SYMBOL: envalid.str(),
BRIDGEABLE_TOKEN_DECIMALS: envalid.num(),
DEPLOY_REWARDABLE_TOKEN: envalid.bool(),
ERC20_EXTENDED_BY_ERC677: envalid.bool()
}

if (ERC20_EXTENDED_BY_ERC677 === 'true') {
validations = {
...validations,
FOREIGN_MIN_AMOUNT_PER_TX: bigNumValidator()
}
ERC20_EXTENDED_BY_ERC677: envalid.bool(),
FOREIGN_MIN_AMOUNT_PER_TX: bigNumValidator()
}

if (DEPLOY_REWARDABLE_TOKEN === 'true') {
Expand Down Expand Up @@ -289,11 +282,7 @@ if (env.BRIDGE_MODE === 'NATIVE_TO_ERC') {
}

if (env.BRIDGE_MODE === 'ERC_TO_ERC') {
if (env.ERC20_EXTENDED_BY_ERC677) {
checkLimits(env.FOREIGN_MIN_AMOUNT_PER_TX, env.FOREIGN_MAX_AMOUNT_PER_TX, env.FOREIGN_DAILY_LIMIT, foreignPrefix)
} else if (env.FOREIGN_MAX_AMOUNT_PER_TX.gte(env.FOREIGN_DAILY_LIMIT)) {
throw new Error(`FOREIGN_DAILY_LIMIT should be greater than FOREIGN_MAX_AMOUNT_PER_TX`)
}
checkLimits(env.FOREIGN_MIN_AMOUNT_PER_TX, env.FOREIGN_MAX_AMOUNT_PER_TX, env.FOREIGN_DAILY_LIMIT, foreignPrefix)

if (env.HOME_REWARDABLE === 'BOTH_DIRECTIONS' && env.BLOCK_REWARD_ADDRESS === ZERO_ADDRESS) {
throw new Error(
Expand Down

0 comments on commit ae8ded2

Please sign in to comment.