Fix behaviour for the unset fee manager contract (#539)

This commit is contained in:
Kirill Fedoseev 2020-10-22 00:24:08 +03:00 committed by GitHub
parent 4e59f30655
commit 2d9efe2937
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 87 additions and 37 deletions

View File

@ -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 {

View File

@ -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 {

View File

@ -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;
}
}

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()