Repository: across-protocol/contracts
Pull request #1000: feat: add balance injection to multicall handler calls
Author: login: mrice32
Created: 2025-05-13T22:52:32Z | Merged: 2025-05-14T05:34:31Z

This is a bit clunky, but it adds a way to do balance injection for calls to multicall handler, so the calldata can use the updated balance.

It's done as a nested call to keep the MulticallHandler backwards compatible.


Diff:
diff --git a/contracts/handlers/MulticallHandler.sol b/contracts/handlers/MulticallHandler.sol
index 0f6c72503..7e0a70b3c 100644
--- a/contracts/handlers/MulticallHandler.sol
+++ b/contracts/handlers/MulticallHandler.sol
@@ -22,6 +22,11 @@ contract MulticallHandler is AcrossMessageHandler, ReentrancyGuard {
         uint256 value;
     }
 
+    struct Replacement {
+        address token;
+        uint256 offset;
+    }
+
     struct Instructions {
         //  Calls that will be attempted.
         Call[] calls;
@@ -40,6 +45,9 @@ contract MulticallHandler is AcrossMessageHandler, ReentrancyGuard {
     error CallReverted(uint256 index, Call[] calls);
     error NotSelf();
     error InvalidCall(uint256 index, Call[] calls);
+    error ReplacementCallFailed(bytes calldData);
+    error CalldataTooShort(uint256 callDataLength, uint256 offset);
+
 
     modifier onlySelf() {
         _requireSelf();
@@ -112,6 +120,49 @@ contract MulticallHandler is AcrossMessageHandler, ReentrancyGuard {
         }
     }
 
+    function makeCallWithBalance(address target, bytes memory callData, uint256 value, Replacement[] memory replacement) external onlySelf {
+        for (uint256 i = 0; i < replacement.length; i++) {
+            uint256 bal = 0;
+            if (replacement[i].token != address(0)) {
+                bal = IERC20(replacement[i].token).balanceOf(address(this));
+            } else {
+                bal = address(this).balance;
+
+                // If we're using the native balance, we assume that the caller wants to send the full value to the target.
+                value = bal;
+            }
+
+            // + 32 to skip the length of the calldata
+            uint256 offset = replacement[i].offset + 32;
+
+            // 32 has already been added to the offset, and the replacement value is 32 bytes long, so
+            // we don't need to add 32 here. We just directly compare the offset with the length of the calldata.
+            if (offset > callData.length) revert CalldataTooShort(callData.length, offset);
+
+            assembly ("memory-safe") {
+                // Get the pointer to the offset that the caller wants to overwrite.
+                let ptr := add(callData, offset)
+                // Get the current value at the offset.
+                let current := mload(ptr)
+                // Or the current value with the new value.
+                // Reasoning:
+                // - caller should 0-out any portion that they want overwritten.
+                // - if the caller is representing the balance in a smaller integer, like a uint160 or uint128,
+                //   the higher bits will be 0 and not overwrite any other data in the calldata assuming
+                //   the balance is small enough to fit in the smaller integer.
+                // - The catch: the smaller integer where they want to store the balance must end no
+                //   earlier than the 32nd byte in their calldata. Otherwise, this would require a
+                //   negative offset, which is not possible.
+                let val := or(bal, current)
+                // Store the new value at the offset.
+                mstore(ptr, val)
+            }
+        }
+
+        (bool success, ) = target.call{ value: value }(callData);
+        if (!success) revert ReplacementCallFailed(callData);
+    }
+
     function _requireSelf() internal view {
         // Must be called by this contract to ensure that this cannot be triggered without the explicit consent of the
         // depositor (for a valid relay).
diff --git a/package.json b/package.json
index c92a78a70..f16122c00 100644
--- a/package.json
+++ b/package.json
@@ -112,7 +112,7 @@
     "prettier": "^2.3.2",
     "prettier-plugin-solidity": "^1.0.0-beta.13",
     "pretty-quick": "^2.0.1",
-    "solhint": "^3.3.6",
+    "solhint": "^3.6.2",
     "solidity-coverage": "^0.7.16",
     "ts-mocha": "^10.0.0",
     "ts-node": "^10.1.0",
diff --git a/test/evm/foundry/local/MulticallHandler.t.sol b/test/evm/foundry/local/MulticallHandler.t.sol
index 3be3aea3d..a5d0ee9fc 100644
--- a/test/evm/foundry/local/MulticallHandler.t.sol
+++ b/test/evm/foundry/local/MulticallHandler.t.sol
@@ -20,10 +20,14 @@ contract MulticallHandlerTest is Test {
     bytes handlerTransferCall;
 
     TestTarget testTarget;
+    TokenTestTarget tokenTestTarget;
+    BalanceTestTarget balanceTestTarget;
 
     function setUp() public {
         handler = new MulticallHandler();
         testTarget = new TestTarget();
+        tokenTestTarget = new TokenTestTarget();
+        balanceTestTarget = new BalanceTestTarget();
 
         handlerBalanceCall = abi.encodeWithSelector(IERC20.balanceOf.selector, address(handler));
         handlerTransferCall = abi.encodeWithSelector(IERC20.transfer.selector, testFallbackRecipient, 5);
@@ -73,6 +77,251 @@ contract MulticallHandlerTest is Test {
         vm.expectRevert(abi.encodeWithSelector(MulticallHandler.InvalidCall.selector, 0, instructions.calls));
         handler.handleV3AcrossMessage(testToken, 0, address(0), abi.encode(instructions));
     }
+
+    /* Tests for makeCallWithBalance functionality */
+
+    function testMakeCallWithBalanceOnlySelf() public {
+        // Should revert when not called by the contract itself
+        bytes memory callData = abi.encodeWithSelector(TokenTestTarget.transferToken.selector, testToken, address(0x999), 100);
+        MulticallHandler.Replacement[] memory replacements = new MulticallHandler.Replacement[](0);
+
+        vm.expectRevert(MulticallHandler.NotSelf.selector);
+        handler.makeCallWithBalance(address(tokenTestTarget), callData, 0, replacements);
+    }
+
+    function testCalldataTooShort() public {
+        // Prepare a call with too short calldata
+        bytes memory shortCallData = abi.encodePacked(bytes4(0x12345678)); // Just a 4-byte selector
+
+        // Position beyond the calldata length
+        uint256 invalidOffset = 20; // This is past the end of our calldata
+
+        MulticallHandler.Replacement[] memory replacements = new MulticallHandler.Replacement[](1);
+        replacements[0] = MulticallHandler.Replacement({
+            token: testToken,
+            offset: invalidOffset
+        });
+
+        // Execute the test through a special call from the contract to itself to bypass onlySelf modifier
+        bytes memory selfCallData = abi.encodeWithSelector(
+            handler.makeCallWithBalance.selector,
+            address(tokenTestTarget),
+            shortCallData,
+            0,
+            replacements
+        );
+
+        // Create instructions to call the makeCallWithBalance function via handleV3AcrossMessage
+        instructions = MulticallHandler.Instructions({
+            calls: new MulticallHandler.Call[](1),
+            fallbackRecipient: address(0)
+        });
+        instructions.calls[0] = MulticallHandler.Call({
+            target: address(handler),
+            callData: selfCallData,
+            value: 0
+        });
+
+        // The error gets wrapped in a CallReverted error since it happens within a call initiated by 
+        // handleV3AcrossMessage, rather than directly
+        vm.expectRevert(abi.encodeWithSelector(MulticallHandler.CallReverted.selector, 0, instructions.calls));
+        handler.handleV3AcrossMessage(testToken, 0, address(0), abi.encode(instructions));
+    }
+
+    function testReplacementCallFailed() public {
+        // Prepare a call that will fail
+        bytes memory callData = abi.encodeWithSelector(
+            TokenTestTarget.failingFunction.selector
+        );
+
+        MulticallHandler.Replacement[] memory replacements = new MulticallHandler.Replacement[](0);
+
+        // Execute the test through a special call from the contract to itself to bypass onlySelf modifier
+        bytes memory selfCallData = abi.encodeWithSelector(
+            handler.makeCallWithBalance.selector,
+            address(tokenTestTarget),
+            callData,
+            0,
+            replacements
+        );
+
+        // Create instructions to call the makeCallWithBalance function via handleV3AcrossMessage
+        instructions = MulticallHandler.Instructions({
+            calls: new MulticallHandler.Call[](1),
+            fallbackRecipient: address(0)
+        });
+        instructions.calls[0] = MulticallHandler.Call({
+            target: address(handler),
+            callData: selfCallData,
+            value: 0
+        });
+
+        // The error gets wrapped in a CallReverted error since it happens within a call initiated by 
+        // handleV3AcrossMessage, rather than directly
+        vm.expectRevert(abi.encodeWithSelector(MulticallHandler.CallReverted.selector, 0, instructions.calls));
+        handler.handleV3AcrossMessage(testToken, 0, address(0), abi.encode(instructions));
+    }
+
+    function testMakeCallWithBalanceWithReplacement() public {
+
+        address target = address(new SimpleMockTarget());
+
+        MulticallHandler.Replacement[] memory replacements = new MulticallHandler.Replacement[](1);
+        replacements[0] = MulticallHandler.Replacement({
+            token: testToken,
+            offset: 4 // 4 bytes for selector
+        });
+
+        // Execute the test through a special call from the contract to itself to bypass onlySelf modifier
+        bytes memory selfCallData = abi.encodeWithSelector(
+            handler.makeCallWithBalance.selector,
+            address(target),
+            abi.encodeWithSelector(SimpleMockTarget.setValue.selector, 0),
+            0,
+            replacements
+        );
+
+        // Create instructions to call the makeCallWithBalance function via handleV3AcrossMessage
+        instructions = MulticallHandler.Instructions({
+            calls: new MulticallHandler.Call[](1),
+            fallbackRecipient: address(0)
+        });
+        instructions.calls[0] = MulticallHandler.Call({
+            target: address(handler),
+            callData: selfCallData,
+            value: 0
+        });
+
+        vm.expectCall(address(target), abi.encodeWithSelector(SimpleMockTarget.setValue.selector, 5));
+        handler.handleV3AcrossMessage(testToken, 0, address(0), abi.encode(instructions));
+
+        assertEq(SimpleMockTarget(target).getValue(), 5);
+    }
+    
+    function testMakeCallWithBalanceWithEthReplacement() public {
+        // Create a direct approach using a special check target that verifies both
+        // ETH transfer and value replacement
+        EthStorageTarget target = new EthStorageTarget();
+        
+        // Fund the handler with ETH
+        uint256 ethAmount = 2 ether;
+        vm.deal(address(handler), ethAmount);
+        
+        // Create a simple call to the target - we'll replace offset 36 which will hit
+        // the parameter after the selector+length in the abi encoding
+        bytes memory targetCallData = abi.encodeWithSelector(
+            EthStorageTarget.recordEthAndCheck.selector,
+            uint256(0) // Will be replaced with ETH balance
+        );
+        
+        // Set up the replacement structure using address(0) for ETH
+        MulticallHandler.Replacement[] memory replacements = new MulticallHandler.Replacement[](1);
+        replacements[0] = MulticallHandler.Replacement({
+            token: address(0), // Use ETH balance
+            offset: 4 // Position right after selector
+        });
+        
+        // Create the call to makeCallWithBalance
+        bytes memory selfCallData = abi.encodeWithSelector(
+            handler.makeCallWithBalance.selector,
+            address(target),
+            targetCallData,
+            0, // Will be replaced with all ETH
+            replacements
+        );
+        
+        // Set up instructions for handleV3AcrossMessage
+        instructions = MulticallHandler.Instructions({
+            calls: new MulticallHandler.Call[](1),
+            fallbackRecipient: address(0)
+        });
+        instructions.calls[0] = MulticallHandler.Call({
+            target: address(handler),
+            callData: selfCallData,
+            value: 0
+        });
+        
+        // Execute the test
+        handler.handleV3AcrossMessage(testToken, 0, address(0), abi.encode(instructions));
+        
+        // Our target contract already checked the values for us, but lets's verify again
+        assertEq(address(target).balance, ethAmount, "Target did not receive the handler's ETH");
+        assertEq(address(handler).balance, 0, "Handler still has ETH");
+        assertEq(target.storedValue(), ethAmount, "ETH balance was not correctly replaced in calldata");
+        assertTrue(target.checkPassed(), "Target contract's check failed");
+    }
+    
+    function testMakeCallWithMultipleReplacements() public {
+        // Create a new target for testing multiple replacements
+        MultipleReplacementTarget target = new MultipleReplacementTarget();
+        
+        // Set up mock token behavior
+        address token1 = address(0xABC); // First token
+        address token2 = testToken;      // Second token (reuse testToken for simplicity)
+        
+        // Define token balances
+        uint256 token1Balance = 1000;
+        uint256 token2Balance = 5;  // Same as the mocked balance of testToken
+        
+        // Set up mock for token1 balance call
+        bytes memory token1BalanceCall = abi.encodeWithSelector(
+            IERC20.balanceOf.selector, 
+            address(handler)
+        );
+        vm.mockCall(token1, token1BalanceCall, abi.encode(token1Balance));
+        
+        // Set up multiple replacements
+        MulticallHandler.Replacement[] memory replacements = new MulticallHandler.Replacement[](2);
+        replacements[0] = MulticallHandler.Replacement({
+            token: token1,
+            offset: 4 // Position for first parameter (right after selector)
+        });
+        replacements[1] = MulticallHandler.Replacement({
+            token: token2,
+            offset: 36 // Position for second parameter (4 + 32 bytes)
+        });
+        
+        // Create the call to makeCallWithBalance with two replacements
+        bytes memory selfCallData = abi.encodeWithSelector(
+            handler.makeCallWithBalance.selector,
+            address(target),
+            abi.encodeWithSelector(
+                MultipleReplacementTarget.setValues.selector, 
+                uint256(0),  // Will be replaced with token1 balance
+                uint256(0)   // Will be replaced with token2 balance
+            ),
+            0, // No ETH value needed
+            replacements
+        );
+        
+        // Set up instructions for handleV3AcrossMessage
+        instructions = MulticallHandler.Instructions({
+            calls: new MulticallHandler.Call[](1),
+            fallbackRecipient: address(0)
+        });
+        instructions.calls[0] = MulticallHandler.Call({
+            target: address(handler),
+            callData: selfCallData,
+            value: 0
+        });
+        
+        // Expect the target to be called with both token balances as arguments
+        vm.expectCall(
+            address(target), 
+            abi.encodeWithSelector(
+                MultipleReplacementTarget.setValues.selector, 
+                token1Balance, 
+                token2Balance
+            )
+        );
+        
+        // Execute the test
+        handler.handleV3AcrossMessage(testToken, 0, address(0), abi.encode(instructions));
+        
+        // Verify both values were set correctly in the target
+        assertEq(target.value1(), token1Balance, "Token1 balance not correctly replaced");
+        assertEq(target.value2(), token2Balance, "Token2 balance not correctly replaced");
+    }
 }
 
 contract TestTarget {
@@ -82,3 +331,96 @@ contract TestTarget {
         return data;
     }
 }
+
+contract TokenTestTarget {
+    function transferToken(address token, address recipient, uint256 amount) public returns (bool) {
+        return IERC20(token).transfer(recipient, amount);
+    }
+    
+    function failingFunction() public pure {
+        revert("This function always fails");
+    }
+}
+
+contract BalanceTestTarget {
+    uint256 private _storedAmount;
+    
+    function storeAmount(uint256 amount) public payable {
+        _storedAmount = amount;
+    }
+    
+    function getStoredAmount() public view returns (uint256) {
+        return _storedAmount;
+    }
+}
+
+contract SimpleMockTarget {
+    uint256 private _value;
+    
+    function setValue(uint256 value) public {
+        _value = value;
+    }
+    
+    function getValue() public view returns (uint256) {
+        return _value;
+    }
+}
+
+
+
+/**
+ * @notice Target for ETH replacement testing that verifies both
+ * replacement value and ETH sending in the same call
+ */
+contract EthStorageTarget {
+    uint256 private _storedValue;
+    bool private _checkPassed;
+    
+    /**
+     * @notice Record the ETH balance as parameter and verify ETH was sent
+     * This function also verifies that the received value matches both the message
+     * value and the first parameter
+     * @param expectedAmount The amount we expect to receive, should be replaced with handler's ETH balance
+     */
+    function recordEthAndCheck(uint256 expectedAmount) external payable {
+        // Store the received parameter
+        _storedValue = expectedAmount;
+        
+        // Check if the expected value matches what was sent (handler's full ETH balance)
+        // AND if the msg.value matches the expected amount (handler's full ETH balance)
+        _checkPassed = (expectedAmount == msg.value && msg.value > 0);
+    }
+    
+    // Getters for test validation
+    function storedValue() external view returns (uint256) {
+        return _storedValue;
+    }
+    
+    function checkPassed() external view returns (bool) {
+        return _checkPassed;
+    }
+    
+    // Allow receiving ETH
+    receive() external payable {}
+}
+
+
+/**
+ * @notice Contract for testing multiple replacements in a single call
+ */
+contract MultipleReplacementTarget {
+    uint256 public value1;
+    uint256 public value2;
+    
+    /**
+     * @notice Set two separate values
+     * @param _value1 First value to store
+     * @param _value2 Second value to store
+     */
+    function setValues(uint256 _value1, uint256 _value2) external {
+        value1 = _value1;
+        value2 = _value2;
+    }
+}
+
+
diff --git a/yarn.lock b/yarn.lock
index cf67bfcdf..f7ca73765 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3156,13 +3156,20 @@
     rpc-websockets "^9.0.2"
     superstruct "^2.0.2"
 
-"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1":
+"@solidity-parser/parser@^0.14.0":
   version "0.14.1"
   resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.1.tgz#179afb29f4e295a77cc141151f26b3848abc3c46"
   integrity sha512-eLjj2L6AuQjBB6s/ibwCAc0DwrR5Ge+ys+wgWo+bviU7fV2nTMQhU63CGaDKXg9iTmMxwhkyoggdIR7ZGRfMgw==
   dependencies:
     antlr4ts "^0.5.0-alpha.4"
 
+"@solidity-parser/parser@^0.16.0":
+  version "0.16.2"
+  resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa"
+  integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==
+  dependencies:
+    antlr4ts "^0.5.0-alpha.4"
+
 "@sqltools/formatter@^1.2.5":
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12"
@@ -4127,7 +4134,7 @@ accepts@~1.3.8:
     mime-types "~2.1.34"
     negotiator "0.6.3"
 
-acorn-jsx@^5.0.0, acorn-jsx@^5.3.1, acorn-jsx@^5.3.2:
+acorn-jsx@^5.3.1, acorn-jsx@^5.3.2:
   version "5.3.2"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
   integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
@@ -4142,11 +4149,6 @@ acorn@7.1.1:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
   integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
 
-acorn@^6.0.7:
-  version "6.4.2"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
-  integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
-
 acorn@^7.4.0:
   version "7.4.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
@@ -4204,7 +4206,7 @@ aggregate-error@^3.0.0:
     clean-stack "^2.0.0"
     indent-string "^4.0.0"
 
-ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1:
+ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6:
   version "6.12.6"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
   integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -4239,11 +4241,6 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1:
   resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
   integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
 
-ansi-escapes@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
-  integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
-
 ansi-escapes@^4.3.0:
   version "4.3.2"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
@@ -4290,10 +4287,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
   dependencies:
     color-convert "^2.0.1"
 
-antlr4@4.7.1:
-  version "4.7.1"
-  resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773"
-  integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==
+antlr4@^4.11.0:
+  version "4.13.2"
+  resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d"
+  integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==
 
 antlr4ts@^0.5.0-alpha.4:
   version "0.5.0-alpha.4"
@@ -4506,15 +4503,10 @@ assign-symbols@^1.0.0:
   resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
   integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
 
-ast-parents@0.0.1:
+ast-parents@^0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3"
-  integrity sha1-UI/Q8F0MSHddnszaLhdEIyYejdM=
-
-astral-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
-  integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+  integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==
 
 astral-regex@^2.0.0:
   version "2.0.0"
@@ -5813,25 +5805,6 @@ call-bound@^1.0.3:
     call-bind-apply-helpers "^1.0.1"
     get-intrinsic "^1.2.6"
 
-caller-callsite@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
-  integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
-  dependencies:
-    callsites "^2.0.0"
-
-caller-path@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
-  integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
-  dependencies:
-    caller-callsite "^2.0.0"
-
-callsites@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
-  integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-
 callsites@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
@@ -5973,7 +5946,7 @@ chalk@^1.1.3:
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
-chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
+chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -6024,11 +5997,6 @@ change-case@3.0.2:
     upper-case "^1.1.1"
     upper-case-first "^1.1.0"
 
-chardet@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
-  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
-
 "charenc@>= 0.0.1":
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
@@ -6212,13 +6180,6 @@ clean-stack@^2.0.0:
   resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
   integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
 
-cli-cursor@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
-  integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
-  dependencies:
-    restore-cursor "^2.0.0"
-
 cli-highlight@^2.1.11:
   version "2.1.11"
   resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf"
@@ -6241,11 +6202,6 @@ cli-table3@^0.5.0:
   optionalDependencies:
     colors "^1.1.2"
 
-cli-width@^2.0.0:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
-  integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
-
 cliui@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
@@ -6411,16 +6367,16 @@ command-line-usage@^6.1.0:
     table-layout "^1.0.2"
     typical "^5.2.0"
 
-commander@2.18.0:
-  version "2.18.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
-  integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==
-
 commander@3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e"
   integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==
 
+commander@^10.0.0:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+  integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
 commander@^12.1.0:
   version "12.1.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3"
@@ -6590,16 +6546,6 @@ cors@^2.8.1:
     object-assign "^4"
     vary "^1"
 
-cosmiconfig@^5.0.7:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
-  integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
-  dependencies:
-    import-fresh "^2.0.0"
-    is-directory "^0.3.1"
-    js-yaml "^3.13.1"
-    parse-json "^4.0.0"
-
 cosmiconfig@^7.0.0:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
@@ -6611,6 +6557,16 @@ cosmiconfig@^7.0.0:
     path-type "^4.0.0"
     yaml "^1.10.0"
 
+cosmiconfig@^8.0.0:
+  version "8.3.6"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3"
+  integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==
+  dependencies:
+    import-fresh "^3.3.0"
+    js-yaml "^4.1.0"
+    parse-json "^5.2.0"
+    path-type "^4.0.0"
+
 cpu-features@~0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.4.tgz#0023475bb4f4c525869c162e4108099e35bf19d8"
@@ -7757,14 +7713,6 @@ eslint-plugin-promise@^5.1.0:
   resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971"
   integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw==
 
-eslint-scope@^4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
-  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
-  dependencies:
-    esrecurse "^4.1.0"
-    estraverse "^4.1.1"
-
 eslint-scope@^5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
@@ -7773,13 +7721,6 @@ eslint-scope@^5.1.1:
     esrecurse "^4.3.0"
     estraverse "^4.1.1"
 
-eslint-utils@^1.3.1:
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
-  integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
-  dependencies:
-    eslint-visitor-keys "^1.1.0"
-
 eslint-utils@^2.0.0, eslint-utils@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
@@ -7794,7 +7735,7 @@ eslint-utils@^3.0.0:
   dependencies:
     eslint-visitor-keys "^2.0.0"
 
-eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
+eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
   integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
@@ -7809,48 +7750,6 @@ eslint-visitor-keys@^3.3.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
   integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
 
-eslint@^5.6.0:
-  version "5.16.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
-  integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
-  dependencies:
-    "@babel/code-frame" "^7.0.0"
-    ajv "^6.9.1"
-    chalk "^2.1.0"
-    cross-spawn "^6.0.5"
-    debug "^4.0.1"
-    doctrine "^3.0.0"
-    eslint-scope "^4.0.3"
-    eslint-utils "^1.3.1"
-    eslint-visitor-keys "^1.0.0"
-    espree "^5.0.1"
-    esquery "^1.0.1"
-    esutils "^2.0.2"
-    file-entry-cache "^5.0.1"
-    functional-red-black-tree "^1.0.1"
-    glob "^7.1.2"
-    globals "^11.7.0"
-    ignore "^4.0.6"
-    import-fresh "^3.0.0"
-    imurmurhash "^0.1.4"
-    inquirer "^6.2.2"
-    js-yaml "^3.13.0"
-    json-stable-stringify-without-jsonify "^1.0.1"
-    levn "^0.3.0"
-    lodash "^4.17.11"
-    minimatch "^3.0.4"
-    mkdirp "^0.5.1"
-    natural-compare "^1.4.0"
-    optionator "^0.8.2"
-    path-is-inside "^1.0.2"
-    progress "^2.0.0"
-    regexpp "^2.0.1"
-    semver "^5.5.1"
-    strip-ansi "^4.0.0"
-    strip-json-comments "^2.0.1"
-    table "^5.2.3"
-    text-table "^0.2.0"
-
 eslint@^7.29.0:
   version "7.32.0"
   resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
@@ -7907,15 +7806,6 @@ esniff@^2.0.1:
     event-emitter "^0.3.5"
     type "^2.7.2"
 
-espree@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
-  integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
-  dependencies:
-    acorn "^6.0.7"
-    acorn-jsx "^5.0.0"
-    eslint-visitor-keys "^1.0.0"
-
 espree@^7.3.0, espree@^7.3.1:
   version "7.3.1"
   resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
@@ -7944,14 +7834,14 @@ esprima@^4.0.0, esprima@^4.0.1:
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
-esquery@^1.0.1, esquery@^1.4.0:
+esquery@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
   integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
   dependencies:
     estraverse "^5.1.0"
 
-esrecurse@^4.1.0, esrecurse@^4.3.0:
+esrecurse@^4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
   integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
@@ -8774,15 +8664,6 @@ extend@^3.0.2, extend@~3.0.2:
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
-external-editor@^3.0.3:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
-  integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
-  dependencies:
-    chardet "^0.7.0"
-    iconv-lite "^0.4.24"
-    tmp "^0.0.33"
-
 extglob@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@@ -8836,6 +8717,11 @@ fast-diff@^1.1.2:
   resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
   integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
 
+fast-diff@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
+  integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
 fast-fifo@^1.0.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.0.tgz#03e381bcbfb29932d7c3afde6e15e83e05ab4d8b"
@@ -8896,20 +8782,6 @@ fetch-ponyfill@^4.0.0:
   dependencies:
     node-fetch "~1.7.1"
 
-figures@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
-  integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
-  dependencies:
-    escape-string-regexp "^1.0.5"
-
-file-entry-cache@^5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
-  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
-  dependencies:
-    flat-cache "^2.0.1"
-
 file-entry-cache@^6.0.1:
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
@@ -9027,15 +8899,6 @@ find-yarn-workspace-root@^2.0.0:
   dependencies:
     micromatch "^4.0.2"
 
-flat-cache@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
-  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
-  dependencies:
-    flatted "^2.0.0"
-    rimraf "2.6.3"
-    write "1.0.3"
-
 flat-cache@^3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -9056,11 +8919,6 @@ flat@^5.0.2:
   resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
   integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
 
-flatted@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
-  integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
-
 flatted@^3.1.0:
   version "3.2.5"
   resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
@@ -9588,7 +9446,7 @@ glob@^8.0.0:
     minimatch "^5.0.1"
     once "^1.3.0"
 
-glob@^8.1.0:
+glob@^8.0.3, glob@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
   integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
@@ -9623,7 +9481,7 @@ global@~4.4.0:
     min-document "^2.19.0"
     process "^0.11.10"
 
-globals@^11.1.0, globals@^11.7.0:
+globals@^11.1.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
@@ -10276,7 +10134,7 @@ husky@^4.2.3:
     slash "^3.0.0"
     which-pm-runs "^1.0.0"
 
-iconv-lite@0.4.24, iconv-lite@^0.4.24:
+iconv-lite@0.4.24:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -10312,6 +10170,11 @@ ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
   integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
 
+ignore@^5.2.4:
+  version "5.3.2"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+  integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
 immediate@^3.2.3:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
@@ -10327,14 +10190,6 @@ immutable@^4.0.0-rc.12:
   resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23"
   integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==
 
-import-fresh@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
-  integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
-  dependencies:
-    caller-path "^2.0.0"
-    resolve-from "^3.0.0"
-
 import-fresh@^3.0.0, import-fresh@^3.2.1:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -10343,6 +10198,14 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
     parent-module "^1.0.0"
     resolve-from "^4.0.0"
 
+import-fresh@^3.3.0:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf"
+  integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
 imul@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9"
@@ -10381,25 +10244,6 @@ ini@^1.3.5, ini@~1.3.0:
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
   integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
 
-inquirer@^6.2.2:
-  version "6.5.2"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
-  integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
-  dependencies:
-    ansi-escapes "^3.2.0"
-    chalk "^2.4.2"
-    cli-cursor "^2.1.0"
-    cli-width "^2.0.0"
-    external-editor "^3.0.3"
-    figures "^2.0.0"
-    lodash "^4.17.12"
-    mute-stream "0.0.7"
-    run-async "^2.2.0"
-    rxjs "^6.4.0"
-    string-width "^2.1.0"
-    strip-ansi "^5.1.0"
-    through "^2.3.6"
-
 internal-slot@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
@@ -10727,11 +10571,6 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
     is-data-descriptor "^1.0.0"
     kind-of "^6.0.2"
 
-is-directory@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
-  integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
-
 is-docker@^2.0.0:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
@@ -11211,7 +11050,7 @@ js-yaml@3.13.1:
     argparse "^1.0.7"
     esprima "^4.0.0"
 
-js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1:
+js-yaml@3.x, js-yaml@^3.13.1:
   version "3.14.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
   integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
@@ -11226,7 +11065,7 @@ js-yaml@4.0.0:
   dependencies:
     argparse "^2.0.1"
 
-js-yaml@4.1.0:
+js-yaml@4.1.0, js-yaml@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
   integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
@@ -11298,11 +11137,6 @@ json-buffer@3.0.1:
   resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
   integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
 
-json-parse-better-errors@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
-  integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-
 json-parse-even-better-errors@^2.3.0:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
@@ -11757,14 +11591,6 @@ levelup@^1.2.1:
     semver "~5.4.1"
     xtend "~4.0.0"
 
-levn@^0.3.0, levn@~0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
-  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
-  dependencies:
-    prelude-ls "~1.1.2"
-    type-check "~0.3.2"
-
 levn@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -11773,6 +11599,14 @@ levn@^0.4.1:
     prelude-ls "^1.2.1"
     type-check "~0.4.0"
 
+levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
 libp2p-crypto@^0.19.0:
   version "0.19.7"
   resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.19.7.tgz#e96a95bd430e672a695209fe0fbd2bcbd348bc35"
@@ -11908,7 +11742,7 @@ lodash@4.17.20:
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
   integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
 
-lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4:
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -12296,11 +12130,6 @@ mime@^3.0.0:
   resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7"
   integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==
 
-mimic-fn@^1.0.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
-  integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
-
 mimic-fn@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -12779,11 +12608,6 @@ murmurhash3js-revisited@^3.0.0:
   resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869"
   integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==
 
-mute-stream@0.0.7:
-  version "0.0.7"
-  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
-  integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
-
 mz@^2.4.0:
   version "2.7.0"
   resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@@ -13327,13 +13151,6 @@ one-time@^1.0.0:
   dependencies:
     fn.name "1.x.x"
 
-onetime@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
-  integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
-  dependencies:
-    mimic-fn "^1.0.0"
-
 onetime@^5.1.0:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
@@ -13354,7 +13171,7 @@ opencollective-postinstall@^2.0.2:
   resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
   integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==
 
-optionator@^0.8.1, optionator@^0.8.2:
+optionator@^0.8.1:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
   integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -13563,15 +13380,7 @@ parse-json@^2.2.0:
   dependencies:
     error-ex "^1.2.0"
 
-parse-json@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
-  integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
-  dependencies:
-    error-ex "^1.3.1"
-    json-parse-better-errors "^1.0.1"
-
-parse-json@^5.0.0:
+parse-json@^5.0.0, parse-json@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
   integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@@ -13688,11 +13497,6 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-is-inside@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
-  integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
-
 path-key@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
@@ -13890,6 +13694,11 @@ please-upgrade-node@^3.2.0:
   dependencies:
     semver-compare "^1.0.0"
 
+pluralize@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+  integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
 posix-character-classes@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
@@ -14032,12 +13841,7 @@ prettier-plugin-solidity@^1.0.0-beta.13:
     solidity-comments-extractor "^0.0.7"
     string-width "^4.2.3"
 
-prettier@^1.14.3:
-  version "1.19.1"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
-  integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
-
-prettier@^2.1.2, prettier@^2.3.1, prettier@^2.7.1:
+prettier@^2.1.2, prettier@^2.3.1, prettier@^2.7.1, prettier@^2.8.3:
   version "2.8.8"
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
   integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
@@ -14630,11 +14434,6 @@ regexp.prototype.flags@^1.4.3:
     define-properties "^1.2.0"
     functions-have-names "^1.2.3"
 
-regexpp@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
-  integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
-
 regexpp@^3.0.0, regexpp@^3.1.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
@@ -14842,14 +14641,6 @@ responselike@^2.0.0:
   dependencies:
     lowercase-keys "^2.0.0"
 
-restore-cursor@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
-  integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
-  dependencies:
-    onetime "^2.0.0"
-    signal-exit "^3.0.2"
-
 resumer@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
@@ -14890,13 +14681,6 @@ reusify@^1.0.4:
   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@2.6.3:
-  version "2.6.3"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
-  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
-  dependencies:
-    glob "^7.1.3"
-
 rimraf@^2.2.8, rimraf@^2.6.3:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@@ -14947,11 +14731,6 @@ rpc-websockets@^9.0.2:
     bufferutil "^4.0.1"
     utf-8-validate "^5.0.2"
 
-run-async@^2.2.0:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
-  integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
-
 run-parallel-limit@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba"
@@ -14978,7 +14757,7 @@ rustbn.js@~0.2.0:
   resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
   integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
 
-rxjs@6, rxjs@^6.4.0:
+rxjs@6:
   version "6.6.7"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
   integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
@@ -15134,7 +14913,7 @@ semver-regex@^3.1.2:
   resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.4.tgz#13053c0d4aa11d070a2f2872b6b1e3ae1e1971b4"
   integrity sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0:
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -15177,6 +14956,11 @@ semver@^7.5.1:
   dependencies:
     lru-cache "^6.0.0"
 
+semver@^7.5.2:
+  version "7.7.2"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
+  integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
+
 semver@~5.4.1:
   version "5.4.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
@@ -15449,15 +15233,6 @@ slash@^3.0.0:
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
-slice-ansi@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
-  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
-  dependencies:
-    ansi-styles "^3.2.0"
-    astral-regex "^1.0.0"
-    is-fullwidth-code-point "^2.0.0"
-
 slice-ansi@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
@@ -15544,27 +15319,30 @@ solc@^0.6.3:
     semver "^5.5.0"
     tmp "0.0.33"
 
-solhint@^3.3.6:
-  version "3.3.7"
-  resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.3.7.tgz#b5da4fedf7a0fee954cb613b6c55a5a2b0063aa7"
-  integrity sha512-NjjjVmXI3ehKkb3aNtRJWw55SUVJ8HMKKodwe0HnejA+k0d2kmhw7jvpa+MCTbcEgt8IWSwx0Hu6aCo/iYOZzQ==
+solhint@^3.6.2:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe"
+  integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==
   dependencies:
-    "@solidity-parser/parser" "^0.14.1"
-    ajv "^6.6.1"
-    antlr4 "4.7.1"
-    ast-parents "0.0.1"
-    chalk "^2.4.2"
-    commander "2.18.0"
-    cosmiconfig "^5.0.7"
-    eslint "^5.6.0"
-    fast-diff "^1.1.2"
-    glob "^7.1.3"
-    ignore "^4.0.6"
-    js-yaml "^3.12.0"
-    lodash "^4.17.11"
-    semver "^6.3.0"
+    "@solidity-parser/parser" "^0.16.0"
+    ajv "^6.12.6"
+    antlr4 "^4.11.0"
+    ast-parents "^0.0.1"
+    chalk "^4.1.2"
+    commander "^10.0.0"
+    cosmiconfig "^8.0.0"
+    fast-diff "^1.2.0"
+    glob "^8.0.3"
+    ignore "^5.2.4"
+    js-yaml "^4.1.0"
+    lodash "^4.17.21"
+    pluralize "^8.0.0"
+    semver "^7.5.2"
+    strip-ansi "^6.0.1"
+    table "^6.8.1"
+    text-table "^0.2.0"
   optionalDependencies:
-    prettier "^1.14.3"
+    prettier "^2.8.3"
 
 solidity-ast@^0.4.15:
   version "0.4.30"
@@ -15839,7 +15617,7 @@ string-width@^1.0.1:
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
-"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1:
+"string-width@^1.0.2 || 2", string-width@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
   integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@@ -15993,7 +15771,7 @@ strip-indent@^2.0.0:
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
   integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
 
-strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
+strip-json-comments@2.0.1, strip-json-comments@~2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
   integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
@@ -16114,16 +15892,6 @@ table-layout@^1.0.2:
     typical "^5.2.0"
     wordwrapjs "^4.0.0"
 
-table@^5.2.3:
-  version "5.4.6"
-  resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
-  integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
-  dependencies:
-    ajv "^6.10.2"
-    lodash "^4.17.14"
-    slice-ansi "^2.1.0"
-    string-width "^3.0.0"
-
 table@^6.0.9:
   version "6.8.0"
   resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
@@ -16146,6 +15914,17 @@ table@^6.8.0:
     string-width "^4.2.3"
     strip-ansi "^6.0.1"
 
+table@^6.8.1:
+  version "6.9.0"
+  resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5"
+  integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==
+  dependencies:
+    ajv "^8.0.1"
+    lodash.truncate "^4.4.2"
+    slice-ansi "^4.0.0"
+    string-width "^4.2.3"
+    strip-ansi "^6.0.1"
+
 taffydb@2.6.2:
   version "2.6.2"
   resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268"
@@ -16317,7 +16096,7 @@ through2@^2.0.3:
     readable-stream "~2.3.6"
     xtend "~4.0.1"
 
-"through@>=2.2.7 <3", through@^2.3.6, through@~2.3.4, through@~2.3.8:
+"through@>=2.2.7 <3", through@~2.3.4, through@~2.3.8:
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
@@ -18557,13 +18336,6 @@ wrappy@1:
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-write@1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
-  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
-  dependencies:
-    mkdirp "^0.5.1"
-
 ws@7.4.6:
   version "7.4.6"
   resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"


Reviews:
user: login: bmzig
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T23:43:10Z
user: login: mrice32
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T00:05:30Z
user: login: mrice32
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T00:14:16Z
user: login: mrice32
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-14T02:12:50Z

Review comments:
diff_hunk: @@ -112,6 +120,44 @@ contract MulticallHandler is AcrossMessageHandler, ReentrancyGuard {
         }
     }
 
+    function makeCallWithBalance(address target, bytes memory callData, uint256 value, Replacement[] memory replacement) external onlySelf {
+        for (uint256 i = 0; i < replacement.length; i++) {
+            uint256 bal = 0;
+            if (replacement[i].token != address(0)) {
+                bal = IERC20(replacement[i].token).balanceOf(address(this));
+            } else {
+                bal = address(this).balance;
+
+                // If we're using the native balance, we assume that the caller wants to send the full value to the target.
+                value = bal;
+            }
+
+            uint256 offset = replacement[i].offset;
+
+            if (offset + 32 > callData.length) revert CalldataTooShort(callData.length, offset);
+
+            assembly ("memory-safe") {
+                // Get the pointer to the offset that the caller wants to overwrite.
+                let ptr := add(callData, offset)
+                // Get the current value at the offset.
+                let current := mload(ptr)
+                // Or the current value with the new value.
+                // Reasoning:
+                // - caller should 0-out any portion that they want overwritten.
+                // - if the caller is storing the balance in a smaller integer, like a uint160 or uint128,
+                //   the higher bits will be 0 and not overwrite any other data in the calldata
+                // - The catch: the smaller integer where they want to store the balance must end no
path: contracts/handlers/MulticallHandler.sol
user: login: bmzig
body: I don't understand this comment. Is this saying that it might not overwrite the calldata properly if `bal` exceeds the maximum value for the function input we are trying to call and our current calldata is not inputting the max? e.g. for calling a function with a u160 input, we could have `bal=2^160` while the calldata is specifying `2^120` or something, and we will just end up calling the function with input `2^120` and not `2^160-1`?
created_at: 2025-05-13T23:43:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -112,6 +120,44 @@ contract MulticallHandler is AcrossMessageHandler, ReentrancyGuard {
         }
     }
 
+    function makeCallWithBalance(address target, bytes memory callData, uint256 value, Replacement[] memory replacement) external onlySelf {
+        for (uint256 i = 0; i < replacement.length; i++) {
+            uint256 bal = 0;
+            if (replacement[i].token != address(0)) {
+                bal = IERC20(replacement[i].token).balanceOf(address(this));
+            } else {
+                bal = address(this).balance;
+
+                // If we're using the native balance, we assume that the caller wants to send the full value to the target.
+                value = bal;
+            }
+
+            uint256 offset = replacement[i].offset;
+
+            if (offset + 32 > callData.length) revert CalldataTooShort(callData.length, offset);
+
+            assembly ("memory-safe") {
+                // Get the pointer to the offset that the caller wants to overwrite.
+                let ptr := add(callData, offset)
+                // Get the current value at the offset.
+                let current := mload(ptr)
+                // Or the current value with the new value.
+                // Reasoning:
+                // - caller should 0-out any portion that they want overwritten.
+                // - if the caller is storing the balance in a smaller integer, like a uint160 or uint128,
+                //   the higher bits will be 0 and not overwrite any other data in the calldata
+                // - The catch: the smaller integer where they want to store the balance must end no
path: contracts/handlers/MulticallHandler.sol
user: login: mrice32
body: Yeah, this comment could be improved.

If the balance is too large, that's one possible issue. That would result in just overwriting bytes that you didn't intend to overwrite (the bytes for the value that precedes it).

The comment is getting at something different:
- Let's say I want to replace a `uint160` (20 bytes) with the balance.
- Let's say I have a function that takes a single packed arg. Something like `myFun(bytes32 packedData)`.
- If the `uint160` balance is encoded in the 20 bytes of the `bytes32`, then what value do I use as my offset?
- I want the balance value to _end_ at the 24th byte (4 byte selector + 20 bytes of integer).
- That would mean I need an offset of -8, which I can't express.

There may be a workaround to make this work... we could allow negative offsets and perform a `shl` on the balance by that number of bytes and replacing at offset 0.
created_at: 2025-05-14T00:05:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -112,6 +120,44 @@ contract MulticallHandler is AcrossMessageHandler, ReentrancyGuard {
         }
     }
 
+    function makeCallWithBalance(address target, bytes memory callData, uint256 value, Replacement[] memory replacement) external onlySelf {
+        for (uint256 i = 0; i < replacement.length; i++) {
+            uint256 bal = 0;
+            if (replacement[i].token != address(0)) {
+                bal = IERC20(replacement[i].token).balanceOf(address(this));
+            } else {
+                bal = address(this).balance;
+
+                // If we're using the native balance, we assume that the caller wants to send the full value to the target.
+                value = bal;
+            }
+
+            uint256 offset = replacement[i].offset;
+
+            if (offset + 32 > callData.length) revert CalldataTooShort(callData.length, offset);
+
+            assembly ("memory-safe") {
+                // Get the pointer to the offset that the caller wants to overwrite.
+                let ptr := add(callData, offset)
+                // Get the current value at the offset.
+                let current := mload(ptr)
+                // Or the current value with the new value.
+                // Reasoning:
+                // - caller should 0-out any portion that they want overwritten.
+                // - if the caller is storing the balance in a smaller integer, like a uint160 or uint128,
+                //   the higher bits will be 0 and not overwrite any other data in the calldata
+                // - The catch: the smaller integer where they want to store the balance must end no
path: contracts/handlers/MulticallHandler.sol
user: login: mrice32
body: https://github.com/across-protocol/contracts/pull/1000/commits/b9b093e62a994a3ea304241834a2ac46da756c8f
created_at: 2025-05-14T00:14:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -113,7 +113,7 @@
     "prettier": "^2.3.2",
     "prettier-plugin-solidity": "^1.0.0-beta.13",
     "pretty-quick": "^2.0.1",
-    "solhint": "^3.3.6",
+    "solhint": "^3.6.2",
path: package.json
user: login: mrice32
body: Solhint couldn't handle "memory-safe" assembly syntax.
created_at: 2025-05-14T02:12:47Z
author_association: CONTRIBUTOR

PR comments:
user: login: socket-security[bot]
created_at: 2025-05-14T00:43:43Z
body: **Review the following changes in direct dependencies.** Learn more about [Socket for GitHub](https://socket.dev?utm_medium=gh).

<table>
<thead>
<tr>
<th>Diff</th>
<th width="200px">Package</th>
<th align="center" width="100px">Supply Chain<br/>Security</th>
<th align="center" width="100px">Vulnerability</th>
<th align="center" width="100px">Quality</th>
<th align="center" width="100px">Maintenance</th>
<th align="center" width="100px">License</th>
</tr>
</thead>
<tbody>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14048"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14048">text-hex@​1.0.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14048"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14048"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14048"><img src="https://github-app-statics.socket.dev/score-65.svg" title="Quality" width="40" height="40" alt="65"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14048"><img src="https://github-app-statics.socket.dev/score-78.svg" title="Maintenance" width="40" height="40" alt="78"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14048"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38202"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38202">xhr-request@​1.1.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38202"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Supply Chain Security" width="40" height="40" alt="99"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38202"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38202"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38202"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38202"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38040"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38040">mkdirp-promise@​5.0.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38040"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38040"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38040"><img src="https://github-app-statics.socket.dev/score-82.svg" title="Quality" width="40" height="40" alt="82"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38040"><img src="https://github-app-statics.socket.dev/score-76.svg" title="Maintenance" width="40" height="40" alt="76"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38040"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14047"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14047">color@​3.2.1</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14047"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14047"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14047"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14047"><img src="https://github-app-statics.socket.dev/score-77.svg" title="Maintenance" width="40" height="40" alt="77"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=14047"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64151"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64151">web3-providers-ipc@​1.7.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64151"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64151"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64151"><img src="https://github-app-statics.socket.dev/score-80.svg" title="Quality" width="40" height="40" alt="80"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64151"><img src="https://github-app-statics.socket.dev/score-89.svg" title="Maintenance" width="40" height="40" alt="89"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64151"><img src="https://github-app-statics.socket.dev/score-70.svg" title="License" width="40" height="40" alt="70"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=30727"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=30727">mock-fs@​4.14.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=30727"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=30727"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=30727"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=30727"><img src="https://github-app-statics.socket.dev/score-80.svg" title="Maintenance" width="40" height="40" alt="80"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=30727"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=31814"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=31814">tar@​4.4.19</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=31814"><img src="https://github-app-statics.socket.dev/score-98.svg" title="Supply Chain Security" width="40" height="40" alt="98"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=31814"><img src="https://github-app-statics.socket.dev/score-96.svg" title="Vulnerability" width="40" height="40" alt="96"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=31814"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Quality" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=31814"><img src="https://github-app-statics.socket.dev/score-81.svg" title="Maintenance" width="40" height="40" alt="81"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=31814"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64150"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64150">web3-providers-http@​1.7.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64150"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64150"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64150"><img src="https://github-app-statics.socket.dev/score-82.svg" title="Quality" width="40" height="40" alt="82"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64150"><img src="https://github-app-statics.socket.dev/score-89.svg" title="Maintenance" width="40" height="40" alt="89"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64150"><img src="https://github-app-statics.socket.dev/score-70.svg" title="License" width="40" height="40" alt="70"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64152"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64152">web3-providers-ws@​1.7.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64152"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64152"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64152"><img src="https://github-app-statics.socket.dev/score-89.svg" title="Quality" width="40" height="40" alt="89"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64152"><img src="https://github-app-statics.socket.dev/score-89.svg" title="Maintenance" width="40" height="40" alt="89"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=64152"><img src="https://github-app-statics.socket.dev/score-70.svg" title="License" width="40" height="40" alt="70"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38161"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38161">util@​0.12.4</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38161"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Supply Chain Security" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38161"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38161"><img src="https://github-app-statics.socket.dev/score-84.svg" title="Quality" width="40" height="40" alt="84"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38161"><img src="https://github-app-statics.socket.dev/score-82.svg" title="Maintenance" width="40" height="40" alt="82"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=38161"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
<tr><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=20493"><img src="https://github-app-statics.socket.dev/diff-added.svg" title="Added" alt="Added" width="20" height="20"></a></td><td><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=20493">crypto-browserify@​3.12.0</a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=20493"><img src="https://github-app-statics.socket.dev/score-99.svg" title="Supply Chain Security" width="40" height="40" alt="99"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=20493"><img src="https://github-app-statics.socket.dev/score-100.svg" title="Vulnerability" width="40" height="40" alt="100"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=20493"><img src="https://github-app-statics.socket.dev/score-85.svg" title="Quality" width="40" height="40" alt="85"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=20493"><img src="https://github-app-statics.socket.dev/score-83.svg" title="Maintenance" width="40" height="40" alt="83"></a></td><td align="center"><a href="https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies&dependency_item_key=20493"><img src="https://github-app-statics.socket.dev/score-100.svg" title="License" width="40" height="40" alt="100"></a></td></tr>
</tbody>
</table>

[View full report](https://socket.dev/dashboard/org/across-protocol/diff/7aa4a197-5e38-4d57-bfcc-998a378a1bae/f1f83daf-c63b-455e-9e35-40d4d0146056?tab=dependencies)

<!-- overview-comment -->
author_association: NONE