Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
257 changes: 137 additions & 120 deletions contracts/tokenbridge/libraries/vault/MasterVault.sol

Large diffs are not rendered by default.

39 changes: 25 additions & 14 deletions contracts/tokenbridge/libraries/vault/MasterVaultFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Create2.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol";
import "../ClonableBeaconProxy.sol";
import "./IMasterVault.sol";
import "./IMasterVaultFactory.sol";
import "./MasterVault.sol";

contract DefaultSubVault is ERC4626 {
constructor(address token) ERC4626(IERC20(token)) ERC20("Default SubVault", "DSV") {}
}

// todo: slim down this contract
contract MasterVaultFactory is IMasterVaultFactory, Initializable {
error ZeroAddress();
error BeaconNotDeployed();
Expand All @@ -27,23 +32,13 @@ contract MasterVaultFactory is IMasterVaultFactory, Initializable {
}

function deployVault(address token) public returns (address vault) {
if (token == address(0)) {
revert ZeroAddress();
}
if (
address(beaconProxyFactory) == address(0) && beaconProxyFactory.beacon() == address(0)
) {
revert BeaconNotDeployed();
}

bytes32 userSalt = _getUserSalt(token);
vault = beaconProxyFactory.createProxy(userSalt);

IERC20Metadata tokenMetadata = IERC20Metadata(token);
string memory name = string(abi.encodePacked("Master ", tokenMetadata.name()));
string memory symbol = string(abi.encodePacked("m", tokenMetadata.symbol()));
string memory name = string(abi.encodePacked("Master ", _tryGetTokenName(token)));
string memory symbol = string(abi.encodePacked("m", _tryGetTokenSymbol(token)));

MasterVault(vault).initialize(IERC20(token), name, symbol, owner);
MasterVault(vault).initialize(new DefaultSubVault(token), name, symbol, owner);

emit VaultDeployed(token, vault);
}
Expand All @@ -64,4 +59,20 @@ contract MasterVaultFactory is IMasterVaultFactory, Initializable {
}
return vault;
}

function _tryGetTokenName(address token) internal view returns (string memory) {
try IERC20Metadata(token).name() returns (string memory name) {
return name;
} catch {
return "";
}
}

function _tryGetTokenSymbol(address token) internal view returns (string memory) {
try IERC20Metadata(token).symbol() returns (string memory symbol) {
return symbol;
} catch {
return "";
}
}
}
4 changes: 4 additions & 0 deletions contracts/tokenbridge/test/MockSubVault.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@ contract MockSubVault is ERC4626 {
function totalAssets() public view override returns (uint256) {
return IERC20(asset()).balanceOf(address(this));
}

function adminMint(address to, uint256 amount) external {
_mint(to, amount);
}
}
4 changes: 4 additions & 0 deletions contracts/tokenbridge/test/TestERC20.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ contract TestERC20 is aeERC20 {
function mint() external {
_mint(msg.sender, 50000000);
}

function mint(uint256 amount) external {
_mint(msg.sender, amount);
}
}

// test token code inspired from maker
Expand Down
Loading
Loading