Skip to content
This repository was archived by the owner on Aug 21, 2023. It is now read-only.

Commit d1de6ea

Browse files
authored
Merge pull request #48 from bugout-dev/terminus-controller
Terminus controller
2 parents d6e089d + 2c09628 commit d1de6ea

8 files changed

Lines changed: 1407 additions & 1 deletion

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
/**
4+
* Authors: Moonstream Engineering (engineering@moonstream.to)
5+
* GitHub: https://github.com/bugout-dev/dao
6+
*
7+
*/
8+
9+
import "@openzeppelin-contracts/contracts/access/Ownable.sol";
10+
import "./TerminusFacet.sol";
11+
12+
pragma solidity ^0.8.9;
13+
14+
abstract contract TerminusPermissions {
15+
function _holdsPoolToken(
16+
address terminusAddress,
17+
uint256 poolId,
18+
uint256 _amount
19+
) internal view returns (bool) {
20+
TerminusFacet terminus = TerminusFacet(terminusAddress);
21+
return terminus.balanceOf(msg.sender, poolId) >= _amount;
22+
}
23+
24+
modifier holdsPoolToken(address terminusAddress, uint256 poolId) {
25+
require(
26+
_holdsPoolToken(terminusAddress, poolId, 1),
27+
"TerminusPermissions.holdsPoolToken: Sender doens't hold pool tokens"
28+
);
29+
_;
30+
}
31+
32+
modifier spendsPoolToken(address terminusAddress, uint256 poolId) {
33+
require(
34+
_holdsPoolToken(terminusAddress, poolId, 1),
35+
"TerminusPermissions.spendsPoolToken: Sender doens't hold pool tokens"
36+
);
37+
TerminusFacet terminusContract = TerminusFacet(terminusAddress);
38+
terminusContract.burn(msg.sender, poolId, 1);
39+
_;
40+
}
41+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
/**
4+
* Authors: Moonstream Engineering (engineering@moonstream.to)
5+
* GitHub: https://github.com/bugout-dev/dao
6+
*
7+
*/
8+
pragma solidity ^0.8.9;
9+
10+
import "@openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol";
11+
import "@openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol";
12+
import "@openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
13+
import "@openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol";
14+
15+
import "../diamond/libraries/LibDiamond.sol";
16+
17+
contract TokenDrainerFacet {
18+
function drainERC20(address tokenAddress, address receiverAddress)
19+
external
20+
{
21+
uint256 balance = IERC20(tokenAddress).balanceOf(address(this));
22+
withdrawERC20(tokenAddress, balance, receiverAddress);
23+
}
24+
25+
function withdrawERC20(
26+
address tokenAddress,
27+
uint256 amount,
28+
address receiverAddress
29+
) public {
30+
LibDiamond.enforceIsContractOwner();
31+
IERC20 token = IERC20(tokenAddress);
32+
token.transfer(receiverAddress, amount);
33+
}
34+
35+
function drainERC1155(
36+
address tokenAddress,
37+
uint256 tokenId,
38+
address receiverAddress
39+
) external {
40+
uint256 balance = IERC1155(tokenAddress).balanceOf(
41+
address(this),
42+
tokenId
43+
);
44+
withdrawERC1155(tokenAddress, tokenId, balance, receiverAddress);
45+
}
46+
47+
function withdrawERC1155(
48+
address tokenAddress,
49+
uint256 tokenId,
50+
uint256 amount,
51+
address receiverAddress
52+
) public {
53+
LibDiamond.enforceIsContractOwner();
54+
IERC1155 token = IERC1155(tokenAddress);
55+
token.safeTransferFrom(
56+
address(this),
57+
receiverAddress,
58+
tokenId,
59+
amount,
60+
""
61+
);
62+
}
63+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
/**
4+
* Authors: Moonstream Engineering (engineering@moonstream.to)
5+
* GitHub: https://github.com/bugout-dev/dao
6+
*
7+
*/
8+
9+
pragma solidity ^0.8.9;
10+
11+
struct TerminusPool {
12+
address terminusAddress;
13+
uint256 poolId;
14+
}
15+
16+
library LibTerminusController {
17+
bytes32 constant TERMINUS_CONTROLLER_STORAGE_POSITION =
18+
keccak256("moonstreamdao.eth.storage.terminus.controller");
19+
20+
struct TerminusControllerStorage {
21+
address terminusAddress;
22+
TerminusPool terminusMainAdminPool;
23+
mapping(uint256 => TerminusPool) poolController;
24+
}
25+
26+
function terminusControllerStorage()
27+
internal
28+
pure
29+
returns (TerminusControllerStorage storage es)
30+
{
31+
bytes32 position = TERMINUS_CONTROLLER_STORAGE_POSITION;
32+
assembly {
33+
es.slot := position
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)