mirror of
https://github.com/Instadapp/InstaContract.git
synced 2024-07-29 22:47:45 +00:00
Added flexibility to MoatAddress.
This commit is contained in:
parent
9b366f95e6
commit
93c0043a22
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user