From 98c6989b22a281e535f2173fb51920763bbe073d Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Wed, 4 May 2022 01:41:13 +0400
Subject: [PATCH] Revert "Revert "Added depositFrom in Basic""

This reverts commit d232ed5c72038305ad9237d9db01544adcc869e6.
---
 contracts/mainnet/connectors/basic/events.sol |  1 +
 contracts/mainnet/connectors/basic/main.sol   | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/contracts/mainnet/connectors/basic/events.sol b/contracts/mainnet/connectors/basic/events.sol
index 6ce85a22..14e60147 100644
--- a/contracts/mainnet/connectors/basic/events.sol
+++ b/contracts/mainnet/connectors/basic/events.sol
@@ -4,4 +4,5 @@ pragma solidity ^0.7.0;
 contract Events {
     event LogDeposit(address indexed erc20, uint256 tokenAmt, uint256 getId, uint256 setId);
     event LogWithdraw(address indexed erc20, uint256 tokenAmt, address indexed to, uint256 getId, uint256 setId);
+    event LogDepositFrom(address indexed erc20, uint256 tokenAmt, address indexed from, uint256 getId, uint256 setId);
 }
diff --git a/contracts/mainnet/connectors/basic/main.sol b/contracts/mainnet/connectors/basic/main.sol
index 383de493..b08e17bd 100644
--- a/contracts/mainnet/connectors/basic/main.sol
+++ b/contracts/mainnet/connectors/basic/main.sol
@@ -45,6 +45,37 @@ abstract contract BasicResolver is Events, DSMath, Basic {
         _eventParam = abi.encode(token, _amt, getId, setId);
     }
 
+    /**
+     * @dev Deposit Assets To Smart Account From any user.
+     * @notice Deposit a token to DSA from any user. 
+     * @param token The address of the token to deposit.<br>(For <b>ETH</b>: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE and need to pass `value` parameter equal to `amt` in cast function ```dsa.cast({..., value: amt})```.<br>For <b>ERC20</b>: Need to give allowance prior casting spells.)
+     * @param amt The amount of tokens to deposit. (For max: `uint256(-1)` (Not valid for ETH))
+     * @param from The address depositing the token.
+     * @param getId ID to retrieve amt.
+     * @param setId ID stores the amount of tokens deposited.
+     */
+    function depositFrom(
+        address token,
+        uint256 amt,
+        address from,
+        uint256 getId,
+        uint256 setId
+    ) public payable returns (string memory _eventName, bytes memory _eventParam) {
+        uint _amt = getUint(getId, amt);
+        if (token != ethAddr) {
+            IERC20 tokenContract = IERC20(token);
+            _amt = _amt == uint(-1) ? tokenContract.balanceOf(from) : _amt;
+            tokenContract.safeTransferFrom(from, address(this), _amt);
+        } else {
+            require(msg.value == _amt || _amt == uint(-1), "invalid-ether-amount");
+            _amt = msg.value;
+        }
+        setUint(setId, _amt);
+
+        _eventName = "LogDepositFrom(address,uint256,address,uint256,uint256)";
+        _eventParam = abi.encode(token, _amt, from, getId, setId);
+    }
+
     /**
      * @dev Withdraw Assets from Smart  Account
      * @notice Withdraw a token from DSA