Added flexibility to MoatAddress.

This commit is contained in:
Sowmayjain 2018-10-27 16:41:57 +05:30
parent 9b366f95e6
commit 93c0043a22
3 changed files with 62 additions and 225 deletions

View File

@ -1,15 +1,44 @@
// addresses name - address, asset, resolver, moatkyber, moatmaker
// addresses name - address, asset, resolver, moatkyber, moatmaker, admin
pragma solidity ^0.4.24;
contract AddressRegistry {
event AddressChanged(string name, address target);
mapping(bytes32 => address) internal addressRegistry;
event AddressChanged(string name, address addr);
event ResolverApproved(address user, address addr);
event ResolverDisapproved(address user, address addr);
// Resolver Contract Addresses >> Asset Owner Address >> Bool
mapping(address => mapping(address => bool)) allowedResolver;
// Addresses managing the protocol governance
mapping(address => bool) governors;
// Address registry of connected smart contracts
mapping(bytes32 => address) registry;
// Contract addresses having rights to perform tasks, approved by users
// Resolver Contract >> User >> Approved
mapping(address => mapping(address => bool)) resolvers;
}
contract Governance is AddressRegistry {
// governance code goes here to update the admin in "registry" mapping
}
contract ManageRegistry is Governance {
function setAddr(string name, address newAddr) public onlyAdmin {
registry[keccak256(name)] = newAddr;
emit AddressChanged(name, newAddr);
}
function getAddr(string name) public view returns(address addr) {
addr = registry[keccak256(name)];
require(addr != address(0), "Not a valid address.");
}
modifier onlyAdmin() {
require(
@ -19,30 +48,31 @@ contract AddressRegistry {
_;
}
constructor() public {
addressRegistry[keccak256("admin")] = msg.sender;
}
}
function setAddr(string name, address newAddress) public onlyAdmin {
addressRegistry[keccak256(name)] = newAddress;
emit AddressChanged(name, newAddress);
}
function getAddr(string name) public view returns(address addr) {
addr = addressRegistry[keccak256(name)];
require(addr != address(0), "Not a valid address.");
}
contract ManageResolvers is ManageRegistry {
function approveResolver() public {
allowedResolver[getAddr("resolver")][msg.sender] = true;
resolvers[getAddr("resolver")][msg.sender] = true;
emit ResolverApproved(msg.sender, getAddr("resolver"));
}
function disapproveResolver() public {
allowedResolver[getAddr("resolver")][msg.sender] = false;
resolvers[getAddr("resolver")][msg.sender] = false;
emit ResolverDisapproved(msg.sender, getAddr("resolver"));
}
function isApprovedResolver(address user) public view returns(bool) {
return allowedResolver[getAddr("resolver")][user];
return resolvers[getAddr("resolver")][user];
}
}
contract InitRegistry is ManageResolvers {
constructor() public {
registry[keccak256("admin")] = msg.sender;
}
}

View File

@ -1,51 +1,11 @@
// Global Freeze Variable
// withdraw store the 0.5% on the contract itself and can be withdrawn by admin addresses
// after sometime of inactivity, admin have power to change the ownership of the wealth. What say?
// still didn't factor 18 decimal thing on Kyber
pragma solidity ^0.4.24;
interface AddressRegistry {
function getAddr(string addrName) external returns(address);
}
interface token {
function transfer(address receiver, uint amount) external returns(bool);
function transfer(address receiver, uint amount) external returns (bool);
}
interface MoatAsset {
function getBalance(address assetHolder, address tokenAddr) external view returns (uint256 balance);
function transferAssets(
address tokenAddress,
uint amount,
address sendTo,
address target
) external;
function updateBalance(
address tokenAddress,
uint amount,
bool credit,
address user
) external;
}
interface MoatKyber {
function executeTrade(
uint weiAmt,
address src,
address dest,
uint srcAmt,
uint slipRate,
address walletId
) external returns (uint);
}
interface MoatMaker {
function getLoan(
address borrower,
uint lockETH,
uint loanDAI
) external returns (uint, address);
interface AddressRegistry {
function getAddr(string name) external returns(address);
}
@ -69,172 +29,27 @@ contract Registry {
}
contract Protocols is Registry {
contract FeeDetail is Registry {
event KyberExecute(
address trader,
address src,
address dest,
uint srcAmt,
uint destAmt,
uint slipRate,
uint fees
);
event MakerLoan(
address borrower,
uint lockETH,
uint loanDAI,
uint feeDeduct
);
address eth = 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee;
uint public fees;
bool public feesBool;
bool public feeBool;
function getFees() public view returns(uint, bool) {
return (fees, feesBool);
}
function kyberTrade(
address src,
address dest,
uint srcAmt,
uint slipRate
) public payable
{
MoatAsset initMA = MoatAsset(getAddress("asset"));
uint ethVal;
if (src == eth) {
ethVal = srcAmt;
}
if (msg.value > 0 && msg.value == srcAmt) {
getAddress("moatkyber").transfer(srcAmt);
} else {
initMA.transferAssets(
src,
srcAmt,
getAddress("moatkyber"),
msg.sender
);
}
// initiate kyber trade
MoatKyber kybermoat = MoatKyber(getAddress("moatkyber"));
uint destAmt = kybermoat.executeTrade(
ethVal,
src,
dest,
srcAmt,
slipRate,
getAddress("admin")
);
uint feeCut;
uint modifiedDestAmt = destAmt;
if (feesBool) {
feeCut = destAmt/fees;
modifiedDestAmt = destAmt - feeCut;
}
if (dest == eth) {
getAddress("asset").transfer(modifiedDestAmt);
} else {
token tokenFunctions = token(dest);
tokenFunctions.transfer(getAddress("asset"), destAmt);
}
initMA.updateBalance(
src,
srcAmt,
false,
msg.sender
);
initMA.updateBalance(
dest,
modifiedDestAmt,
true,
msg.sender
);
emit KyberExecute(
msg.sender,
src,
dest,
srcAmt,
destAmt,
slipRate,
feeCut
);
return (fees, feeBool);
}
function makerBorrow(
uint lockETH,
uint loanDAI
) public payable
{
function enableFees() public onlyAdmin {
feeBool = true;
}
MoatAsset initMA = MoatAsset(getAddress("asset"));
if (msg.value > 0) {
require(lockETH == msg.value, "Possibility of glitch in the Tx");
getAddress("moatmaker").transfer(msg.value);
} else {
initMA.transferAssets(
eth,
lockETH,
getAddress("moatmaker"),
msg.sender
);
initMA.updateBalance(
eth,
lockETH,
false,
msg.sender
);
}
MoatMaker makermoat = MoatMaker(getAddress("moatmaker"));
uint daiMinted;
address daiAddr;
(daiMinted, daiAddr) = makermoat.getLoan(
msg.sender,
lockETH,
loanDAI
);
uint modifiedLoanDAI;
uint feeDeduct;
if (loanDAI > 0) {
if (feesBool) {
feeDeduct = loanDAI/fees;
modifiedLoanDAI = loanDAI - feeDeduct;
}
token tokenFunctions = token(daiAddr);
tokenFunctions.transfer(getAddress("asset"), modifiedLoanDAI);
initMA.updateBalance(
daiAddr,
modifiedLoanDAI,
true,
msg.sender
);
}
emit MakerLoan(
msg.sender,
lockETH,
loanDAI,
feeDeduct
);
function disableFees() public onlyAdmin {
feeBool = false;
}
}
contract MoatResolver is Protocols {
contract MoatResolver is FeeDetail {
function () public payable {}
@ -244,7 +59,7 @@ contract MoatResolver is Protocols {
}
function collectFees(address tokenAddress, uint amount) public onlyAdmin {
if (tokenAddress == eth) {
if (tokenAddress == 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee) {
msg.sender.transfer(amount);
} else {
token tokenFunctions = token(tokenAddress);
@ -252,12 +67,4 @@ contract MoatResolver is Protocols {
}
}
function enableFees() public onlyAdmin {
feesBool = true;
}
function disableFees() public onlyAdmin {
feesBool = false;
}
}