Skip to content

Commit

Permalink
feat: use hardhat and plugins (#79)
Browse files Browse the repository at this point in the history
* feat: use hardhat and plugins

* refactor(rebase): deleting files to avoid rebase conflicts

* refactor(rebase): updating tests to work with hardhat

* fix(npm): build command

* fix(test): removing token freeze tests

* feature(tests): external contract approval and execution

* chore(prettier): formatting code

* fix(Util): removing util as it moved to a separate repo

* chore(build): updating the build commands

* chore(build): updating the build commands

* fix(tests): removing unnecessary await

* fix(tests): replacing for loops with Promise.all

* chore(prettier): formatting code

Co-authored-by: Kiryl Yermakou <rma4ok@gmail.com>
  • Loading branch information
deluca-mike and re1ro authored Jun 2, 2022
1 parent f1a542a commit faa6638
Show file tree
Hide file tree
Showing 67 changed files with 28,672 additions and 17,838 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/publish-bytecode.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,4 @@ jobs:
- uses: actions/upload-artifact@v2
with:
name: Bytecode-${{ steps.release_tag.outputs.VERSION }}
path: build/
path: artifacts/
27 changes: 0 additions & 27 deletions .github/workflows/test-evm-versions.yaml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ jobs:
run: npm ci

- name: Test
run: npm run build && npm t
run: npm run test-evm-versions
6 changes: 3 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,6 @@ dist
# TernJS port file
.tern-port

build
cache
flattened
build/*
cache/*
artifacts/*
35 changes: 19 additions & 16 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
{
"singleQuote": true,
"trailingComma": "all",
"printWidth": 80,
"overrides": [
{
"files": "*.sol",
"options": {
"printWidth": 120,
"tabWidth": 4,
"useTabs": false,
"singleQuote": true,
"bracketSpacing": true,
"explicitTypes": "always"
}
}
]
"printWidth": 140,
"singleQuote": true,
"tabWidth": 4,
"useTabs": false,
"bracketSpacing": true,
"overrides": [
{
"files": "*.sol",
"options": {
"explicitTypes": "always"
}
},
{
"files": "*.js",
"options": {
"trailingComma": "all"
}
}
]
}
File renamed without changes.
109 changes: 17 additions & 92 deletions src/AxelarGateway.sol → contracts/AxelarGateway.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ pragma solidity 0.8.9;

import { IAxelarGateway } from './interfaces/IAxelarGateway.sol';
import { IERC20 } from './interfaces/IERC20.sol';
import { IERC20Burn } from './interfaces/IERC20Burn.sol';
import { IERC20BurnFrom } from './interfaces/IERC20BurnFrom.sol';
import { IBurnableMintableCappedERC20 } from './interfaces/IBurnableMintableCappedERC20.sol';
import { ITokenDeployer } from './interfaces/ITokenDeployer.sol';

Expand Down Expand Up @@ -38,8 +36,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
}

/// @dev Storage slot with the address of the current factory. `keccak256('eip1967.proxy.implementation') - 1`.
bytes32 internal constant KEY_IMPLEMENTATION =
bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);
bytes32 internal constant KEY_IMPLEMENTATION = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);

// AUDIT: slot names should be prefixed with some standard string
bytes32 internal constant PREFIX_COMMAND_EXECUTED = keccak256('command-executed');
Expand Down Expand Up @@ -102,15 +99,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
uint256 amount
) external {
_burnTokenFrom(msg.sender, symbol, amount);
emit ContractCallWithToken(
msg.sender,
destinationChain,
destinationContractAddress,
keccak256(payload),
payload,
symbol,
amount
);
emit ContractCallWithToken(msg.sender, destinationChain, destinationContractAddress, keccak256(payload), payload, symbol, amount);
}

function isContractCallApproved(
Expand All @@ -120,8 +109,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
address contractAddress,
bytes32 payloadHash
) external view override returns (bool) {
return
getBool(_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash));
return getBool(_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash));
}

function isContractCallAndMintApproved(
Expand All @@ -135,15 +123,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
) external view override returns (bool) {
return
getBool(
_getIsContractCallApprovedWithMintKey(
commandId,
sourceChain,
sourceAddress,
contractAddress,
payloadHash,
symbol,
amount
)
_getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount)
);
}

Expand All @@ -166,15 +146,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
string calldata symbol,
uint256 amount
) external override returns (bool valid) {
bytes32 key = _getIsContractCallApprovedWithMintKey(
commandId,
sourceChain,
sourceAddress,
msg.sender,
payloadHash,
symbol,
amount
);
bytes32 key = _getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, msg.sender, payloadHash, symbol, amount);
valid = getBool(key);
if (valid) {
_setBool(key, false);
Expand Down Expand Up @@ -242,9 +214,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
// AUDIT: If `newImplementation.setup` performs `selfdestruct`, it will result in the loss of _this_ implementation (thereby losing the gateway)
// if `upgrade` is entered within the context of _this_ implementation itself.
if (setupParams.length != 0) {
(bool success, ) = newImplementation.delegatecall(
abi.encodeWithSelector(IAxelarGateway.setup.selector, setupParams)
);
(bool success, ) = newImplementation.delegatecall(abi.encodeWithSelector(IAxelarGateway.setup.selector, setupParams));

if (!success) revert SetupFailed();
}
Expand Down Expand Up @@ -283,7 +253,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
if (tokenType == TokenType.InternalBurnableFrom) {
burnSuccess = _callERC20Token(
tokenAddress,
abi.encodeWithSelector(IERC20BurnFrom.burnFrom.selector, sender, amount)
abi.encodeWithSelector(IBurnableMintableCappedERC20.burnFrom.selector, sender, amount)
);

if (!burnSuccess) revert BurnFailed(symbol);
Expand All @@ -303,7 +273,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {

if (!burnSuccess) revert BurnFailed(symbol);

IERC20Burn(tokenAddress).burn(bytes32(0));
IBurnableMintableCappedERC20(tokenAddress).burn(bytes32(0));
}

function _deployToken(
Expand Down Expand Up @@ -352,10 +322,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
if (tokenAddress == address(0)) revert TokenDoesNotExist(symbol);

if (_getTokenType(symbol) == TokenType.External) {
bool success = _callERC20Token(
tokenAddress,
abi.encodeWithSelector(IERC20.transfer.selector, account, amount)
);
bool success = _callERC20Token(tokenAddress, abi.encodeWithSelector(IERC20.transfer.selector, account, amount));

if (!success) revert MintFailed(symbol);
} else {
Expand All @@ -373,20 +340,15 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {

(bool success, bytes memory returnData) = depositHandler.execute(
tokenAddress,
abi.encodeWithSelector(
IERC20.transfer.selector,
address(this),
IERC20(tokenAddress).balanceOf(address(depositHandler))
)
abi.encodeWithSelector(IERC20.transfer.selector, address(this), IERC20(tokenAddress).balanceOf(address(depositHandler)))
);

if (!success || (returnData.length != uint256(0) && !abi.decode(returnData, (bool))))
revert BurnFailed(symbol);
if (!success || (returnData.length != uint256(0) && !abi.decode(returnData, (bool)))) revert BurnFailed(symbol);

// NOTE: `depositHandler` must always be destroyed in the same runtime context that it is deployed.
depositHandler.destroy(address(this));
} else {
IERC20Burn(tokenAddress).burn(salt);
IBurnableMintableCappedERC20(tokenAddress).burn(salt);
}
}

Expand All @@ -400,15 +362,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
uint256 sourceEventIndex
) internal {
_setContractCallApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash);
emit ContractCallApproved(
commandId,
sourceChain,
sourceAddress,
contractAddress,
payloadHash,
sourceTxHash,
sourceEventIndex
);
emit ContractCallApproved(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, sourceTxHash, sourceEventIndex);
}

function _approveContractCallWithMint(
Expand All @@ -422,15 +376,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
bytes32 sourceTxHash,
uint256 sourceEventIndex
) internal {
_setContractCallApprovedWithMint(
commandId,
sourceChain,
sourceAddress,
contractAddress,
payloadHash,
symbol,
amount
);
_setContractCallApprovedWithMint(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount);
emit ContractCallApprovedWithMint(
commandId,
sourceChain,
Expand Down Expand Up @@ -467,17 +413,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
address contractAddress,
bytes32 payloadHash
) internal pure returns (bytes32) {
return
keccak256(
abi.encode(
PREFIX_CONTRACT_CALL_APPROVED,
commandId,
sourceChain,
sourceAddress,
contractAddress,
payloadHash
)
);
return keccak256(abi.encode(PREFIX_CONTRACT_CALL_APPROVED, commandId, sourceChain, sourceAddress, contractAddress, payloadHash));
}

function _getIsContractCallApprovedWithMintKey(
Expand Down Expand Up @@ -544,10 +480,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
address contractAddress,
bytes32 payloadHash
) internal {
_setBool(
_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash),
true
);
_setBool(_getIsContractCallApprovedKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash), true);
}

function _setContractCallApprovedWithMint(
Expand All @@ -560,15 +493,7 @@ abstract contract AxelarGateway is IAxelarGateway, AdminMultisigBase {
uint256 amount
) internal {
_setBool(
_getIsContractCallApprovedWithMintKey(
commandId,
sourceChain,
sourceAddress,
contractAddress,
payloadHash,
symbol,
amount
),
_getIsContractCallApprovedWithMintKey(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, symbol, amount),
true
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -391,15 +391,7 @@ contract AxelarGatewayMultisig is IAxelarGatewayMultisig, AxelarGateway {
uint256 sourceEventIndex
) = abi.decode(params, (string, string, address, bytes32, bytes32, uint256));

_approveContractCall(
commandId,
sourceChain,
sourceAddress,
contractAddress,
payloadHash,
sourceTxHash,
sourceEventIndex
);
_approveContractCall(commandId, sourceChain, sourceAddress, contractAddress, payloadHash, sourceTxHash, sourceEventIndex);
}

function approveContractCallWithMint(bytes calldata params, bytes32 commandId) external onlySelf {
Expand Down Expand Up @@ -500,13 +492,10 @@ contract AxelarGatewayMultisig is IAxelarGatewayMultisig, AxelarGateway {
signers[i] = ECDSA.recover(messageHash, signatures[i]);
}

(
uint256 chainId,
Role signersRole,
bytes32[] memory commandIds,
string[] memory commands,
bytes[] memory params
) = abi.decode(data, (uint256, Role, bytes32[], string[], bytes[]));
(uint256 chainId, Role signersRole, bytes32[] memory commandIds, string[] memory commands, bytes[] memory params) = abi.decode(
data,
(uint256, Role, bytes32[], string[], bytes[])
);

if (chainId != block.chainid) revert InvalidChainId();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,14 @@ contract AxelarGatewayProxy is EternalStorage {
error SetupFailed();

/// @dev Storage slot with the address of the current factory. `keccak256('eip1967.proxy.implementation') - 1`.
bytes32 internal constant KEY_IMPLEMENTATION =
bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);
bytes32 internal constant KEY_IMPLEMENTATION = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc);

constructor(address gatewayImplementation, bytes memory params) {
_setAddress(KEY_IMPLEMENTATION, gatewayImplementation);

if (gatewayImplementation.code.length == 0) revert InvalidImplementation();

(bool success, ) = gatewayImplementation.delegatecall(
abi.encodeWithSelector(IAxelarGateway.setup.selector, params)
);
(bool success, ) = gatewayImplementation.delegatecall(abi.encodeWithSelector(IAxelarGateway.setup.selector, params));

if (!success) revert SetupFailed();
}
Expand Down
Loading

0 comments on commit faa6638

Please sign in to comment.