diff --git a/contracts/colony/ColonyFunding.sol b/contracts/colony/ColonyFunding.sol index 065e184394..1616d2b3fe 100755 --- a/contracts/colony/ColonyFunding.sol +++ b/contracts/colony/ColonyFunding.sol @@ -132,25 +132,21 @@ contract ColonyFunding is fundingPots[0].balance[_token] += feeToPay; uint256 approvedAmount = domainReputationTokenApprovals[block.chainid][_domainId][_token]; - if (!tokenEarnsReputationOnPayout(_token) || approvedAmount >= remainder) { - // Either the token doesn't earn reputation or there is enough approval - // Either way, the domain gets all the funds - fundingPots[fundingPotId].balance[_token] += remainder; - if (tokenEarnsReputationOnPayout(_token)) { - // If it does earn reputation, deduct the approved amount - domainReputationTokenApprovals[block.chainid][_domainId][_token] -= remainder; + + if (tokenEarnsReputationOnPayout(_token)) { + uint256 transferrableAmount = min(approvedAmount, remainder); + uint256 untransferrableAmount = remainder - transferrableAmount; + + fundingPots[fundingPotId].balance[_token] += transferrableAmount; + domainReputationTokenApprovals[block.chainid][_domainId][_token] -= transferrableAmount; + emit DomainFundsClaimed(msgSender(), _token, _domainId, feeToPay, transferrableAmount); + if (untransferrableAmount > 0) { + fundingPots[domains[1].fundingPotId].balance[_token] += untransferrableAmount; + emit ColonyFundsClaimed(msgSender(), _token, 0, untransferrableAmount); } - emit DomainFundsClaimed(msgSender(), _token, _domainId, feeToPay, remainder); } else { - // The token earns reputation and there is not enough approvalable - // The domain gets what was approved - fundingPots[fundingPotId].balance[_token] += approvedAmount; - // And the rest goes to the root pot - Domain storage rootDomain = domains[1]; - fundingPots[rootDomain.fundingPotId].balance[_token] += remainder - approvedAmount; - domainReputationTokenApprovals[block.chainid][_domainId][_token] = 0; - emit DomainFundsClaimed(msgSender(), _token, _domainId, feeToPay, approvedAmount); - emit ColonyFundsClaimed(msgSender(), _token, 0, remainder - approvedAmount); + fundingPots[fundingPotId].balance[_token] += remainder; + emit DomainFundsClaimed(msgSender(), _token, _domainId, feeToPay, remainder); } // Claim funds diff --git a/contracts/colonyNetwork/ColonyNetworkDeployer.sol b/contracts/colonyNetwork/ColonyNetworkDeployer.sol index 61fcf5941a..7406e1ee06 100644 --- a/contracts/colonyNetwork/ColonyNetworkDeployer.sol +++ b/contracts/colonyNetwork/ColonyNetworkDeployer.sol @@ -220,14 +220,6 @@ contract ColonyNetworkDeployer is ColonyNetworkStorage { return domainTokenReceiverAddress; } - function isContract(address addr) internal view returns (bool) { - uint256 size; - assembly { - size := extcodesize(addr) - } - return size > 0; - } - function getDomainTokenReceiverAddress( address _colony, uint256 _domainId @@ -332,4 +324,12 @@ contract ColonyNetworkDeployer is ColonyNetworkStorage { ); return address(etherRouter); } + + function isContract(address addr) internal view returns (bool) { + uint256 size; + assembly { + size := extcodesize(addr) + } + return size > 0; + } } diff --git a/contracts/common/DomainTokenReceiver.sol b/contracts/common/DomainTokenReceiver.sol index b85561b95a..ccfa8ccdfc 100644 --- a/contracts/common/DomainTokenReceiver.sol +++ b/contracts/common/DomainTokenReceiver.sol @@ -40,11 +40,9 @@ contract DomainTokenReceiver is DSAuth { payable(colony).transfer(address(this).balance); return; } else { + uint256 balanceToTransfer = ERC20Extended(tokenAddress).balanceOf(address(this)); require( - ERC20Extended(tokenAddress).transfer( - colony, - ERC20Extended(tokenAddress).balanceOf(address(this)) - ), + ERC20Extended(tokenAddress).transfer(colony, balanceToTransfer), "domain-token-receiver-transfer-failed" ); }