From d5747bd903cb566e24f602b826622bf20e8a9391 Mon Sep 17 00:00:00 2001
From: Richa-iitr <richa@cs.iitr.ac.in>
Date: Wed, 31 Aug 2022 03:26:25 +0530
Subject: [PATCH] transfer method

---
 .../connectors/compound-iii/events.sol        |  41 ++++-
 .../connectors/compound-iii/helpers.sol       |  33 +++-
 .../mainnet/connectors/compound-iii/main.sol  | 144 +++++++++++++++++-
 3 files changed, 212 insertions(+), 6 deletions(-)

diff --git a/contracts/mainnet/connectors/compound-iii/events.sol b/contracts/mainnet/connectors/compound-iii/events.sol
index 92048049..4686012c 100644
--- a/contracts/mainnet/connectors/compound-iii/events.sol
+++ b/contracts/mainnet/connectors/compound-iii/events.sol
@@ -105,10 +105,10 @@ contract Events {
 		bool accrued
 	);
 
-    event LogRewardsClaimedTo(
+	event LogRewardsClaimedTo(
 		address indexed market,
 		address indexed account,
-        address to,
+		address to,
 		uint256 indexed totalClaimedInWei,
 		uint256 getId,
 		bool accrued
@@ -141,4 +141,41 @@ contract Events {
 		uint256 getId,
 		uint256 setId
 	);
+
+	event LogTransferBase(
+		address indexed market,
+		address indexed dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	);
+
+	event LogTransferBaseFrom(
+		address indexed market,
+		address indexed from,
+		address indexed dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	);
+
+	event LogTransferAsset(
+		address indexed market,
+		address token,
+		address indexed from,
+		address indexed dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	);
+
+	event LogTransferAssetFrom(
+		address indexed market,
+		address token,
+		address indexed from,
+		address indexed dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	);
 }
diff --git a/contracts/mainnet/connectors/compound-iii/helpers.sol b/contracts/mainnet/connectors/compound-iii/helpers.sol
index f411da59..500329dc 100644
--- a/contracts/mainnet/connectors/compound-iii/helpers.sol
+++ b/contracts/mainnet/connectors/compound-iii/helpers.sol
@@ -7,8 +7,8 @@ import { Basic } from "../../common/basic.sol";
 import { CometInterface, CometRewards } from "./interface.sol";
 
 abstract contract Helpers is DSMath, Basic {
-
-    CometRewards internal constant cometRewards = CometRewards(0x1B0e765F6224C21223AeA2af16c1C46E38885a40);
+	CometRewards internal constant cometRewards =
+		CometRewards(0x1B0e765F6224C21223AeA2af16c1C46E38885a40);
 
 	function getBaseToken(address market)
 		internal
@@ -87,6 +87,35 @@ abstract contract Helpers is DSMath, Basic {
 		(success, ) = market.delegatecall(data);
 	}
 
+	function _transfer(
+		address market,
+		address token,
+		address from,
+		address to,
+		uint256 amt
+	) public payable returns (bool success) {
+		bytes memory data;
+
+		if (from == address(0)) {
+			data = abi.encodeWithSignature(
+				"transferAsset(address, address, uint256)",
+				dest,
+				token,
+				amt
+			);
+		} else {
+			data = abi.encodeWithSignature(
+				"transferAssetFrom(address, address, address, uint256)",
+				from,
+				dest,
+				token,
+				amt
+			);
+		}
+
+		(success, ) = market.delegatecall(data);
+	}
+
 	function getAccountSupplyBalanceOfAsset(
 		address account,
 		address market,
diff --git a/contracts/mainnet/connectors/compound-iii/main.sol b/contracts/mainnet/connectors/compound-iii/main.sol
index aaf66a70..8f690992 100644
--- a/contracts/mainnet/connectors/compound-iii/main.sol
+++ b/contracts/mainnet/connectors/compound-iii/main.sol
@@ -463,7 +463,7 @@ abstract contract CompoundIIIResolver is Events, Helpers {
 		uint256 _amt = getUint(getId, amt);
 
 		require(market != address(0), "invalid market address");
-        bool isEth = (getBaseToken(market) == ethAddr);
+		bool isEth = (getBaseToken(market) == ethAddr);
 		address _token = isEth ? wethAddr : getBaseToken(market);
 
 		TokenInterface tokenContract = TokenInterface(_token);
@@ -513,7 +513,13 @@ abstract contract CompoundIIIResolver is Events, Helpers {
 		approve(tokenContract, market, uint256(-1));
 		uint256 _amt = CometInterface(market).borrowBalanceOf(address(this));
 
-		bool success = _supply(market, _token, address(0), address(0), uint256(-1));
+		bool success = _supply(
+			market,
+			_token,
+			address(0),
+			address(0),
+			uint256(-1)
+		);
 		require(success, "payback-failed");
 
 		setUint(setId, _amt);
@@ -708,6 +714,140 @@ abstract contract CompoundIIIResolver is Events, Helpers {
 			accrue
 		);
 	}
+
+	function transferBase(
+		address market,
+		address dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amount);
+		require(market != address(0), "invalid market address");
+
+		address token = getBaseToken(market);
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isEth) {
+			convertEthToWeth(isEth, tokenContract, _amt);
+		}
+
+		bool success = _transfer(market, _token, address(0), dest, _amt);
+		require(success, "transfer-base-failed");
+
+		setUint(setId, _amt);
+
+		_eventName = "LogTransferBase(address,address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(market, dest, _amt, getId, setId);
+	}
+
+	function transferBaseFrom(
+		address market,
+		address src,
+		address dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amount);
+		require(market != address(0), "invalid market address");
+
+		address token = getBaseToken(market);
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isEth) {
+			convertEthToWeth(isEth, tokenContract, _amt);
+		}
+
+		bool success = _transfer(market, _token, src, dest, _amt);
+		require(success, "transfer-base-from-failed");
+
+		setUint(setId, _amt);
+
+		_eventName = "LogTransferBaseFrom(address,address,address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(market, src, dest, _amt, getId, setId);
+	}
+
+	function transferAsset(
+		address market,
+		address token,
+		address dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amount);
+		require(
+			market != address(0) && token != address(0),
+			"invalid market address"
+		);
+
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isEth) {
+			convertEthToWeth(isEth, tokenContract, _amt);
+		}
+
+		bool success = _transfer(market, _token, address(0), dest, _amt);
+		require(success, "transfer-asset-failed");
+
+		setUint(setId, _amt);
+
+		_eventName = "LogTransferAsset(address,address,address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(market, _token, dest, _amt, getId, setId);
+	}
+
+	function transferAssetFrom(
+		address market,
+		address token,
+		address src,
+		address dest,
+		uint256 amount,
+		uint256 getId,
+		uint256 setId
+	)
+		external
+		payable
+		returns (string memory _eventName, bytes memory _eventParam)
+	{
+		uint256 _amt = getUint(getId, amount);
+		require(market != address(0), "invalid market address");
+
+		address token = getBaseToken(market);
+		bool isEth = token == ethAddr;
+		address _token = isEth ? wethAddr : token;
+		TokenInterface tokenContract = TokenInterface(_token);
+
+		if (isEth) {
+			convertEthToWeth(isEth, tokenContract, _amt);
+		}
+
+		bool success = _transfer(market, _token, src, dest, _amt);
+		require(success, "transfer-asset-from-failed");
+
+		setUint(setId, _amt);
+
+		_eventName = "LogTransferAssetFrom(address,address,address,address,uint256,uint256,uint256)";
+		_eventParam = abi.encode(market, _token, src, dest, _amt, getId, setId);
+	}
 }
 
 contract ConnectV3Compound is CompoundIIIResolver {