code refactoring and minor bugs

This commit is contained in:
Samyak Jain 2019-10-04 22:04:52 +05:30
parent 29cf94993e
commit 3b86bf9dec

View File

@ -65,12 +65,8 @@ contract SoloMarginContract {
} }
function operate(Info[] memory accounts, ActionArgs[] memory actions) public; function operate(Info[] memory accounts, ActionArgs[] memory actions) public;
function getAccountWei( function getAccountWei(Info memory account, uint256 marketId) public returns (Wei memory);
Info memory account,
uint256 marketId
)
public
returns (Wei memory);
} }
@ -81,6 +77,7 @@ contract PayableProxySoloMarginContract {
SoloMarginContract.ActionArgs[] memory actions, SoloMarginContract.ActionArgs[] memory actions,
address payable sendEthTo address payable sendEthTo
) public payable; ) public payable;
} }
@ -159,14 +156,14 @@ contract Helpers is DSMath {
ERC20Interface erc20Contract = ERC20Interface(erc20); ERC20Interface erc20Contract = ERC20Interface(erc20);
uint tokenAllowance = erc20Contract.allowance(address(this), to); uint tokenAllowance = erc20Contract.allowance(address(this), to);
if (srcAmt > tokenAllowance) { if (srcAmt > tokenAllowance) {
erc20Contract.approve(to, 2**255); erc20Contract.approve(to, uint(-1));
} }
} }
/** /**
* @dev getting actions arg * @dev getting actions arg
*/ */
function getActionsArgs( uint256 marketId, uint256 tokenAmt, bool sign) internal returns ( SoloMarginContract.ActionArgs[] memory) { function getActionsArgs(uint256 marketId, uint256 tokenAmt, bool sign) internal view returns (SoloMarginContract.ActionArgs[] memory) {
SoloMarginContract.ActionArgs[] memory actions = new SoloMarginContract.ActionArgs[](1); SoloMarginContract.ActionArgs[] memory actions = new SoloMarginContract.ActionArgs[](1);
SoloMarginContract.AssetAmount memory amount = SoloMarginContract.AssetAmount( SoloMarginContract.AssetAmount memory amount = SoloMarginContract.AssetAmount(
sign, sign,
@ -190,10 +187,10 @@ contract Helpers is DSMath {
return actions; return actions;
} }
/** /**
* @dev getting acccount arg * @dev getting acccount arg
*/ */
function getAccountArgs() internal returns ( SoloMarginContract.Info[] memory) { function getAccountArgs() internal view returns (SoloMarginContract.Info[] memory) {
SoloMarginContract.Info[] memory accounts = new SoloMarginContract.Info[](1); SoloMarginContract.Info[] memory accounts = new SoloMarginContract.Info[](1);
accounts[0] = (SoloMarginContract.Info(address(this), 0)); accounts[0] = (SoloMarginContract.Info(address(this), 0));
return accounts; return accounts;
@ -219,129 +216,79 @@ contract DydxResolver is Helpers {
event LogBorrow(address erc20Addr, uint tokenAmt, address owner); event LogBorrow(address erc20Addr, uint tokenAmt, address owner);
event LogPayback(address erc20Addr, uint tokenAmt, address owner); event LogPayback(address erc20Addr, uint tokenAmt, address owner);
/** /**
* @dev Deposit ETH/ERC20 * @dev Deposit ETH/ERC20
*/ */
function deposit( function deposit(uint256 marketId, address erc20Addr, uint256 tokenAmt) public payable {
uint256 marketId,
address erc20Addr,
uint256 tokenAmt
) public payable
{
if (erc20Addr == getAddressETH()) { if (erc20Addr == getAddressETH()) {
PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress()); PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress());
soloPayable.operate.value(msg.value)(getAccountArgs(), getActionsArgs(marketId, msg.value, true), msg.sender); soloPayable.operate.value(msg.value)(getAccountArgs(), getActionsArgs(marketId, msg.value, true), msg.sender);
} else { } else {
require(ERC20Interface(erc20Addr).transferFrom(msg.sender, address(this), tokenAmt), "Allowance or not enough bal");
setApproval(erc20Addr, tokenAmt, getSoloAddress());
SoloMarginContract solo = SoloMarginContract(getSoloAddress()); SoloMarginContract solo = SoloMarginContract(getSoloAddress());
ERC20Interface token = ERC20Interface(erc20Addr); solo.operate(getAccountArgs(), getActionsArgs(marketId, tokenAmt, true));
uint toDeposit = token.balanceOf(msg.sender);
if (toDeposit > tokenAmt) {
toDeposit = tokenAmt;
}
token.transferFrom(msg.sender, address(this), toDeposit);
setApproval(erc20Addr, 2**255, getSoloAddress());
solo.operate(getAccountArgs(), getActionsArgs(marketId, toDeposit, true));
} }
emit LogDeposit(erc20Addr, tokenAmt, msg.sender); emit LogDeposit(erc20Addr, tokenAmt, address(this));
} }
/** /**
* @dev Payback ETH/ERC20 * @dev Payback ETH/ERC20
*/ */
function payback( function payback(uint256 marketId, address erc20Addr, uint256 tokenAmt) public payable {
uint256 marketId, uint toPayback = getDydxBal(marketId);
address erc20Addr, toPayback = toPayback > tokenAmt ? tokenAmt : toPayback;
uint256 tokenAmt
) public payable
{
if (erc20Addr == getAddressETH()) { if (erc20Addr == getAddressETH()) {
PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress()); PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress());
uint toDeposit = getDydxBal(marketId); soloPayable.operate.value(toPayback)(getAccountArgs(), getActionsArgs(marketId, toPayback, true), msg.sender);
if (toDeposit > tokenAmt) {
toDeposit = tokenAmt;
}
soloPayable.operate.value(toDeposit)(getAccountArgs(), getActionsArgs(marketId, toDeposit, true), msg.sender);
msg.sender.transfer(address(this).balance); msg.sender.transfer(address(this).balance);
emit LogPayback(erc20Addr, toDeposit, msg.sender);
} else { } else {
require(ERC20Interface(erc20Addr).transferFrom(msg.sender, address(this), toPayback), "Allowance or not enough bal");
setApproval(erc20Addr, toPayback, getSoloAddress());
SoloMarginContract solo = SoloMarginContract(getSoloAddress()); SoloMarginContract solo = SoloMarginContract(getSoloAddress());
ERC20Interface token = ERC20Interface(erc20Addr); solo.operate(getAccountArgs(), getActionsArgs(marketId, toPayback, true));
uint toDeposit = getDydxBal(marketId);
if (toDeposit > tokenAmt) {
toDeposit = tokenAmt;
}
token.transferFrom(msg.sender, address(this), toDeposit);
setApproval(erc20Addr, 2**255, getSoloAddress());
solo.operate(getAccountArgs(), getActionsArgs(marketId, toDeposit, true));
emit LogPayback(erc20Addr, toDeposit, msg.sender);
} }
emit LogPayback(erc20Addr, toPayback, address(this));
} }
/** /**
* @dev Withdraw ETH/ERC20 * @dev Withdraw ETH/ERC20
*/ */
function withdraw( function withdraw(uint256 marketId, address erc20Addr, uint256 tokenAmt) public {
uint256 marketId, uint toWithdraw = getDydxBal(marketId);
address erc20Addr, toWithdraw = toWithdraw > tokenAmt ? tokenAmt : toWithdraw;
uint256 tokenAmt
) public
{
if (erc20Addr == getAddressETH()) { if (erc20Addr == getAddressETH()) {
PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress()); PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress());
uint toDeposit = getDydxBal(marketId); soloPayable.operate(getAccountArgs(), getActionsArgs(marketId, toWithdraw, false), msg.sender);
if (toDeposit > tokenAmt) { setApproval(getAddressWETH(), toWithdraw, getAddressWETH());
toDeposit = tokenAmt; ERC20Interface(getAddressWETH()).withdraw(toWithdraw);
} msg.sender.transfer(toWithdraw);
soloPayable.operate(getAccountArgs(), getActionsArgs(marketId, toDeposit, false), msg.sender);
ERC20Interface weth = ERC20Interface(getAddressWETH());
setApproval(getAddressWETH(), 2**255, getAddressWETH());
weth.withdraw(toDeposit);
transferToken(getAddressETH());
emit LogWithdraw(erc20Addr, toDeposit, msg.sender);
} else { } else {
SoloMarginContract solo = SoloMarginContract(getSoloAddress()); SoloMarginContract solo = SoloMarginContract(getSoloAddress());
uint toDeposit = getDydxBal(marketId); solo.operate(getAccountArgs(), getActionsArgs(marketId, toWithdraw, false));
if (toDeposit > tokenAmt) { require(ERC20Interface(erc20Addr).transfer(msg.sender, toWithdraw), "Allowance or not enough bal");
toDeposit = tokenAmt;
}
solo.operate(getAccountArgs(), getActionsArgs(marketId, toDeposit, false));
setApproval(erc20Addr, 2**255, msg.sender);
transferToken(erc20Addr);
emit LogWithdraw(erc20Addr, toDeposit, msg.sender);
} }
emit LogWithdraw(erc20Addr, toWithdraw, address(this));
} }
/** /**
* @dev Borrow ETH/ERC20 * @dev Borrow ETH/ERC20
*/ */
function borrow( function borrow(uint256 marketId, address erc20Addr, uint256 tokenAmt) public {
uint256 marketId,
address erc20Addr,
uint256 tokenAmt
) public
{
if (erc20Addr == getAddressETH()) { if (erc20Addr == getAddressETH()) {
PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress()); PayableProxySoloMarginContract soloPayable = PayableProxySoloMarginContract(getSoloPayableAddress());
soloPayable.operate(getAccountArgs(), getActionsArgs(marketId, tokenAmt, false), msg.sender); soloPayable.operate(getAccountArgs(), getActionsArgs(marketId, tokenAmt, false), msg.sender);
ERC20Interface weth = ERC20Interface(getAddressWETH()); setApproval(getAddressWETH(), tokenAmt, getAddressWETH());
setApproval(getAddressWETH(), 2**255, getAddressWETH()); ERC20Interface(getAddressWETH()).withdraw(tokenAmt);
weth.withdraw(tokenAmt); msg.sender.transfer(tokenAmt);
transferToken(getAddressETH());
} else { } else {
SoloMarginContract solo = SoloMarginContract(getSoloAddress()); SoloMarginContract solo = SoloMarginContract(getSoloAddress());
solo.operate(getAccountArgs(), getActionsArgs(marketId, tokenAmt, false)); solo.operate(getAccountArgs(), getActionsArgs(marketId, tokenAmt, false));
setApproval(erc20Addr, 2**255, msg.sender); require(ERC20Interface(erc20Addr).transfer(msg.sender, tokenAmt), "Allowance or not enough bal");
transferToken(erc20Addr);
} }
emit LogBorrow(erc20Addr, tokenAmt, msg.sender); emit LogBorrow(erc20Addr, tokenAmt, address(this));
} }
} }