diff --git a/contracts/common/basic.sol b/contracts/common/basic.sol index 8092d66c..27fbfc43 100644 --- a/contracts/common/basic.sol +++ b/contracts/common/basic.sol @@ -27,4 +27,14 @@ abstract contract Basic is DSMath, Stores { return abi.encode(eventName, eventParam); } -} \ No newline at end of file + function convertEthToWeth(bool isEth, TokenInterface token, uint amount) internal { + if(isEth) token.deposit{value: amount}(); + } + + function convertWethToEth(bool isEth, TokenInterface token, uint amount) internal { + if(isEth) { + token.approve(address(token), amount); + token.withdraw(amount); + } + } +} diff --git a/contracts/common/interfaces.sol b/contracts/common/interfaces.sol index 5caf0964..e0a92c1c 100644 --- a/contracts/common/interfaces.sol +++ b/contracts/common/interfaces.sol @@ -17,4 +17,10 @@ interface MemoryInterface { interface InstaMapping { function cTokenMapping(address) external view returns (address); -} \ No newline at end of file +} + +interface AccountInterface { + function enable(address) external; + function disable(address) external; + function isAuth(address) external view returns (bool); +} diff --git a/contracts/common/utils.sol b/contracts/common/utils.sol deleted file mode 100644 index d5523349..00000000 --- a/contracts/common/utils.sol +++ /dev/null @@ -1,16 +0,0 @@ -pragma solidity ^0.7.0; - -import { TokenInterface } from "./interfaces.sol"; - -abstract contract Utils { - function convertEthToWeth(bool isEth, TokenInterface token, uint amount) internal { - if(isEth) token.deposit{value: amount}(); - } - - function convertWethToEth(bool isEth, TokenInterface token, uint amount) internal { - if(isEth) { - token.approve(address(token), amount); - token.withdraw(amount); - } - } -} \ No newline at end of file diff --git a/contracts/connectors/aave/v2/main.sol b/contracts/connectors/aave/v2/main.sol index 6ed00cfa..cbf717ee 100644 --- a/contracts/connectors/aave/v2/main.sol +++ b/contracts/connectors/aave/v2/main.sol @@ -2,12 +2,11 @@ pragma solidity ^0.7.0; import { TokenInterface } from "../../../common/interfaces.sol"; import { Stores } from "../../../common/stores.sol"; -import { Utils } from "../../../common/utils.sol"; import { Helpers } from "./helpers.sol"; import { Events } from "./events.sol"; import { AaveInterface } from "./interface.sol"; -abstract contract AaveResolver is Events, Helpers, Utils { +abstract contract AaveResolver is Events, Helpers { /** * @dev Deposit ETH/ERC20_Token. * @param token token address to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) diff --git a/contracts/connectors/authority/events.sol b/contracts/connectors/authority/events.sol new file mode 100644 index 00000000..1ad38da7 --- /dev/null +++ b/contracts/connectors/authority/events.sol @@ -0,0 +1,6 @@ +pragma solidity ^0.7.0; + +contract Events { + event LogAddAuth(address indexed _msgSender, address indexed _authority); + event LogRemoveAuth(address indexed _msgSender, address indexed _authority); +} \ No newline at end of file diff --git a/contracts/connectors/authority/helpers.sol b/contracts/connectors/authority/helpers.sol new file mode 100644 index 00000000..f50ef089 --- /dev/null +++ b/contracts/connectors/authority/helpers.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +import { DSMath } from "../../common/math.sol"; +import { Basic } from "../../common/basic.sol"; +import { ListInterface } from "./interface.sol"; + +abstract contract Helpers is DSMath, Basic { + ListInterface internal constant listContract = ListInterface(0x4c8a1BEb8a87765788946D6B19C6C6355194AbEb); + + function checkAuthCount() internal view returns (uint count) { + uint64 accountId = listContract.accountID(address(this)); + count = listContract.accountLink(accountId).count; + } +} diff --git a/contracts/connectors/authority/interface.sol b/contracts/connectors/authority/interface.sol new file mode 100644 index 00000000..5b7fde6d --- /dev/null +++ b/contracts/connectors/authority/interface.sol @@ -0,0 +1,13 @@ +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +interface ListInterface { + struct AccountLink { + address first; + address last; + uint64 count; + } + + function accountID(address) external view returns (uint64); + function accountLink(uint64) external view returns (AccountLink memory); +} \ No newline at end of file diff --git a/contracts/connectors/authority/main.sol b/contracts/connectors/authority/main.sol new file mode 100644 index 00000000..db7cb53f --- /dev/null +++ b/contracts/connectors/authority/main.sol @@ -0,0 +1,34 @@ +pragma solidity ^0.7.0; + +import { AccountInterface } from "../../common/interfaces.sol"; +import { Helpers } from "./helpers.sol"; +import { Events } from "./events.sol"; + +abstract contract AuthorityResolver is Events, Helpers { + /** + * @dev Add New authority + * @param authority authority Address. + */ + function add( + address authority + ) external payable returns (string memory _eventName, bytes memory _eventParam) { + AccountInterface(address(this)).enable(authority); + + _eventName = "LogAddAuth(address,address)"; + _eventParam = abi.encode(msg.sender, authority); + } + + /** + * @dev Remove authority + * @param authority authority Address. + */ + function remove( + address authority + ) external payable returns (string memory _eventName, bytes memory _eventParam) { + require(checkAuthCount() > 1, "Removing-all-authorities"); + AccountInterface(address(this)).disable(authority); + + _eventName = "LogRemoveAuth(address,address)"; + _eventParam = abi.encode(msg.sender, authority); + } +}