Skip to content

Commit

Permalink
refactor: verifiers
Browse files Browse the repository at this point in the history
  • Loading branch information
franciscotobar committed Apr 16, 2024
1 parent c1ad3c9 commit de10baf
Show file tree
Hide file tree
Showing 11 changed files with 237 additions and 517 deletions.
20 changes: 11 additions & 9 deletions contracts/DestinationContractHandler.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,8 @@ abstract contract DestinationContractHandler is Ownable {

function acceptContract(address destinationContract) external onlyOwner {
require(
destinationContract != address(0),
"Contract cannot be zero address"
);
require(
ContractValidator.isContract(destinationContract),
destinationContract == address(0) ||
ContractValidator.isContract(destinationContract),
"Address is not a contract"
);
require(
Expand All @@ -34,10 +31,6 @@ abstract contract DestinationContractHandler is Ownable {
address destinationContract,
uint256 index
) external onlyOwner {
require(
destinationContract != address(0),
"Contract cannot be zero address"
);
require(contracts[destinationContract], "Contract is not accepted");
require(
destinationContract == acceptedContracts[index],
Expand All @@ -59,4 +52,13 @@ abstract contract DestinationContractHandler is Ownable {
) external view returns (bool) {
return contracts[destinationContract];
}

function destinationContractValidation(
address destinationContract
) public view {
require(
contracts[destinationContract],
"Destination contract not allowed"
);
}
}
9 changes: 3 additions & 6 deletions contracts/utils/BoltzValidator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ library BoltzValidator {
function validate(
EnvelopingTypes.DeployRequest calldata relayRequest,
address contractAddr
) internal {
) internal returns (NativeSwap.PublicClaimInfo memory) {
bytes4 method = bytes4(keccak256(bytes(relayRequest.request.data[:4])));
NativeSwap.PublicClaimInfo memory claim;

Check warning

Code scanning / Slither

Uninitialized local variables Medium


Expand All @@ -40,11 +40,6 @@ library BoltzValidator {
revert("Method not allowed");
}

require(
relayRequest.request.tokenAmount <= claim.amount,
"Claiming value lower than fees"
);

NativeSwap swap = NativeSwap(relayRequest.request.to);

bytes32 preimageHash = sha256(abi.encodePacked(claim.preimage));
Expand All @@ -58,5 +53,7 @@ library BoltzValidator {
);

require(swap.swaps(hashValue), "Verifier: swap has no RBTC");

return claim;
}
}
25 changes: 25 additions & 0 deletions contracts/utils/ContractValidator.sol
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
// SPDX-License-Identifier:MIT
pragma solidity ^0.6.12;

import "../interfaces/ISmartWalletFactory.sol";
import "../interfaces/EnvelopingTypes.sol";

library ContractValidator {
/**
* Check if a contract has code in it
Expand All @@ -22,4 +25,26 @@ library ContractValidator {
codeHash := extcodehash(addr)
}
}

function deployValidation(
EnvelopingTypes.DeployRequest calldata relayRequest,
address factory
) internal view returns (address) {
require(
relayRequest.relayData.callForwarder == factory,
"Invalid factory"
);

address contractAddr = ISmartWalletFactory(
relayRequest.relayData.callForwarder
).getSmartWalletAddress(
relayRequest.request.from,
relayRequest.request.recoverer,
relayRequest.request.index
);

require(!isContract(contractAddr), "Address already created");

return contractAddr;
}
}
74 changes: 30 additions & 44 deletions contracts/verifier/BoltzDeployVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -43,55 +43,41 @@ contract BoltzDeployVerifier is
EnvelopingTypes.DeployRequest calldata relayRequest,
bytes calldata signature
) external virtual override returns (bytes memory context) {
require(
relayRequest.relayData.callForwarder == _factory,
"Invalid factory"
address contractAddr = ContractValidator.deployValidation(
relayRequest,
_factory
);

address contractAddr = BoltzSmartWalletFactory(
relayRequest.relayData.callForwarder
).getSmartWalletAddress(
relayRequest.request.from,
relayRequest.request.recoverer,
relayRequest.request.index
);

require(
!ContractValidator.isContract(contractAddr),
"Address already created"
);
destinationContractValidation(relayRequest.request.to);

require(
relayRequest.request.to == address(0) ||
contracts[relayRequest.request.to],
"Destination contract not allowed"
);
uint256 amount = 0;
if (relayRequest.request.to != address(0)) {
NativeSwap.PublicClaimInfo memory claim = BoltzValidator.validate(
relayRequest,
contractAddr
);
amount = claim.amount;
}

if (relayRequest.request.tokenAmount > 0) {
if (relayRequest.request.tokenContract != address(0)) {
require(
tokens[relayRequest.request.tokenContract],
"Token contract not allowed"
);
if (relayRequest.request.tokenContract != address(0)) {
require(
tokens[relayRequest.request.tokenContract],
"Token contract not allowed"
);

require(
relayRequest.request.tokenAmount <=
IERC20(relayRequest.request.tokenContract).balanceOf(
contractAddr
),
"Token balance too low"
);
} else {
if (relayRequest.request.to != address(0)) {
BoltzValidator.validate(relayRequest, contractAddr);
} else {
require(
relayRequest.request.tokenAmount <=
address(contractAddr).balance,
"Native balance too low"
);
}
}
require(
relayRequest.request.tokenAmount <=
IERC20(relayRequest.request.tokenContract).balanceOf(
contractAddr
),
"Token balance too low"
);
} else {
require(
relayRequest.request.tokenAmount <=
address(contractAddr).balance + amount,
"Native balance too low"
);
}

return (
Expand Down
34 changes: 15 additions & 19 deletions contracts/verifier/BoltzRelayVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -61,26 +61,22 @@ contract BoltzRelayVerifier is
"Destination contract not allowed"
);

if (relayRequest.request.tokenAmount > 0) {
if (relayRequest.request.tokenContract != address(0)) {
require(
tokens[relayRequest.request.tokenContract],
"Token contract not allowed"
);
if (relayRequest.request.tokenContract != address(0)) {
require(
tokens[relayRequest.request.tokenContract],
"Token contract not allowed"
);

require(
relayRequest.request.tokenAmount <=
IERC20(relayRequest.request.tokenContract).balanceOf(
payer
),
"Token balance too low"
);
} else {
require(
relayRequest.request.tokenAmount <= address(payer).balance,
"Native balance too low"
);
}
require(
relayRequest.request.tokenAmount <=
IERC20(relayRequest.request.tokenContract).balanceOf(payer),
"Token balance too low"
);
} else {
require(
relayRequest.request.tokenAmount <= address(payer).balance,
"Native balance too low"
);
}

return (
Expand Down
18 changes: 3 additions & 15 deletions contracts/verifier/DeployVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -40,22 +40,10 @@ contract DeployVerifier is IDeployVerifier, TokenHandler {
tokens[relayRequest.request.tokenContract],
"Token contract not allowed"
);
require(
relayRequest.relayData.callForwarder == _factory,
"Invalid factory"
);

address contractAddr = SmartWalletFactory(
relayRequest.relayData.callForwarder
).getSmartWalletAddress(
relayRequest.request.from,
relayRequest.request.recoverer,
relayRequest.request.index
);

require(
!ContractValidator.isContract(contractAddr),
"Address already created"
address contractAddr = ContractValidator.deployValidation(
relayRequest,
_factory
);

if (relayRequest.request.tokenContract != address(0)) {
Expand Down
41 changes: 16 additions & 25 deletions contracts/verifier/MinimalBoltzDeployVerifier.sol
Original file line number Diff line number Diff line change
Expand Up @@ -41,43 +41,34 @@ contract MinimalBoltzDeployVerifier is
EnvelopingTypes.DeployRequest calldata relayRequest,
bytes calldata signature
) external virtual override returns (bytes memory context) {
address contractAddr = ContractValidator.deployValidation(
relayRequest,
_factory
);

require(
relayRequest.relayData.callForwarder == _factory,
"Invalid factory"
relayRequest.request.to != address(0),
"SW needs a contract execution"
);

address contractAddr = MinimalBoltzSmartWalletFactory(
relayRequest.relayData.callForwarder
).getSmartWalletAddress(
relayRequest.request.from,
relayRequest.request.recoverer,
relayRequest.request.index
);
destinationContractValidation(relayRequest.request.to);

require(
!ContractValidator.isContract(contractAddr),
"Address already created"
NativeSwap.PublicClaimInfo memory claim = BoltzValidator.validate(
relayRequest,
contractAddr
);

require(
relayRequest.request.to != address(0),
"SW needs a contract execution"
relayRequest.request.tokenContract == address(0),
"RBTC necessary for payment"
);

require(
contracts[relayRequest.request.to],
"Destination contract not allowed"
relayRequest.request.tokenAmount <=
address(contractAddr).balance + claim.amount,
"Native balance too low"
);

if (relayRequest.request.tokenAmount > 0) {
require(
relayRequest.request.tokenContract == address(0),
"RBTC necessary for payment"
);

BoltzValidator.validate(relayRequest, contractAddr);
}

return (
abi.encode(
contractAddr,
Expand Down
Loading

0 comments on commit de10baf

Please sign in to comment.