From f27d75b89b06ce7d61aeebbdd2411c8443c8960f Mon Sep 17 00:00:00 2001
From: Shriya Tyagi <shriya243@gmail.com>
Date: Fri, 1 Sep 2023 17:05:29 +0400
Subject: [PATCH] feat: arbitrum contracts

---
 .../events.sol                                |  6 +++
 .../interface.sol                             |  6 +++
 .../approve-tokens-multisig-staging/main.sol  | 38 +++++++++++++++++++
 .../approve-tokens-multisig/events.sol        |  6 +++
 .../approve-tokens-multisig/interface.sol     |  6 +++
 .../approve-tokens-multisig/main.sol          | 38 +++++++++++++++++++
 .../approve-tokens-multisig-staging/main.sol  |  4 +-
 .../approve-tokens-multisig/main.sol          |  2 +-
 8 files changed, 103 insertions(+), 3 deletions(-)
 create mode 100644 contracts/arbitrum/connectors/approve-tokens-multisig-staging/events.sol
 create mode 100644 contracts/arbitrum/connectors/approve-tokens-multisig-staging/interface.sol
 create mode 100644 contracts/arbitrum/connectors/approve-tokens-multisig-staging/main.sol
 create mode 100644 contracts/arbitrum/connectors/approve-tokens-multisig/events.sol
 create mode 100644 contracts/arbitrum/connectors/approve-tokens-multisig/interface.sol
 create mode 100644 contracts/arbitrum/connectors/approve-tokens-multisig/main.sol

diff --git a/contracts/arbitrum/connectors/approve-tokens-multisig-staging/events.sol b/contracts/arbitrum/connectors/approve-tokens-multisig-staging/events.sol
new file mode 100644
index 00000000..3daaaa03
--- /dev/null
+++ b/contracts/arbitrum/connectors/approve-tokens-multisig-staging/events.sol
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+contract Events {
+    event LogApproveTokensMultisig(address[] tokenAddresses, uint256[] amounts, uint32 index);
+}
\ No newline at end of file
diff --git a/contracts/arbitrum/connectors/approve-tokens-multisig-staging/interface.sol b/contracts/arbitrum/connectors/approve-tokens-multisig-staging/interface.sol
new file mode 100644
index 00000000..3ae3daf3
--- /dev/null
+++ b/contracts/arbitrum/connectors/approve-tokens-multisig-staging/interface.sol
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+interface IAvoFactoryMultisig {
+    function computeAvocado(address owner_, uint32 index_) external view returns (address computedAddress_);
+}
\ No newline at end of file
diff --git a/contracts/arbitrum/connectors/approve-tokens-multisig-staging/main.sol b/contracts/arbitrum/connectors/approve-tokens-multisig-staging/main.sol
new file mode 100644
index 00000000..c1dcae0f
--- /dev/null
+++ b/contracts/arbitrum/connectors/approve-tokens-multisig-staging/main.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+import "./events.sol";
+import "./interface.sol";
+
+contract ApproveTokensResolver is Events {
+    using SafeERC20 for IERC20;
+
+    IAvoFactoryMultisig public constant AVO_FACTORY = IAvoFactoryMultisig(0x09389f927AE43F93958A4eBF2Bbb24B9fE88f6c5);
+
+    function approveTokens(
+        address[] calldata tokens,
+        uint256[] calldata amounts,
+        uint32 index
+    ) public returns (string memory _eventName, bytes memory _eventParam) {
+        require(tokens.length == amounts.length, "array-length-mismatch");
+
+        address avocadoAddress = AVO_FACTORY.computeAvocado(msg.sender, index);
+
+        for (uint256 i = 0; i < tokens.length; i++) {
+            uint256 allowanceAmount =
+                amounts[i] == type(uint256).max
+                    ? IERC20(tokens[i]).balanceOf(address(this))
+                    : amounts[i];
+            IERC20(tokens[i]).safeApprove(avocadoAddress, allowanceAmount);
+        }
+
+        _eventName = "LogApproveTokensMultisig(address[],uint256[],uint32)";
+        _eventParam = abi.encode(tokens, amounts, index);
+    }
+}
+
+contract ConnectV2ApproveTokensMultisigArbitrum is ApproveTokensResolver {
+    string constant public name = "ApproveTokens-v1";
+}
\ No newline at end of file
diff --git a/contracts/arbitrum/connectors/approve-tokens-multisig/events.sol b/contracts/arbitrum/connectors/approve-tokens-multisig/events.sol
new file mode 100644
index 00000000..3daaaa03
--- /dev/null
+++ b/contracts/arbitrum/connectors/approve-tokens-multisig/events.sol
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+contract Events {
+    event LogApproveTokensMultisig(address[] tokenAddresses, uint256[] amounts, uint32 index);
+}
\ No newline at end of file
diff --git a/contracts/arbitrum/connectors/approve-tokens-multisig/interface.sol b/contracts/arbitrum/connectors/approve-tokens-multisig/interface.sol
new file mode 100644
index 00000000..3ae3daf3
--- /dev/null
+++ b/contracts/arbitrum/connectors/approve-tokens-multisig/interface.sol
@@ -0,0 +1,6 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+interface IAvoFactoryMultisig {
+    function computeAvocado(address owner_, uint32 index_) external view returns (address computedAddress_);
+}
\ No newline at end of file
diff --git a/contracts/arbitrum/connectors/approve-tokens-multisig/main.sol b/contracts/arbitrum/connectors/approve-tokens-multisig/main.sol
new file mode 100644
index 00000000..6cf0cda2
--- /dev/null
+++ b/contracts/arbitrum/connectors/approve-tokens-multisig/main.sol
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.0;
+
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
+import "./events.sol";
+import "./interface.sol";
+
+contract ApproveTokensResolver is Events {
+    using SafeERC20 for IERC20;
+
+    IAvoFactoryMultisig public constant AVO_FACTORY = IAvoFactoryMultisig(0xe981E50c7c47F0Df8826B5ce3F533f5E4440e687);
+
+    function approveTokens(
+        address[] calldata tokens,
+        uint256[] calldata amounts,
+        uint32 index
+    ) public returns (string memory _eventName, bytes memory _eventParam) {
+        require(tokens.length == amounts.length, "array-length-mismatch");
+
+        address avocadoAddress = AVO_FACTORY.computeAvocado(msg.sender, index);
+
+        for (uint256 i = 0; i < tokens.length; i++) {
+            uint256 allowanceAmount =
+                amounts[i] == type(uint256).max
+                    ? IERC20(tokens[i]).balanceOf(address(this))
+                    : amounts[i];
+            IERC20(tokens[i]).safeApprove(avocadoAddress, allowanceAmount);
+        }
+
+        _eventName = "LogApproveTokensMultisig(address[],uint256[],uint32)";
+        _eventParam = abi.encode(tokens, amounts, index);
+    }
+}
+
+contract ConnectV2ApproveTokensMultisigArbitrum is ApproveTokensResolver {
+    string constant public name = "ApproveTokens-v1";
+}
\ No newline at end of file
diff --git a/contracts/avalanche/connectors/approve-tokens-multisig-staging/main.sol b/contracts/avalanche/connectors/approve-tokens-multisig-staging/main.sol
index 7dbec2e0..de092e62 100644
--- a/contracts/avalanche/connectors/approve-tokens-multisig-staging/main.sol
+++ b/contracts/avalanche/connectors/approve-tokens-multisig-staging/main.sol
@@ -9,7 +9,7 @@ import "./interface.sol";
 contract ApproveTokensResolver is Events {
     using SafeERC20 for IERC20;
 
-    IAvoFactoryMultisig public constant AVO_FACTORY = IAvoFactoryMultisig(0xe981E50c7c47F0Df8826B5ce3F533f5E4440e687);
+    IAvoFactoryMultisig public constant AVO_FACTORY = IAvoFactoryMultisig(0x09389f927AE43F93958A4eBF2Bbb24B9fE88f6c5);
 
     function approveTokens(
         address[] calldata tokens,
@@ -33,6 +33,6 @@ contract ApproveTokensResolver is Events {
     }
 }
 
-contract ConnectV2ApproveTokensAvalanche is ApproveTokensResolver {
+contract ConnectV2ApproveTokensMultisigAvalanche is ApproveTokensResolver {
     string constant public name = "ApproveTokens-v1";
 }
\ No newline at end of file
diff --git a/contracts/avalanche/connectors/approve-tokens-multisig/main.sol b/contracts/avalanche/connectors/approve-tokens-multisig/main.sol
index 7dbec2e0..2805b8cb 100644
--- a/contracts/avalanche/connectors/approve-tokens-multisig/main.sol
+++ b/contracts/avalanche/connectors/approve-tokens-multisig/main.sol
@@ -33,6 +33,6 @@ contract ApproveTokensResolver is Events {
     }
 }
 
-contract ConnectV2ApproveTokensAvalanche is ApproveTokensResolver {
+contract ConnectV2ApproveTokensMultisigAvalanche is ApproveTokensResolver {
     string constant public name = "ApproveTokens-v1";
 }
\ No newline at end of file