Fix behaviour for the unset fee manager contract (#539)
This commit is contained in:
parent
4e59f30655
commit
2d9efe2937
|
@ -18,38 +18,30 @@ contract RewardableBridge is Ownable, FeeTypes {
|
|||
bytes4 internal constant DISTRIBUTE_FEE_FROM_SIGNATURES = 0x59d78464; // distributeFeeFromSignatures(uint256)
|
||||
bytes4 internal constant DISTRIBUTE_FEE_FROM_AFFIRMATION = 0x054d46ec; // distributeFeeFromAffirmation(uint256)
|
||||
|
||||
function _getFee(bytes32 _feeType) internal view validFeeType(_feeType) returns (uint256) {
|
||||
uint256 fee;
|
||||
function _getFee(bytes32 _feeType) internal view validFeeType(_feeType) returns (uint256 fee) {
|
||||
address feeManager = feeManagerContract();
|
||||
bytes4 method = _feeType == HOME_FEE ? GET_HOME_FEE : GET_FOREIGN_FEE;
|
||||
bytes memory callData = abi.encodeWithSelector(method);
|
||||
|
||||
assembly {
|
||||
let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 32)
|
||||
fee := mload(0)
|
||||
|
||||
switch result
|
||||
case 0 {
|
||||
revert(0, 0)
|
||||
}
|
||||
if and(eq(returndatasize, 32), result) {
|
||||
fee := mload(0)
|
||||
}
|
||||
}
|
||||
return fee;
|
||||
}
|
||||
|
||||
function getFeeManagerMode() external view returns (bytes4) {
|
||||
bytes4 mode;
|
||||
function getFeeManagerMode() external view returns (bytes4 mode) {
|
||||
bytes memory callData = abi.encodeWithSelector(GET_FEE_MANAGER_MODE);
|
||||
address feeManager = feeManagerContract();
|
||||
assembly {
|
||||
let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 4)
|
||||
mode := mload(0)
|
||||
|
||||
switch result
|
||||
case 0 {
|
||||
revert(0, 0)
|
||||
}
|
||||
if and(eq(returndatasize, 32), result) {
|
||||
mode := mload(0)
|
||||
}
|
||||
}
|
||||
return mode;
|
||||
}
|
||||
|
||||
function feeManagerContract() public view returns (address) {
|
||||
|
@ -69,20 +61,20 @@ contract RewardableBridge is Ownable, FeeTypes {
|
|||
function calculateFee(uint256 _value, bool _recover, address _impl, bytes32 _feeType)
|
||||
internal
|
||||
view
|
||||
returns (uint256)
|
||||
returns (uint256 fee)
|
||||
{
|
||||
uint256 fee;
|
||||
bytes memory callData = abi.encodeWithSelector(CALCULATE_FEE, _value, _recover, _feeType);
|
||||
assembly {
|
||||
let result := callcode(gas, _impl, 0x0, add(callData, 0x20), mload(callData), 0, 32)
|
||||
fee := mload(0)
|
||||
|
||||
switch result
|
||||
case 0 {
|
||||
switch and(eq(returndatasize, 32), result)
|
||||
case 1 {
|
||||
fee := mload(0)
|
||||
}
|
||||
default {
|
||||
revert(0, 0)
|
||||
}
|
||||
}
|
||||
return fee;
|
||||
}
|
||||
|
||||
function distributeFeeFromSignatures(uint256 _fee, address _feeManager, bytes32 _txHash) internal {
|
||||
|
|
|
@ -37,22 +37,17 @@ contract HomeBridgeErcToErcPOSDAO is HomeBridgeErcToErc {
|
|||
return isInitialized();
|
||||
}
|
||||
|
||||
function blockRewardContract() public view returns (address) {
|
||||
address blockReward;
|
||||
function blockRewardContract() public view returns (address blockReward) {
|
||||
address feeManager = feeManagerContract();
|
||||
bytes memory callData = abi.encodeWithSelector(BLOCK_REWARD_CONTRACT_SELECTOR);
|
||||
|
||||
assembly {
|
||||
let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 32)
|
||||
blockReward := mload(0)
|
||||
|
||||
switch result
|
||||
case 0 {
|
||||
revert(0, 0)
|
||||
}
|
||||
if and(eq(returndatasize, 32), result) {
|
||||
blockReward := mload(0)
|
||||
}
|
||||
}
|
||||
|
||||
return blockReward;
|
||||
}
|
||||
|
||||
function setBlockRewardContract(address _blockReward) external onlyOwner {
|
||||
|
|
|
@ -21,19 +21,19 @@ contract RewardableHomeBridgeErcToNative is RewardableBridge {
|
|||
return _getFee(FOREIGN_FEE);
|
||||
}
|
||||
|
||||
function getAmountToBurn(uint256 _value) public view returns (uint256) {
|
||||
uint256 amount;
|
||||
function getAmountToBurn(uint256 _value) public view returns (uint256 amount) {
|
||||
bytes memory callData = abi.encodeWithSelector(GET_AMOUNT_TO_BURN, _value);
|
||||
address feeManager = feeManagerContract();
|
||||
assembly {
|
||||
let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 32)
|
||||
amount := mload(0)
|
||||
|
||||
switch result
|
||||
case 0 {
|
||||
switch and(eq(returndatasize, 32), result)
|
||||
case 1 {
|
||||
amount := mload(0)
|
||||
}
|
||||
default {
|
||||
revert(0, 0)
|
||||
}
|
||||
}
|
||||
return amount;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1440,6 +1440,24 @@ contract('HomeBridge_ERC20_to_ERC20', async accounts => {
|
|||
expect(await homeBridge.getHomeFee()).to.be.bignumber.equals(newHomeFee)
|
||||
expect(await homeBridge.getForeignFee()).to.be.bignumber.equals(newForeignFee)
|
||||
})
|
||||
it('should return zero parameters for zero fee manager', async () => {
|
||||
// When
|
||||
await homeBridge.initialize(
|
||||
validatorContract.address,
|
||||
[oneEther, halfEther, minPerTx],
|
||||
gasPrice,
|
||||
requireBlockConfirmations,
|
||||
token.address,
|
||||
[foreignDailyLimit, foreignMaxPerTx],
|
||||
owner,
|
||||
decimalShiftZero
|
||||
).should.be.fulfilled
|
||||
|
||||
// Then
|
||||
expect(await homeBridge.getFeeManagerMode()).to.be.equal('0x00000000')
|
||||
expect(await homeBridge.getHomeFee()).to.be.bignumber.equal(ZERO)
|
||||
expect(await homeBridge.getForeignFee()).to.be.bignumber.equal(ZERO)
|
||||
})
|
||||
it('should be able to get fee manager mode', async () => {
|
||||
// Given
|
||||
const feeManager = await FeeManagerErcToErcPOSDAO.new()
|
||||
|
|
|
@ -1810,6 +1810,15 @@ contract('HomeBridge_ERC20_to_Native', async accounts => {
|
|||
const bridgeForeignFee = await homeBridge.getForeignFee()
|
||||
bridgeForeignFee.should.be.bignumber.equal(foreignFee)
|
||||
})
|
||||
it('should return zero parameters for zero fee manager', async () => {
|
||||
// When
|
||||
await homeBridge.setFeeManagerContract(ZERO_ADDRESS, { from: owner }).should.be.fulfilled
|
||||
|
||||
// Then
|
||||
expect(await homeBridge.getFeeManagerMode()).to.be.equal('0x00000000')
|
||||
expect(await homeBridge.getHomeFee()).to.be.bignumber.equal(ZERO)
|
||||
expect(await homeBridge.getForeignFee()).to.be.bignumber.equal(ZERO)
|
||||
})
|
||||
it('should be able to get fee manager mode', async () => {
|
||||
// Given
|
||||
const feeManager = await FeeManagerErcToNative.new()
|
||||
|
|
|
@ -1185,6 +1185,25 @@ contract('ForeignBridge', async accounts => {
|
|||
expect(await foreignBridge.getHomeFee()).to.be.bignumber.equals(newHomeFee)
|
||||
})
|
||||
|
||||
it('should return zero parameters for zero fee manager', async () => {
|
||||
// When
|
||||
await foreignBridge.initialize(
|
||||
validatorContract.address,
|
||||
token.address,
|
||||
[oneEther, halfEther, minPerTx],
|
||||
gasPrice,
|
||||
requireBlockConfirmations,
|
||||
[homeDailyLimit, homeMaxPerTx],
|
||||
owner,
|
||||
decimalShiftZero,
|
||||
otherSideBridgeAddress
|
||||
)
|
||||
|
||||
// Then
|
||||
expect(await foreignBridge.getFeeManagerMode()).to.be.equal('0x00000000')
|
||||
expect(await foreignBridge.getHomeFee()).to.be.bignumber.equal(ZERO)
|
||||
})
|
||||
|
||||
it('should be able to get fee manager mode', async () => {
|
||||
// Given
|
||||
const feeManager = await FeeManagerNativeToErc.new()
|
||||
|
|
|
@ -1290,6 +1290,23 @@ contract('HomeBridge', async accounts => {
|
|||
// Then
|
||||
expect(await homeBridge.getForeignFee()).to.be.bignumber.equals(newForeignFee)
|
||||
})
|
||||
it('should return zero parameters for zero fee manager', async () => {
|
||||
// When
|
||||
await homeBridge.initialize(
|
||||
validatorContract.address,
|
||||
[oneEther, halfEther, minPerTx],
|
||||
gasPrice,
|
||||
requireBlockConfirmations,
|
||||
[foreignDailyLimit, foreignMaxPerTx],
|
||||
owner,
|
||||
decimalShiftZero
|
||||
).should.be.fulfilled
|
||||
|
||||
// Then
|
||||
expect(await homeBridge.getFeeManagerMode()).to.be.equal('0x00000000')
|
||||
expect(await homeBridge.getHomeFee()).to.be.bignumber.equal(ZERO)
|
||||
expect(await homeBridge.getForeignFee()).to.be.bignumber.equal(ZERO)
|
||||
})
|
||||
it('should be able to get fee manager mode', async () => {
|
||||
// Given
|
||||
const feeManager = await FeeManagerNativeToErc.new()
|
||||
|
|
Loading…
Reference in New Issue