diff --git a/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol b/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol index 3ed1ad8..db88360 100644 --- a/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol +++ b/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol @@ -2,16 +2,17 @@ pragma solidity ^0.8.19; import "./IAutomation.sol"; +import "../oracle/IPythRelay.sol"; import "../libraries/ArrayMutation.sol"; import "../interfaces/openzeppelin/Ownable.sol"; import "../interfaces/openzeppelin/ERC20.sol"; import "../interfaces/openzeppelin/IERC20.sol"; import "../interfaces/openzeppelin/SafeERC20.sol"; -import "../oracle/IPythRelay.sol"; +import "../interfaces/openzeppelin/Pausable.sol"; ///@notice This contract owns and handles all of the settings and accounting logic for automated swaps ///@notice This contract should not hold any user funds, only collected fees -contract AutomationMaster is IAutomationMaster, Ownable { +contract AutomationMaster is IAutomationMaster, Ownable, Pausable { using SafeERC20 for IERC20; ///@notice maximum pending orders that may exist at a time, limiting the compute requriement for checkUpkeep @@ -27,6 +28,25 @@ contract AutomationMaster is IAutomationMaster, Ownable { ///each token must have a registered oracle in order to be tradable mapping(IERC20 => IPythRelay) public oracles; mapping(IERC20 => bytes32) public pythIds; + mapping(address => uint96) private nonces; + + constructor(address owner){ + _transferOwnership(owner); + } + + function pauseAll( + bool pause, + IOracleLess oracleLessContract + ) external override onlyOwner { + if (pause) { + _pause(); + } else { + _unpause(); + } + STOP_LIMIT_CONTRACT.pause(pause); + BRACKET_CONTRACT.pause(pause); + oracleLessContract.pause(pause); + } ///@notice register Stop Limit and Bracket order contracts function registerSubKeepers( @@ -38,13 +58,26 @@ contract AutomationMaster is IAutomationMaster, Ownable { } ///@notice Registered Oracles are expected to return the USD price in 1e8 terms + ///@notice to delist a token, the oracle address in the array should be set to address(0x0) function registerOracle( IERC20[] calldata _tokens, IPythRelay[] calldata _oracles ) external onlyOwner { require(_tokens.length == _oracles.length, "Array Length Mismatch"); - for (uint i = 0; i < _tokens.length; i++) { - oracles[_tokens[i]] = _oracles[i]; + + for (uint256 i = 0; i < _tokens.length; i++) { + IERC20 token = _tokens[i]; + IPythRelay oracle = _oracles[i]; + + oracles[token] = oracle; + + if (address(oracle) == address(0x0)) { + // Remove the token from the unique set if oracle is address(0x0) + uniqueTokens.remove(address(token)); + } else { + // Add the token to the unique set otherwise + uniqueTokens.add(address(token)); + } } } @@ -61,8 +94,35 @@ contract AutomationMaster is IAutomationMaster, Ownable { ///@notice sweep the entire balance of @param token to the owner ///@notice this contract should not hold funds other than collected fees, ///which are forwarded here after each transaction - function sweep(IERC20 token) external onlyOwner { - token.safeTransfer(owner(), token.balanceOf(address(this))); + function sweep(IERC20 token, address recipient) external onlyOwner { + token.safeTransfer(recipient, token.balanceOf(address(this))); + } + + function sweepEther(address payable recipient) external onlyOwner { + uint256 balance = address(this).balance; + require(balance > 0, "No Ether to withdraw"); + require( + recipient != address(0), + "Recipient cannot be the zero address" + ); + + (bool success, ) = recipient.call{value: balance}(""); + + require(success, "Ether transfer failed"); + } + + ///@notice returns an array of each unique registered token + function getRegisteredTokens() + external + view + override + returns (IERC20[] memory tokens) + { + uint256 length = uniqueTokens.length(); + tokens = new IERC20[](length); + for (uint256 i = 0; i < length; i++) { + tokens[i] = IERC20(uniqueTokens.at(i)); + } } ///@notice Registered Oracles are expected to return the USD price in 1e8 terms @@ -87,9 +147,14 @@ contract AutomationMaster is IAutomationMaster, Ownable { } ///@notice generate a random and unique order id - function generateOrderId(address sender) external view override returns (uint96) { + function generateOrderId( + address sender + ) external override returns (uint96) { + uint96 nonce = nonces[sender]++; uint256 hashedValue = uint256( - keccak256(abi.encodePacked(sender, block.timestamp)) + keccak256( + abi.encodePacked(sender, nonce, blockhash(block.number - 1)) + ) ); return uint96(hashedValue); } @@ -141,7 +206,10 @@ contract AutomationMaster is IAutomationMaster, Ownable { ///@notice determine if a new order meets the minimum order size requirement ///Value of @param amountIn of @param tokenIn must meed the minimum USD value - function checkMinOrderSize(IERC20 tokenIn, uint256 amountIn) external view override { + function checkMinOrderSize( + IERC20 tokenIn, + uint256 amountIn + ) external view override { uint256 currentPrice = oracles[tokenIn].currentValue(); uint256 usdValue = (currentPrice * amountIn) / (10 ** ERC20(address(tokenIn)).decimals()); @@ -151,7 +219,7 @@ contract AutomationMaster is IAutomationMaster, Ownable { ///@notice check upkeep on all order types function checkUpkeep( - bytes calldata + bytes calldata checkData ) external view @@ -159,20 +227,24 @@ contract AutomationMaster is IAutomationMaster, Ownable { returns (bool upkeepNeeded, bytes memory performData) { //check stop limit order - (upkeepNeeded, performData) = STOP_LIMIT_CONTRACT.checkUpkeep("0x"); + (upkeepNeeded, performData) = STOP_LIMIT_CONTRACT.checkUpkeep( + checkData + ); if (upkeepNeeded) { return (true, performData); } //check bracket order - (upkeepNeeded, performData) = BRACKET_CONTRACT.checkUpkeep("0x"); + (upkeepNeeded, performData) = BRACKET_CONTRACT.checkUpkeep(checkData); if (upkeepNeeded) { return (true, performData); } } ///@notice perform upkeep on any order type - function performUpkeep(bytes calldata performData) external override { + function performUpkeep( + bytes calldata performData + ) external override whenNotPaused { //decode into masterUpkeepData MasterUpkeepData memory data = abi.decode( performData, diff --git a/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol.rej b/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol.rej new file mode 100644 index 0000000..b8828b4 --- /dev/null +++ b/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol.rej @@ -0,0 +1,162 @@ +diff a/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol b/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol (rejected hunks) +@@ -2,17 +2,20 @@ + pragma solidity ^0.8.19; + + import "./IAutomation.sol"; ++import "../oracle/IPythRelay.sol"; + import "../libraries/ArrayMutation.sol"; + import "../interfaces/openzeppelin/Ownable.sol"; + import "../interfaces/openzeppelin/ERC20.sol"; + import "../interfaces/openzeppelin/IERC20.sol"; + import "../interfaces/openzeppelin/SafeERC20.sol"; +-import "../oracle/IPythRelay.sol"; ++import "../interfaces/openzeppelin/Pausable.sol"; ++import "../interfaces/openzeppelin/EnumerableSet.sol"; + + ///@notice This contract owns and handles all of the settings and accounting logic for automated swaps + ///@notice This contract should not hold any user funds, only collected fees +-contract AutomationMaster is IAutomationMaster, Ownable { ++contract AutomationMaster is IAutomationMaster, Ownable, Pausable { + using SafeERC20 for IERC20; ++ using EnumerableSet for EnumerableSet.AddressSet; + + ///@notice maximum pending orders that may exist at a time, limiting the compute requriement for checkUpkeep + uint16 public maxPendingOrders; +@@ -20,13 +23,71 @@ contract AutomationMaster is IAutomationMaster, Ownable { + ///@notice minumum USD value required to create a new order, in 1e8 terms + uint256 public minOrderSize; + ++ ///@notice fee to create an order, in order to deter spam ++ uint256 public orderFee; ++ + ///sub keeper contracts + IStopLimit public STOP_LIMIT_CONTRACT; + IBracket public BRACKET_CONTRACT; + ++ //whitelist of possible target contracts to execute swaps ++ mapping(address => bool) public safeTargets; ++ ++ //whitelist of wallets allowed to set targets ++ mapping(address => bool) public targetSetters; ++ + ///each token must have a registered oracle in order to be tradable + mapping(IERC20 => IPythRelay) public oracles; + mapping(IERC20 => bytes32) public pythIds; ++ mapping(address => uint96) private nonces; ++ ++ EnumerableSet.AddressSet private uniqueTokens; ++ ++ constructor(address owner) { ++ _transferOwnership(owner); ++ } ++ ++ receive() external payable {} ++ ++ function pauseAll( ++ bool pause, ++ IOracleLess oracleLessContract ++ ) external override onlyOwner { ++ if (pause) { ++ _pause(); ++ } else { ++ _unpause(); ++ } ++ STOP_LIMIT_CONTRACT.pause(pause); ++ BRACKET_CONTRACT.pause(pause); ++ oracleLessContract.pause(pause); ++ } ++ ++ ///@notice set the fee to create / modify orders ++ ///@notice fee is taken from msg.value in the native gas token ++ ///@param _orderFee is in wei ++ function setOrderFee(uint256 _orderFee) external override onlyOwner { ++ orderFee = _orderFee; ++ } ++ ++ function whitelistTargetSetter( ++ address wallet, ++ bool canSet ++ ) external onlyOwner { ++ targetSetters[wallet] = canSet; ++ } ++ ++ ///@notice toggle each idx in @param targets to be true/false as a valid target ++ function whitelistTargets(address[] calldata targets) external { ++ require(targetSetters[msg.sender], "!Allowed to set targets"); ++ for (uint i = 0; i < targets.length; i++) { ++ safeTargets[targets[i]] = !safeTargets[targets[i]]; ++ } ++ } ++ ++ function validateTarget(address target) external view override { ++ require(safeTargets[target], "Target !Valid"); ++ } + + ///@notice register Stop Limit and Bracket order contracts + function registerSubKeepers( +@@ -87,9 +188,14 @@ contract AutomationMaster is IAutomationMaster, Ownable { + } + + ///@notice generate a random and unique order id +- function generateOrderId(address sender) external view override returns (uint96) { ++ function generateOrderId( ++ address sender ++ ) external override returns (uint96) { ++ uint96 nonce = nonces[sender]++; + uint256 hashedValue = uint256( +- keccak256(abi.encodePacked(sender, block.timestamp)) ++ keccak256( ++ abi.encodePacked(sender, nonce, blockhash(block.number - 1)) ++ ) + ); + return uint96(hashedValue); + } +@@ -141,7 +247,10 @@ contract AutomationMaster is IAutomationMaster, Ownable { + + ///@notice determine if a new order meets the minimum order size requirement + ///Value of @param amountIn of @param tokenIn must meed the minimum USD value +- function checkMinOrderSize(IERC20 tokenIn, uint256 amountIn) external view override { ++ function checkMinOrderSize( ++ IERC20 tokenIn, ++ uint256 amountIn ++ ) external view override { + uint256 currentPrice = oracles[tokenIn].currentValue(); + uint256 usdValue = (currentPrice * amountIn) / + (10 ** ERC20(address(tokenIn)).decimals()); +@@ -151,7 +260,7 @@ contract AutomationMaster is IAutomationMaster, Ownable { + + ///@notice check upkeep on all order types + function checkUpkeep( +- bytes calldata ++ bytes calldata checkData + ) + external + view +@@ -159,20 +268,24 @@ contract AutomationMaster is IAutomationMaster, Ownable { + returns (bool upkeepNeeded, bytes memory performData) + { + //check stop limit order +- (upkeepNeeded, performData) = STOP_LIMIT_CONTRACT.checkUpkeep("0x"); ++ (upkeepNeeded, performData) = STOP_LIMIT_CONTRACT.checkUpkeep( ++ checkData ++ ); + if (upkeepNeeded) { + return (true, performData); + } + + //check bracket order +- (upkeepNeeded, performData) = BRACKET_CONTRACT.checkUpkeep("0x"); ++ (upkeepNeeded, performData) = BRACKET_CONTRACT.checkUpkeep(checkData); + if (upkeepNeeded) { + return (true, performData); + } + } + + ///@notice perform upkeep on any order type +- function performUpkeep(bytes calldata performData) external override { ++ function performUpkeep( ++ bytes calldata performData ++ ) external override whenNotPaused { + //decode into masterUpkeepData + MasterUpkeepData memory data = abi.decode( + performData, diff --git a/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol b/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol index 76c478f..f04b6d2 100644 --- a/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol +++ b/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.20; import "./IAutomation.sol"; -import "../libraries/ArrayMutation.sol"; import "../interfaces/uniswapV3/UniswapV3Pool.sol"; import "../interfaces/uniswapV3/IPermit2.sol"; import "../interfaces/uniswapV3/ISwapRouter02.sol"; @@ -10,13 +9,14 @@ import "../interfaces/openzeppelin/Ownable.sol"; import "../interfaces/openzeppelin/IERC20.sol"; import "../interfaces/openzeppelin/SafeERC20.sol"; import "../interfaces/openzeppelin/ReentrancyGuard.sol"; +import "../interfaces/openzeppelin/Pausable.sol"; ///@notice This contract owns and handles all logic associated with the following order types: /// BRACKET_ORDER - automated fill at a fixed takeProfit price OR stop price, with independant slippapge for each option /// LIMIT_ORDER - BRACKET_ORDER at specified take profit price, with STOP set to 0 /// STOP_ORDER - BRACKET_ORDER at specified stop price, with take profit set to 2 ** 256 - 1 /// In order to configure a LIMIT_ORDER or STOP_ORDER, simply set the take profit or stop price to either 0 for the lower bound or 2^256 - 1 for the upper bound -contract Bracket is Ownable, IBracket, ReentrancyGuard { +contract Bracket is Ownable, IBracket, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; IAutomationMaster public immutable MASTER; @@ -26,25 +26,48 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { mapping(uint96 => Order) public orders; - constructor(IAutomationMaster _master, IPermit2 _permit2) { + constructor(IAutomationMaster _master, IPermit2 _permit2, address owner) { MASTER = _master; permit2 = _permit2; + _transferOwnership(owner); } + function pause(bool __pause) external override { + require( + msg.sender == address(MASTER) || msg.sender == owner(), + "Not Authorized" + ); + if (__pause) { + _pause(); + } else { + _unpause(); + } + } + + + function getPendingOrders() external view returns (uint96[] memory) { return pendingOrderIds; } - //check upkeep function checkUpkeep( - bytes calldata + bytes calldata checkData ) external view override returns (bool upkeepNeeded, bytes memory performData) { - for (uint96 i = 0; i < pendingOrderIds.length; i++) { + uint96 i = 0; + uint96 length = uint96(pendingOrderIds.length); + if (checkData.length == 64) { + //decode start and end idxs + (i, length) = abi.decode(checkData, (uint96, uint96)); + if (length > uint96(pendingOrderIds.length)) { + length = uint96(pendingOrderIds.length); + } + } + for (i; i < length; i++) { Order memory order = orders[pendingOrderIds[i]]; ( bool inRange, @@ -84,7 +107,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { ///this pending order is removed from the array via array mutation function performUpkeep( bytes calldata performData - ) external override nonReentrant { + ) external override nonReentrant whenNotPaused { MasterUpkeepData memory data = abi.decode( performData, (MasterUpkeepData) @@ -101,10 +124,15 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { require(inRange, "order ! in range"); //deduce bips - uint16 bips; - takeProfit ? bips = order.takeProfitSlippage : bips = order - .stopSlippage; + uint16 bips = takeProfit + ? order.takeProfitSlippage + : order.stopSlippage; + uint256[] memory initBalances = verifyTokenBalances( + new uint256[](0), + order.tokenIn, + order.tokenOut + ); (uint256 swapAmountOut, uint256 tokenInRefund) = execute( data.target, data.txData, @@ -113,13 +141,11 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { order.tokenOut, bips ); + verifyTokenBalances(initBalances, order.tokenIn, order.tokenOut); //handle accounting - //remove from pending array - pendingOrderIds = ArrayMutation.removeFromArray( - data.pendingOrderIdx, - pendingOrderIds - ); + //remove from pending dataSet + dataSet.remove(order.orderId); //handle fee (uint256 feeAmount, uint256 adjustedAmount) = applyFee( @@ -156,9 +182,10 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { uint16 existingFeeBips, uint16 takeProfitSlippage, uint16 stopSlippage, + bool bracketDirection, bool permit, bytes calldata permitPayload - ) external override nonReentrant { + ) external override nonReentrant whenNotPaused { require( msg.sender == address(MASTER.STOP_LIMIT_CONTRACT()), "Only Stop Limit" @@ -175,6 +202,9 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { existingFeeBips, takeProfitSlippage, stopSlippage, + bracketDirection + ? InitializeOrderDirection.TRUE + : InitializeOrderDirection.FALSE, permit, permitPayload ); @@ -194,7 +224,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { uint16 stopSlippage, bool permit, bytes calldata permitPayload - ) external override nonReentrant { + ) external override nonReentrant whenNotPaused { _initializeOrder( swapPayload, takeProfit, @@ -207,6 +237,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { feeBips, takeProfitSlippage, stopSlippage, + InitializeOrderDirection.NEWORDER, permit, permitPayload ); @@ -222,12 +253,17 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { address _recipient, uint16 _takeProfitSlippage, uint16 _stopSlippage, - bool permit, bool increasePosition, + uint96 pendingOrderIdx, + bool permit, bytes calldata permitPayload - ) external override nonReentrant { + ) external override nonReentrant whenNotPaused { //get order Order memory order = orders[orderId]; + require( + order.orderId == pendingOrderIds[pendingOrderIdx], + "order doesn't exist" + ); //only order owner require(msg.sender == order.recipient, "only order owner"); @@ -237,22 +273,13 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { if (amountInDelta != 0) { if (increasePosition) { newAmountIn += amountInDelta; - //take funds via permit2 - if (permit) { - handlePermit( - order.recipient, - permitPayload, - uint160(amountInDelta), - address(order.tokenIn) - ); - } else { - //legacy transfer, assume prior approval - order.tokenIn.safeTransferFrom( - order.recipient, - address(this), - amountInDelta - ); - } + procureTokens( + order.tokenIn, + amountInDelta, + msg.sender, + permit, + permitPayload + ); } else { //ensure delta is valid require(amountInDelta < order.amountIn, "invalid delta"); @@ -275,6 +302,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { "Oracle !exist" ); } + require(order.tokenIn != _tokenOut, "tokenIn == tokenOut"); //construct new order Order memory newOrder = Order({ @@ -287,9 +315,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { feeBips: order.feeBips, takeProfitSlippage: _takeProfitSlippage, stopSlippage: _stopSlippage, - recipient: _recipient, - direction: MASTER.getExchangeRate(order.tokenIn, _tokenOut) > - _takeProfit + recipient: _recipient }); //store new order @@ -299,41 +325,46 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { ///@notice allow administrator to cancel any order ///@notice once cancelled, any funds assocaiated with the order are returned to the order recipient ///@notice only pending orders can be cancelled - function adminCancelOrder(uint96 orderId) external onlyOwner { - Order memory order = orders[orderId]; - require(_cancelOrder(order), "Order not active"); + function adminCancelOrder( + uint96 pendingOrderIdx + ) external onlyOwner nonReentrant { + Order memory order = orders[pendingOrderIds[pendingOrderIdx]]; + _cancelOrder(order, pendingOrderIdx); } ///@notice only the order recipient can cancel their order ///@notice only pending orders can be cancelled - function cancelOrder(uint96 orderId) external { - Order memory order = orders[orderId]; + function cancelOrder( + uint96 pendingOrderIdx + ) external nonReentrant whenNotPaused { + Order memory order = orders[pendingOrderIds[pendingOrderIdx]]; require(msg.sender == order.recipient, "Only Order Owner"); - require(_cancelOrder(order), "Order not active"); + _cancelOrder(order, pendingOrderIdx); } function procureTokens( IERC20 token, uint256 amount, - address owner, + address tokenOwner, bool permit, bytes calldata permitPayload ) internal { if (permit) { + require(amount < type(uint160).max, "uint160 overflow"); IAutomation.Permit2Payload memory payload = abi.decode( permitPayload, (IAutomation.Permit2Payload) ); - permit2.permit(owner, payload.permitSingle, payload.signature); + permit2.permit(tokenOwner, payload.permitSingle, payload.signature); permit2.transferFrom( - owner, + tokenOwner, address(this), uint160(amount), address(token) ); } else { - token.safeTransferFrom(owner, address(this), amount); + token.safeTransferFrom(tokenOwner, address(this), amount); } } @@ -349,6 +380,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { uint16 feeBips, uint16 takeProfitSlippage, uint16 stopSlippage, + InitializeOrderDirection direction, bool permit, bytes calldata permitPayload ) internal { @@ -377,7 +409,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { recipient, feeBips, takeProfitSlippage, - stopSlippage + stopSlippage, + direction ); } else { //no swap @@ -393,7 +426,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { recipient, feeBips, takeProfitSlippage, - stopSlippage + stopSlippage, + direction ); } } @@ -408,7 +442,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { address recipient, uint16 feeBips, uint16 takeProfitSlippage, - uint16 stopSlippage + uint16 stopSlippage, + InitializeOrderDirection direction ) internal { require(swapParams.swapSlippage <= 10000, "BIPS > 10k"); @@ -421,6 +456,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { tokenIn, swapParams.swapSlippage ); + verifyTokenBalances(initBalances, swapParams.swapTokenIn, tokenIn); _createOrder( takeProfit, @@ -432,7 +468,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { recipient, feeBips, takeProfitSlippage, - stopSlippage + stopSlippage, + direction ); //refund any unspent tokenIn //this should generally be 0 when using exact input for swaps, which is recommended @@ -451,12 +488,13 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { address recipient, uint16 feeBips, uint16 takeProfitSlippage, - uint16 stopSlippage + uint16 stopSlippage, + InitializeOrderDirection direction ) internal { //verify both oracles exist, as we need both to calc the exchange rate require( address(MASTER.oracles(tokenIn)) != address(0x0) && - address(MASTER.oracles(tokenIn)) != address(0x0), + address(MASTER.oracles(tokenOut)) != address(0x0), "Oracle !exist" ); require( @@ -469,14 +507,31 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { feeBips <= 10000, "BIPS > 10k" ); + require(recipient != address(0x0), "recipient == zero address"); + require(tokenIn != tokenOut, "tokenIn == tokenOut"); + require(amountIn != 0, "amountIn == 0"); - MASTER.checkMinOrderSize(tokenIn, amountIn); + //don't check minOrderSize when filling stop limit order + if (!stopLimit) { + MASTER.checkMinOrderSize(tokenIn, amountIn); + } //generate random but unique order id if there is not an existing orderId from a stop limit order if (existingOrderId == 0) { existingOrderId = MASTER.generateOrderId(msg.sender); } + //deduce direction if not pre-determined + bool finalDirection = false; + if (direction == InitializeOrderDirection.TRUE) { + finalDirection = true; + } + if (direction == InitializeOrderDirection.NEWORDER) { + //exchangeRate in/out > takeProfit + finalDirection = + MASTER.getExchangeRate(tokenIn, tokenOut) > takeProfit; + } + //construct order orders[existingOrderId] = Order({ orderId: existingOrderId, @@ -489,7 +544,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { takeProfitSlippage: takeProfitSlippage, feeBips: feeBips, stopSlippage: stopSlippage, - direction: MASTER.getExchangeRate(tokenIn, tokenOut) > takeProfit //exchangeRate in/out > takeProfit + direction: finalDirection }); //store pending order @@ -498,25 +553,18 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { emit OrderCreated(existingOrderId); } - function _cancelOrder(Order memory order) internal returns (bool) { - for (uint96 i = 0; i < pendingOrderIds.length; i++) { - if (pendingOrderIds[i] == order.orderId) { - //remove from pending array - pendingOrderIds = ArrayMutation.removeFromArray( - i, - pendingOrderIds - ); - - //refund tokenIn amountIn to recipient - order.tokenIn.safeTransfer(order.recipient, order.amountIn); + function _cancelOrder(Order memory order, uint96 pendingOrderIdx) internal { + //remove from pending array + pendingOrderIds = ArrayMutation.removeFromArray( + pendingOrderIdx, + pendingOrderIds + ); - //emit event - emit OrderCancelled(order.orderId); + //refund tokenIn amountIn to recipient + order.tokenIn.safeTransfer(order.recipient, order.amountIn); - return true; - } - } - return false; + //emit event + emit OrderCancelled(order.orderId); } ///@notice execute swap transaction @@ -535,8 +583,14 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { uint256 initialTokenIn = tokenIn.balanceOf(address(this)); uint256 initialTokenOut = tokenOut.balanceOf(address(this)); + //approve 0 + tokenIn.safeDecreaseAllowance( + target, + (tokenIn.allowance(address(this), target)) + ); + //approve - tokenIn.safeApprove(target, amountIn); + tokenIn.safeIncreaseAllowance(target, amountIn); //perform the call (bool success, bytes memory result) = target.call(txData); @@ -551,7 +605,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { require( finalTokenOut - initialTokenOut > MASTER.getMinAmountReceived( - amountIn, + (initialTokenIn - finalTokenIn), tokenIn, tokenOut, bips @@ -565,6 +619,12 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { //force revert revert TransactionFailed(result); } + + //approve 0 + tokenIn.safeDecreaseAllowance( + target, + (tokenIn.allowance(address(this), target)) + ); } ///@notice handle signature and acquisition of asset with permit2 @@ -582,8 +642,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { permit2.permit(owner, payload.permitSingle, payload.signature); permit2.transferFrom(owner, address(this), amount, token); } + ///@notice determine @param order order is fillable - /// function checkInRange( Order memory order ) @@ -592,18 +652,19 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { returns (bool inRange, bool takeProfit, uint256 exchangeRate) { exchangeRate = MASTER.getExchangeRate(order.tokenIn, order.tokenOut); - if (order.direction) { + + if (order.stopPrice > order.takeProfit) { //check for take profit price if (exchangeRate <= order.takeProfit) { return (true, true, exchangeRate); } //check for stop price - if (exchangeRate >= order.stopPrice) { + if (order.stopPrice <= exchangeRate) { return (true, false, exchangeRate); } } else { //check for take profit price - if (exchangeRate >= order.takeProfit) { + if (order.takeProfit <= exchangeRate) { return (true, true, exchangeRate); } //check for stop price @@ -613,6 +674,39 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { } } + ///@notice compare all balances of all tokens not involved in the swap + function verifyTokenBalances( + uint256[] memory initBalances, + IERC20 tokenIn, + IERC20 tokenOut + ) internal view returns (uint256[] memory balances) { + IERC20[] memory tokens = MASTER.getRegisteredTokens(); // Get all unique registered tokens + bool check = initBalances.length != 0; + + if (check) { + require( + initBalances.length == tokens.length, + "balance set length mismatch" + ); + } + + balances = new uint256[](tokens.length); + + for (uint256 i = 0; i < tokens.length; i++) { + IERC20 token = tokens[i]; + uint256 balance = token.balanceOf(address(this)); // Get balance of the token held by the contract + + if (check) { + // Skip balance comparison for tokenIn and tokenOut + if (token != tokenIn && token != tokenOut) { + require(balance == initBalances[i], "balance mismatch"); + } + } + + balances[i] = balance; + } + } + ///@notice apply the protocol fee to @param amount ///@notice fee is in the form of tokenOut after a successful performUpkeep function applyFee( diff --git a/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol.rej b/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol.rej new file mode 100644 index 0000000..1b2d9f9 --- /dev/null +++ b/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol.rej @@ -0,0 +1,448 @@ +diff a/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol b/oku-custom-order-types/contracts/automatedTrigger/Bracket.sol (rejected hunks) +@@ -10,42 +9,98 @@ import "../interfaces/openzeppelin/Ownable.sol"; + import "../interfaces/openzeppelin/IERC20.sol"; + import "../interfaces/openzeppelin/SafeERC20.sol"; + import "../interfaces/openzeppelin/ReentrancyGuard.sol"; ++import "../interfaces/openzeppelin/Pausable.sol"; ++import "../interfaces/openzeppelin/EnumerableSet.sol"; + + ///@notice This contract owns and handles all logic associated with the following order types: + /// BRACKET_ORDER - automated fill at a fixed takeProfit price OR stop price, with independant slippapge for each option + /// LIMIT_ORDER - BRACKET_ORDER at specified take profit price, with STOP set to 0 + /// STOP_ORDER - BRACKET_ORDER at specified stop price, with take profit set to 2 ** 256 - 1 + /// In order to configure a LIMIT_ORDER or STOP_ORDER, simply set the take profit or stop price to either 0 for the lower bound or 2^256 - 1 for the upper bound +-contract Bracket is Ownable, IBracket, ReentrancyGuard { ++contract Bracket is Ownable, IBracket, ReentrancyGuard, Pausable { + using SafeERC20 for IERC20; ++ using EnumerableSet for EnumerableSet.UintSet; ++ using EnumerableSet for EnumerableSet.AddressSet; + + IAutomationMaster public immutable MASTER; + IPermit2 public immutable permit2; + +- uint96[] public pendingOrderIds; +- + mapping(uint96 => Order) public orders; ++ EnumerableSet.UintSet private dataSet; + +- constructor(IAutomationMaster _master, IPermit2 _permit2) { ++ constructor(IAutomationMaster _master, IPermit2 _permit2, address owner) { + MASTER = _master; + permit2 = _permit2; ++ _transferOwnership(owner); ++ } ++ ++ modifier paysFee() { ++ uint256 orderFee = MASTER.orderFee(); ++ require(msg.value >= orderFee, "Insufficient funds for order fee"); ++ _; ++ // Transfer the fee to the contract owner ++ payable(address(MASTER)).transfer(orderFee); ++ } ++ ++ function pause(bool __pause) external override { ++ require( ++ msg.sender == address(MASTER) || msg.sender == owner(), ++ "Not Authorized" ++ ); ++ if (__pause) { ++ _pause(); ++ } else { ++ _unpause(); ++ } + } + +- function getPendingOrders() external view returns (uint96[] memory) { +- return pendingOrderIds; ++ function getPendingOrders() ++ external ++ view ++ returns (Order[] memory pendingOrders) ++ { ++ pendingOrders = new Order[](dataSet.length()); ++ for (uint256 i; i < dataSet.length(); i++) { ++ pendingOrders[i] = orders[uint96(dataSet.at(i))]; ++ } ++ } ++ ++ function getSpecificPendingOrders( ++ uint256 start, ++ uint256 count ++ ) external view returns (Order[] memory) { ++ // Validate start and count ++ uint256 end = start + count; ++ if (end > dataSet.length()) { ++ end = dataSet.length(); ++ } ++ ++ Order[] memory ordersSubset = new Order[](end - start); ++ for (uint256 i = start; i < end; i++) { ++ ordersSubset[i - start] = orders[uint96(dataSet.at(i))]; ++ } ++ return ordersSubset; + } + +- //check upkeep + function checkUpkeep( +- bytes calldata ++ bytes calldata checkData + ) + external + view + override + returns (bool upkeepNeeded, bytes memory performData) + { +- for (uint96 i = 0; i < pendingOrderIds.length; i++) { +- Order memory order = orders[pendingOrderIds[i]]; ++ uint96 i = 0; ++ uint96 length = uint96(dataSet.length()); ++ if (checkData.length == 64) { ++ //decode start and end idxs ++ (i, length) = abi.decode(checkData, (uint96, uint96)); ++ if (length > uint96(dataSet.length())) { ++ length = uint96(dataSet.length()); ++ } ++ } ++ for (i; i < dataSet.length(); i++) { ++ Order memory order = orders[uint96(dataSet.at(i))]; + ( + bool inRange, + bool takeProfit, +@@ -84,15 +139,15 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + ///this pending order is removed from the array via array mutation + function performUpkeep( + bytes calldata performData +- ) external override nonReentrant { ++ ) external override nonReentrant whenNotPaused { + MasterUpkeepData memory data = abi.decode( + performData, + (MasterUpkeepData) + ); +- Order memory order = orders[pendingOrderIds[data.pendingOrderIdx]]; ++ Order memory order = orders[uint96(dataSet.at(data.pendingOrderIdx))]; + + require( +- order.orderId == pendingOrderIds[data.pendingOrderIdx], ++ order.orderId == uint96(dataSet.at(data.pendingOrderIdx)), + "Order Fill Mismatch" + ); + +@@ -155,10 +213,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + address recipient, + uint16 existingFeeBips, + uint16 takeProfitSlippage, +- uint16 stopSlippage, +- bool permit, +- bytes calldata permitPayload +- ) external override nonReentrant { ++ uint16 stopSlippage ++ ) external override nonReentrant whenNotPaused { + require( + msg.sender == address(MASTER.STOP_LIMIT_CONTRACT()), + "Only Stop Limit" +@@ -175,8 +231,9 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + existingFeeBips, + takeProfitSlippage, + stopSlippage, +- permit, +- permitPayload ++ true, //flag for stop limit order ++ false, ++ new bytes(0) + ); + } + +@@ -194,7 +251,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + uint16 stopSlippage, + bool permit, + bytes calldata permitPayload +- ) external override nonReentrant { ++ ) external payable override nonReentrant whenNotPaused paysFee { + _initializeOrder( + swapPayload, + takeProfit, +@@ -207,6 +264,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + feeBips, + takeProfitSlippage, + stopSlippage, ++ false, + permit, + permitPayload + ); +@@ -222,37 +280,30 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + address _recipient, + uint16 _takeProfitSlippage, + uint16 _stopSlippage, +- bool permit, + bool increasePosition, ++ bool permit, + bytes calldata permitPayload +- ) external override nonReentrant { ++ ) external payable override nonReentrant whenNotPaused paysFee { + //get order + Order memory order = orders[orderId]; ++ require(dataSet.contains(order.orderId), "order not active"); + + //only order owner + require(msg.sender == order.recipient, "only order owner"); ++ require(_recipient != address(0x0), "recipient == zero address"); + + //deduce any amountIn changes + uint256 newAmountIn = order.amountIn; + if (amountInDelta != 0) { + if (increasePosition) { + newAmountIn += amountInDelta; +- //take funds via permit2 +- if (permit) { +- handlePermit( +- order.recipient, +- permitPayload, +- uint160(amountInDelta), +- address(order.tokenIn) +- ); +- } else { +- //legacy transfer, assume prior approval +- order.tokenIn.safeTransferFrom( +- order.recipient, +- address(this), +- amountInDelta +- ); +- } ++ procureTokens( ++ order.tokenIn, ++ amountInDelta, ++ msg.sender, ++ permit, ++ permitPayload ++ ); + } else { + //ensure delta is valid + require(amountInDelta < order.amountIn, "invalid delta"); +@@ -299,41 +349,47 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + ///@notice allow administrator to cancel any order + ///@notice once cancelled, any funds assocaiated with the order are returned to the order recipient + ///@notice only pending orders can be cancelled +- function adminCancelOrder(uint96 orderId) external onlyOwner { ++ ///NOTE if @param refund is false, then the order's tokens will not be refunded and will be stuck on this contract possibly forever ++ ///@notice ONLY SET @param refund TO FALSE IN THE CASE OF A BROKEN ORDER CAUSING cancelOrder() TO REVERT ++ function adminCancelOrder( ++ uint96 orderId, ++ bool refund ++ ) external onlyOwner nonReentrant { + Order memory order = orders[orderId]; +- require(_cancelOrder(order), "Order not active"); ++ _cancelOrder(order, refund); + } + + ///@notice only the order recipient can cancel their order + ///@notice only pending orders can be cancelled +- function cancelOrder(uint96 orderId) external { ++ function cancelOrder(uint96 orderId) external nonReentrant whenNotPaused { + Order memory order = orders[orderId]; + require(msg.sender == order.recipient, "Only Order Owner"); +- require(_cancelOrder(order), "Order not active"); ++ _cancelOrder(order, true); + } + + function procureTokens( + IERC20 token, + uint256 amount, +- address owner, ++ address tokenOwner, + bool permit, +- bytes calldata permitPayload ++ bytes memory permitPayload + ) internal { + if (permit) { ++ require(amount < type(uint160).max, "uint160 overflow"); + IAutomation.Permit2Payload memory payload = abi.decode( + permitPayload, + (IAutomation.Permit2Payload) + ); + +- permit2.permit(owner, payload.permitSingle, payload.signature); ++ permit2.permit(tokenOwner, payload.permitSingle, payload.signature); + permit2.transferFrom( +- owner, ++ tokenOwner, + address(this), + uint160(amount), + address(token) + ); + } else { +- token.safeTransferFrom(owner, address(this), amount); ++ token.safeTransferFrom(tokenOwner, address(this), amount); + } + } + +@@ -349,8 +405,9 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + uint16 feeBips, + uint16 takeProfitSlippage, + uint16 stopSlippage, ++ bool stopLimit, + bool permit, +- bytes calldata permitPayload ++ bytes memory permitPayload + ) internal { + //determine if we are doing a swap first + if (swapPayload.length != 0) { +@@ -377,7 +434,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + recipient, + feeBips, + takeProfitSlippage, +- stopSlippage ++ stopSlippage, ++ stopLimit + ); + } else { + //no swap +@@ -393,7 +451,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + recipient, + feeBips, + takeProfitSlippage, +- stopSlippage ++ stopSlippage, ++ stopLimit + ); + } + } +@@ -408,10 +467,16 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + address recipient, + uint16 feeBips, + uint16 takeProfitSlippage, +- uint16 stopSlippage ++ uint16 stopSlippage, ++ bool stopLimit + ) internal { + require(swapParams.swapSlippage <= 10000, "BIPS > 10k"); + ++ uint256[] memory initBalances = verifyTokenBalances( ++ new uint256[](0), ++ swapParams.swapTokenIn, ++ tokenIn ++ ); + //execute the swap + (uint256 swapAmountOut, uint256 tokenInRefund) = execute( + swapParams.swapTarget, +@@ -432,7 +498,8 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + recipient, + feeBips, + takeProfitSlippage, +- stopSlippage ++ stopSlippage, ++ stopLimit + ); + //refund any unspent tokenIn + //this should generally be 0 when using exact input for swaps, which is recommended +@@ -451,16 +518,17 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + address recipient, + uint16 feeBips, + uint16 takeProfitSlippage, +- uint16 stopSlippage ++ uint16 stopSlippage, ++ bool stopLimit + ) internal { + //verify both oracles exist, as we need both to calc the exchange rate + require( + address(MASTER.oracles(tokenIn)) != address(0x0) && +- address(MASTER.oracles(tokenIn)) != address(0x0), ++ address(MASTER.oracles(tokenOut)) != address(0x0), + "Oracle !exist" + ); + require( +- pendingOrderIds.length < MASTER.maxPendingOrders(), ++ dataSet.length() < MASTER.maxPendingOrders(), + "Max Order Count Reached" + ); + require( +@@ -488,35 +562,25 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + recipient: recipient, + takeProfitSlippage: takeProfitSlippage, + feeBips: feeBips, +- stopSlippage: stopSlippage, +- direction: MASTER.getExchangeRate(tokenIn, tokenOut) > takeProfit //exchangeRate in/out > takeProfit ++ stopSlippage: stopSlippage + }); + + //store pending order +- pendingOrderIds.push(existingOrderId); ++ dataSet.add(existingOrderId); + + emit OrderCreated(existingOrderId); + } + +- function _cancelOrder(Order memory order) internal returns (bool) { +- for (uint96 i = 0; i < pendingOrderIds.length; i++) { +- if (pendingOrderIds[i] == order.orderId) { +- //remove from pending array +- pendingOrderIds = ArrayMutation.removeFromArray( +- i, +- pendingOrderIds +- ); +- +- //refund tokenIn amountIn to recipient +- order.tokenIn.safeTransfer(order.recipient, order.amountIn); ++ function _cancelOrder(Order memory order, bool refund) internal { ++ //remove from pending set ++ dataSet.remove(order.orderId); + +- //emit event +- emit OrderCancelled(order.orderId); +- +- return true; +- } ++ //refund tokenIn amountIn to recipient ++ if (refund) { ++ order.tokenIn.safeTransfer(order.recipient, order.amountIn); + } +- return false; ++ //emit event ++ emit OrderCancelled(order.orderId); + } + + ///@notice execute swap transaction +@@ -531,12 +595,21 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + IERC20 tokenOut, + uint16 bips + ) internal returns (uint256 swapAmountOut, uint256 tokenInRefund) { ++ //validate target ++ MASTER.validateTarget(target); ++ + //update accounting + uint256 initialTokenIn = tokenIn.balanceOf(address(this)); + uint256 initialTokenOut = tokenOut.balanceOf(address(this)); + ++ //approve 0 ++ tokenIn.safeDecreaseAllowance( ++ target, ++ (tokenIn.allowance(address(this), target)) ++ ); ++ + //approve +- tokenIn.safeApprove(target, amountIn); ++ tokenIn.safeIncreaseAllowance(target, amountIn); + + //perform the call + (bool success, bytes memory result) = target.call(txData); +@@ -551,7 +624,7 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + require( + finalTokenOut - initialTokenOut > + MASTER.getMinAmountReceived( +- amountIn, ++ (initialTokenIn - finalTokenIn), + tokenIn, + tokenOut, + bips +@@ -565,6 +638,12 @@ contract Bracket is Ownable, IBracket, ReentrancyGuard { + //force revert + revert TransactionFailed(result); + } ++ ++ //approve 0 ++ tokenIn.safeDecreaseAllowance( ++ target, ++ (tokenIn.allowance(address(this), target)) ++ ); + } + + ///@notice handle signature and acquisition of asset with permit2 diff --git a/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol b/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol index b74c5f1..1abf996 100644 --- a/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol +++ b/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import "../oracle/IPythRelay.sol"; import "../interfaces/openzeppelin/IERC20.sol"; import "../interfaces/chainlink/AutomationCompatibleInterface.sol"; import "../interfaces/uniswapV3/IPermit2.sol"; -import "../oracle/IPythRelay.sol"; interface IAutomation is AutomationCompatibleInterface { ///@notice force a revert if the external call fails @@ -16,6 +16,12 @@ interface IAutomation is AutomationCompatibleInterface { BRACKET } + enum InitializeOrderDirection { + TRUE, + FALSE, + NEWORDER + } + ///@notice encode permit2 data into a single struct struct Permit2Payload { IPermit2.PermitSingle permitSingle; @@ -69,13 +75,14 @@ interface IAutomationMaster is IAutomation { function STOP_LIMIT_CONTRACT() external view returns (IStopLimit); function oracles(IERC20 token) external view returns (IPythRelay); function maxPendingOrders() external view returns (uint16); + function pauseAll(bool, IOracleLess) external; function getExchangeRate( IERC20 tokenIn, IERC20 tokenOut ) external view returns (uint256 exchangeRate); - function generateOrderId(address sender) external view returns (uint96); + function generateOrderId(address sender) external returns (uint96); function getMinAmountReceived( uint256 amountIn, @@ -119,8 +126,10 @@ interface IStopLimit is IAutomation { uint16 stopSlippage; uint16 swapSlippage; bool direction; + bool bracketDirection; bool swapOnFill; } + function pause(bool) external; ///@notice StopLimit orders create a new bracket order once filled ///@param stopLimitPrice execution price to fill the Stop Limit order @@ -153,7 +162,7 @@ interface IStopLimit is IAutomation { bool swapOnFill, bool permit, bytes calldata permitPayload - ) external; + ) external payable; ///@param orderId unique id to reference the order being modified ///@param stopLimitPrice new execution price to fill the Stop Limit order @@ -183,8 +192,9 @@ interface IStopLimit is IAutomation { uint16 stopSlippage, uint16 swapSlippage, bool swapOnFill, - bool permit, bool increasePosition, + uint96 pendingOrderIdx, + bool permit, bytes calldata permitPayload ) external; } @@ -202,7 +212,6 @@ interface IBracket is IAutomation { ///@param feeBips optional fee, raw basis points, taken in @param tokenOut ///@param takeProfitSlippage raw bips used to determine slippage for resulting Bracket order once @param takeProfit is reached ///@param stopSlippage raw bips used to determine slippage for resulting Bracket order once @param stopPrice is reached - ///@param direction determines the expected direction of price movement struct Order { uint256 takeProfit; //defined by exchange rate of tokenIn / tokenOut uint256 stopPrice; @@ -214,9 +223,11 @@ interface IBracket is IAutomation { uint16 feeBips; uint16 takeProfitSlippage; //slippage if order is filled uint16 stopSlippage; //slippage of stop price is reached - bool direction; //true if initial exchange rate > strike price + bool direction; //true if initial exchange rate > takeProfit price } + function pause(bool) external; + ///@notice Bracket orders are filled when either @param takeProfit or @param stopPrice are reached, /// at which time @param tokenIn is swapped for @param tokenOut ///@param stopLimitPrice execution price to fill the Stop Limit order ///@param takeProfit execution price for resulting Bracket order @@ -244,7 +255,7 @@ interface IBracket is IAutomation { uint16 stopSlippage, bool permit, bytes calldata permitPayload - ) external; + ) external payable; ///@notice create a new Bracket order as a Stop Limit order is filled ///@notice @param existingOrderId allows the use of the same orderId for the resulting Bracket order @@ -260,6 +271,7 @@ interface IBracket is IAutomation { uint16 existingFeeBips, uint16 takeProfitSlippage, uint16 stopSlippage, + bool bracketDirection, bool permit, bytes calldata permitPayload ) external; @@ -286,14 +298,15 @@ interface IBracket is IAutomation { address recipient, uint16 takeProfitSlippage, uint16 stopSlippage, - bool permit, bool increasePosition, + uint96 pendingOrderIdx, + bool permit, bytes calldata permitPayload ) external; } interface IOracleLess { - event OrderCreated(uint96 orderId); + event OrderCreated(uint96 orderId, uint96 index); event OrderCancelled(uint96 orderId); event OrderModified(uint96 orderId); event OrderProcessed(uint96 orderId); @@ -311,6 +324,8 @@ interface IOracleLess { uint16 feeBips; } + function pause(bool) external; + function createOrder( IERC20 tokenIn, IERC20 tokenOut, @@ -320,7 +335,7 @@ interface IOracleLess { uint16 feeBips, bool permit, bytes calldata permitPayload - ) external returns (uint96); + ) external payable returns (uint96); function cancelOrder(uint96 orderId) external; @@ -331,9 +346,10 @@ interface IOracleLess { uint256 _minAmountOut, address _recipient, bool increasePosition, + uint96 pendingOrderIdx, bool permit, bytes calldata permitPayload - ) external; + ) external payable; function fillOrder( uint96 pendingOrderIdx, diff --git a/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol.rej b/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol.rej new file mode 100644 index 0000000..c01db76 --- /dev/null +++ b/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol.rej @@ -0,0 +1,135 @@ +diff a/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol b/oku-custom-order-types/contracts/automatedTrigger/IAutomation.sol (rejected hunks) +@@ -1,10 +1,10 @@ + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.19; + ++import "../oracle/IPythRelay.sol"; + import "../interfaces/openzeppelin/IERC20.sol"; + import "../interfaces/chainlink/AutomationCompatibleInterface.sol"; + import "../interfaces/uniswapV3/IPermit2.sol"; +-import "../oracle/IPythRelay.sol"; + + interface IAutomation is AutomationCompatibleInterface { + ///@notice force a revert if the external call fails +@@ -16,6 +16,12 @@ interface IAutomation is AutomationCompatibleInterface { + BRACKET + } + ++ enum InitializeOrderDirection { ++ TRUE, ++ FALSE, ++ NEWORDER ++ } ++ + ///@notice encode permit2 data into a single struct + struct Permit2Payload { + IPermit2.PermitSingle permitSingle; +@@ -69,13 +75,17 @@ interface IAutomationMaster is IAutomation { + function STOP_LIMIT_CONTRACT() external view returns (IStopLimit); + function oracles(IERC20 token) external view returns (IPythRelay); + function maxPendingOrders() external view returns (uint16); +- ++ function orderFee() external view returns (uint256); ++ function pauseAll(bool, IOracleLess) external; ++ function setOrderFee(uint256 _orderFee) external; ++ function validateTarget(address) external; ++ function getRegisteredTokens() external view returns (IERC20[] memory); + function getExchangeRate( + IERC20 tokenIn, + IERC20 tokenOut + ) external view returns (uint256 exchangeRate); + +- function generateOrderId(address sender) external view returns (uint96); ++ function generateOrderId(address sender) external returns (uint96); + + function getMinAmountReceived( + uint256 amountIn, +@@ -121,6 +131,7 @@ interface IStopLimit is IAutomation { + bool direction; + bool swapOnFill; + } ++ function pause(bool) external; + + ///@notice StopLimit orders create a new bracket order once filled + ///@param stopLimitPrice execution price to fill the Stop Limit order +@@ -183,10 +194,10 @@ interface IStopLimit is IAutomation { + uint16 stopSlippage, + uint16 swapSlippage, + bool swapOnFill, +- bool permit, + bool increasePosition, ++ bool permit, + bytes calldata permitPayload +- ) external; ++ ) external payable; + } + + interface IBracket is IAutomation { +@@ -214,9 +224,10 @@ interface IBracket is IAutomation { + uint16 feeBips; + uint16 takeProfitSlippage; //slippage if order is filled + uint16 stopSlippage; //slippage of stop price is reached +- bool direction; //true if initial exchange rate > strike price + } + ++ function pause(bool) external; ++ + ///@notice Bracket orders are filled when either @param takeProfit or @param stopPrice are reached, + /// at which time @param tokenIn is swapped for @param tokenOut ///@param stopLimitPrice execution price to fill the Stop Limit order + ///@param takeProfit execution price for resulting Bracket order +@@ -259,9 +270,7 @@ interface IBracket is IAutomation { + address recipient, + uint16 existingFeeBips, + uint16 takeProfitSlippage, +- uint16 stopSlippage, +- bool permit, +- bytes calldata permitPayload ++ uint16 stopSlippage + ) external; + + ///@param orderId unique id to reference the order being modified +@@ -286,14 +295,14 @@ interface IBracket is IAutomation { + address recipient, + uint16 takeProfitSlippage, + uint16 stopSlippage, +- bool permit, + bool increasePosition, ++ bool permit, + bytes calldata permitPayload +- ) external; ++ ) external payable; + } + + interface IOracleLess { +- event OrderCreated(uint96 orderId); ++ event OrderCreated(uint96 orderId, uint96 index); + event OrderCancelled(uint96 orderId); + event OrderModified(uint96 orderId); + event OrderProcessed(uint96 orderId); +@@ -311,6 +320,8 @@ interface IOracleLess { + uint16 feeBips; + } + ++ function pause(bool) external; ++ + function createOrder( + IERC20 tokenIn, + IERC20 tokenOut, +@@ -320,7 +331,7 @@ interface IOracleLess { + uint16 feeBips, + bool permit, + bytes calldata permitPayload +- ) external returns (uint96); ++ ) external payable returns (uint96); + + function cancelOrder(uint96 orderId) external; + +@@ -333,7 +344,7 @@ interface IOracleLess { + bool increasePosition, + bool permit, + bytes calldata permitPayload +- ) external; ++ ) external payable; + + function fillOrder( + uint96 pendingOrderIdx, diff --git a/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol b/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol index 3371af0..250ad26 100644 --- a/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol +++ b/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol @@ -1,24 +1,48 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; +import "./AutomationMaster.sol"; import "../interfaces/openzeppelin/Ownable.sol"; import "../interfaces/openzeppelin/IERC20.sol"; +import "../interfaces/openzeppelin/ERC20.sol"; import "../interfaces/openzeppelin/SafeERC20.sol"; import "../interfaces/openzeppelin/ReentrancyGuard.sol"; -import "./AutomationMaster.sol"; +import "../interfaces/openzeppelin/Pausable.sol"; import "../libraries/ArrayMutation.sol"; -contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { +contract OracleLess is IOracleLess, Ownable, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; AutomationMaster public immutable MASTER; IPermit2 public immutable permit2; + ///@notice fee to create an order, in order to deter spam + uint256 public orderFee; + + uint96 public orderCount; + uint96[] public pendingOrderIds; mapping(uint96 => Order) public orders; - constructor(AutomationMaster _master, IPermit2 _permit2) { + constructor(AutomationMaster _master, IPermit2 _permit2, address owner) { MASTER = _master; permit2 = _permit2; + _transferOwnership(owner); + } + + modifier paysFee() { + require(msg.value >= orderFee, "Insufficient funds for order fee"); + _; + // Transfer the fee to the contract owner + payable(owner()).transfer(orderFee); + } + + function pause(bool __pause) external override{ + require(msg.sender == address(MASTER) || msg.sender == owner(), "Not Authorized"); + if(__pause){ + _pause(); + }else{ + _unpause(); + } } ///@return pendingOrders a full list of all pending orders with full order details @@ -35,6 +59,10 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { } } + function setOrderFee(uint256 _orderFee) external onlyOwner { + orderFee = _orderFee; + } + function createOrder( IERC20 tokenIn, IERC20 tokenOut, @@ -44,12 +72,14 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { uint16 feeBips, bool permit, bytes calldata permitPayload - ) external override returns (uint96 orderId) { + ) external payable override paysFee nonReentrant whenNotPaused returns (uint96 orderId) { + require(amountIn != 0, "amountIn == 0"); + //procure tokens - procureTokens(tokenIn, amountIn, recipient, permit, permitPayload); + procureTokens(tokenIn, amountIn, msg.sender, permit, permitPayload); //construct and store order - orderId = MASTER.generateOrderId(recipient); + orderId = MASTER.generateOrderId(msg.sender); orders[orderId] = Order({ orderId: orderId, tokenIn: tokenIn, @@ -63,18 +93,27 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { //store pending order pendingOrderIds.push(orderId); - emit OrderCreated(orderId); + orderCount++; + + emit OrderCreated(orderId, orderCount); } - function adminCancelOrder(uint96 orderId) external onlyOwner { - Order memory order = orders[orderId]; - require(_cancelOrder(order), "Order not active"); + ///@notice allow administrator to cancel any order + ///@notice once cancelled, any funds assocaiated with the order are returned to the order recipient + ///@notice only pending orders can be cancelled + function adminCancelOrder( + uint96 pendingOrderIdx + ) external onlyOwner nonReentrant { + Order memory order = orders[pendingOrderIds[pendingOrderIdx]]; + _cancelOrder(order, pendingOrderIdx); } - function cancelOrder(uint96 orderId) external override { - Order memory order = orders[orderId]; + ///@notice only the order recipient can cancel their order + ///@notice only pending orders can be cancelled + function cancelOrder(uint96 pendingOrderIdx) external nonReentrant whenNotPaused { + Order memory order = orders[pendingOrderIds[pendingOrderIdx]]; require(msg.sender == order.recipient, "Only Order Owner"); - require(_cancelOrder(order), "Order not active"); + _cancelOrder(order, pendingOrderIdx); } function modifyOrder( @@ -84,9 +123,14 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { uint256 _minAmountOut, address _recipient, bool increasePosition, + uint96 pendingOrderIdx, bool permit, bytes calldata permitPayload - ) external override { + ) external payable override nonReentrant paysFee whenNotPaused { + require( + orderId == pendingOrderIds[pendingOrderIdx], + "order doesn't exist" + ); _modifyOrder( orderId, _tokenOut, @@ -94,6 +138,7 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { _minAmountOut, _recipient, increasePosition, + pendingOrderIdx, permit, permitPayload ); @@ -105,7 +150,7 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { uint96 orderId, address target, bytes calldata txData - ) external override { + ) external override nonReentrant whenNotPaused { //fetch order Order memory order = orders[orderId]; @@ -122,11 +167,8 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { ); //handle accounting - //remove from array - pendingOrderIds = ArrayMutation.removeFromArray( - pendingOrderIdx, - pendingOrderIds - ); + //remove from pending dataSet + dataSet.remove(order.orderId); //handle fee (uint256 feeAmount, uint256 adjustedAmount) = applyFee( @@ -147,25 +189,18 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { } } - function _cancelOrder(Order memory order) internal returns (bool) { - for (uint96 i = 0; i < pendingOrderIds.length; i++) { - if (pendingOrderIds[i] == order.orderId) { - //remove from pending array - pendingOrderIds = ArrayMutation.removeFromArray( - i, - pendingOrderIds - ); - - //refund tokenIn amountIn to recipient - order.tokenIn.safeTransfer(order.recipient, order.amountIn); + function _cancelOrder(Order memory order, uint96 pendingOrderIdx) internal { + //remove from pending array + pendingOrderIds = ArrayMutation.removeFromArray( + pendingOrderIdx, + pendingOrderIds + ); - //emit event - emit OrderCancelled(order.orderId); + //refund tokenIn amountIn to recipient + order.tokenIn.safeTransfer(order.recipient, order.amountIn); - return true; - } - } - return false; + //emit event + emit OrderCancelled(order.orderId); } function _modifyOrder( @@ -175,12 +210,16 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { uint256 _minAmountOut, address _recipient, bool increasePosition, + uint96 pendingOrderIdx, bool permit, bytes calldata permitPayload ) internal { //fetch order Order memory order = orders[orderId]; - + require( + order.orderId == pendingOrderIds[pendingOrderIdx], + "order doesn't exist" + ); require(msg.sender == order.recipient, "only order owner"); //deduce any amountIn changes @@ -207,6 +246,7 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { //refund position partially order.tokenIn.safeTransfer(order.recipient, amountInDelta); } + require(newAmountIn != 0, "newAmountIn == 0"); } //construct new order @@ -233,8 +273,14 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { uint256 initialTokenIn = order.tokenIn.balanceOf(address(this)); uint256 initialTokenOut = order.tokenOut.balanceOf(address(this)); + //approve 0 + order.tokenIn.safeDecreaseAllowance( + target, + (order.tokenIn.allowance(address(this), target)) + ); + //approve - order.tokenIn.safeApprove(target, order.amountIn); + order.tokenIn.safeIncreaseAllowance(target, order.amountIn); //perform the call (bool success, bytes memory reason) = target.call(txData); @@ -243,6 +289,12 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { revert TransactionFailed(reason); } + //approve 0 + order.tokenIn.safeDecreaseAllowance( + target, + (order.tokenIn.allowance(address(this), target)) + ); + uint256 finalTokenIn = order.tokenIn.balanceOf(address(this)); require(finalTokenIn >= initialTokenIn - order.amountIn, "over spend"); uint256 finalTokenOut = order.tokenOut.balanceOf(address(this)); @@ -254,6 +306,7 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { amountOut = finalTokenOut - initialTokenOut; tokenInRefund = order.amountIn - (initialTokenIn - finalTokenIn); + verifyTokenBalances(initBalances, order.tokenIn, order.tokenOut); } function procureTokens( @@ -264,6 +317,8 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { bytes calldata permitPayload ) internal { if (permit) { + require(amount < type(uint160).max, "uint160 overflow"); + IAutomation.Permit2Payload memory payload = abi.decode( permitPayload, (IAutomation.Permit2Payload) @@ -281,6 +336,48 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { } } + ///@notice compare all balances of all tokens not involved in the swap + function verifyTokenBalances( + uint256[] memory initBalances, + IERC20 tokenIn, + IERC20 tokenOut + ) internal view returns (uint256[] memory balances) { + IERC20[] memory tokens = getWhitelistedTokens(); // Get all unique whitelisted tokens + bool check = initBalances.length != 0; + + if (check) { + require( + initBalances.length == tokens.length, + "balance set length mismatch" + ); + } + + balances = new uint256[](tokens.length); + + for (uint256 i = 0; i < tokens.length; i++) { + IERC20 token = tokens[i]; + uint256 balance = token.balanceOf(address(this)); + + if (check) { + // Skip balance comparison for tokenIn and tokenOut + if (token != tokenIn && token != tokenOut) { + require(balance == initBalances[i], "balance mismatch"); + } + } + + balances[i] = balance; + } + } + + function getWhitelistedTokens() internal view returns (IERC20[] memory tokens) { + uint256 length = uniqueTokens.length(); + tokens = new IERC20[](length); + + for (uint256 i = 0; i < length; i++) { + tokens[i] = IERC20(uniqueTokens.at(i)); + } + } + ///@notice apply the protocol fee to @param amount ///@notice fee is in the form of tokenOut after a successful performUpkeep function applyFee( diff --git a/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol.rej b/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol.rej new file mode 100644 index 0000000..9108146 --- /dev/null +++ b/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol.rej @@ -0,0 +1,317 @@ +diff a/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol b/oku-custom-order-types/contracts/automatedTrigger/OracleLess.sol (rejected hunks) +@@ -1,38 +1,105 @@ + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.19; ++import "./AutomationMaster.sol"; + import "../interfaces/openzeppelin/Ownable.sol"; + import "../interfaces/openzeppelin/IERC20.sol"; ++import "../interfaces/openzeppelin/ERC20.sol"; + import "../interfaces/openzeppelin/SafeERC20.sol"; + import "../interfaces/openzeppelin/ReentrancyGuard.sol"; +-import "./AutomationMaster.sol"; +-import "../libraries/ArrayMutation.sol"; ++import "../interfaces/openzeppelin/Pausable.sol"; ++import "../interfaces/openzeppelin/EnumerableSet.sol"; + +-contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { ++contract OracleLess is IOracleLess, Ownable, ReentrancyGuard, Pausable { + using SafeERC20 for IERC20; ++ using EnumerableSet for EnumerableSet.UintSet; ++ using EnumerableSet for EnumerableSet.AddressSet; ++ + AutomationMaster public immutable MASTER; + IPermit2 public immutable permit2; + ++ uint96 public orderCount; ++ + uint96[] public pendingOrderIds; + + mapping(uint96 => Order) public orders; ++ mapping(IERC20 => bool) public whitelistedTokens; ++ EnumerableSet.AddressSet private uniqueTokens; ++ EnumerableSet.UintSet private dataSet; + +- constructor(AutomationMaster _master, IPermit2 _permit2) { ++ constructor(AutomationMaster _master, IPermit2 _permit2, address owner) { + MASTER = _master; + permit2 = _permit2; ++ _transferOwnership(owner); ++ } ++ ++ modifier paysFee() { ++ uint256 orderFee = MASTER.orderFee(); ++ require(msg.value >= orderFee, "Insufficient funds for order fee"); ++ _; ++ // Transfer the fee to the contract owner ++ payable(address(MASTER)).transfer(orderFee); ++ } ++ ++ function pause(bool __pause) external override { ++ require( ++ msg.sender == address(MASTER) || msg.sender == owner(), ++ "Not Authorized" ++ ); ++ if (__pause) { ++ _pause(); ++ } else { ++ _unpause(); ++ } ++ } ++ ++ function whitelistTokens( ++ IERC20[] calldata tokens, ++ bool[] calldata approved ++ ) external onlyOwner { ++ require(tokens.length == approved.length, "array mismatch"); ++ ++ for (uint i = 0; i < tokens.length; i++) { ++ IERC20 token = tokens[i]; ++ bool isApproved = approved[i]; ++ ++ whitelistedTokens[token] = isApproved; ++ ++ if (isApproved) { ++ // Add to the unique token set if approved ++ uniqueTokens.add(address(token)); ++ } else { ++ // Remove from the unique token set if not approved ++ uniqueTokens.remove(address(token)); ++ } ++ } + } + +- ///@return pendingOrders a full list of all pending orders with full order details +- ///@notice this should not be called in a write function due to gas usage + function getPendingOrders() + external + view + returns (Order[] memory pendingOrders) + { +- pendingOrders = new Order[](pendingOrderIds.length); +- for (uint96 i = 0; i < pendingOrderIds.length; i++) { +- Order memory order = orders[pendingOrderIds[i]]; +- pendingOrders[i] = order; ++ pendingOrders = new Order[](dataSet.length()); ++ for (uint256 i; i < dataSet.length(); i++) { ++ pendingOrders[i] = orders[uint96(dataSet.at(i))]; ++ } ++ } ++ ++ function getSpecificPendingOrders( ++ uint256 start, ++ uint256 count ++ ) external view returns (Order[] memory) { ++ // Validate start and count ++ uint256 end = start + count; ++ if (end > dataSet.length()) { ++ end = dataSet.length(); ++ } ++ ++ Order[] memory ordersSubset = new Order[](end - start); ++ for (uint256 i = start; i < end; i++) { ++ ordersSubset[i - start] = orders[uint96(dataSet.at(i))]; + } ++ return ordersSubset; + } + + function createOrder( +@@ -44,12 +111,29 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + uint16 feeBips, + bool permit, + bytes calldata permitPayload +- ) external override returns (uint96 orderId) { ++ ) ++ external ++ payable ++ override ++ paysFee ++ nonReentrant ++ whenNotPaused ++ returns (uint96 orderId) ++ { ++ require(amountIn != 0, "amountIn == 0"); ++ require(tokenIn != tokenOut, "tokenIn == tokenOut"); ++ require(feeBips <= 10000, "BIPS > 10k"); ++ require(recipient != address(0x0), "recipient == zero address"); ++ require( ++ whitelistedTokens[tokenIn] && whitelistedTokens[tokenOut], ++ "tokens not whitelisted" ++ ); ++ + //procure tokens +- procureTokens(tokenIn, amountIn, recipient, permit, permitPayload); ++ procureTokens(tokenIn, amountIn, msg.sender, permit, permitPayload); + + //construct and store order +- orderId = MASTER.generateOrderId(recipient); ++ orderId = MASTER.generateOrderId(msg.sender); + orders[orderId] = Order({ + orderId: orderId, + tokenIn: tokenIn, +@@ -61,20 +145,32 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + }); + + //store pending order +- pendingOrderIds.push(orderId); ++ dataSet.add(orderId); + +- emit OrderCreated(orderId); ++ orderCount++; ++ ++ emit OrderCreated(orderId, orderCount); + } + +- function adminCancelOrder(uint96 orderId) external onlyOwner { ++ ///@notice allow administrator to cancel any order ++ ///@notice once cancelled, any funds assocaiated with the order are returned to the order recipient ++ ///@notice only pending orders can be cancelled ++ ///NOTE if @param refund is false, then the order's tokens will not be refunded and will be stuck on this contract possibly forever ++ ///@notice ONLY SET @param refund TO FALSE IN THE CASE OF A BROKEN ORDER CAUSING cancelOrder() TO REVERT ++ function adminCancelOrder( ++ uint96 orderId, ++ bool refund ++ ) external onlyOwner nonReentrant { + Order memory order = orders[orderId]; +- require(_cancelOrder(order), "Order not active"); ++ _cancelOrder(order, refund); + } + +- function cancelOrder(uint96 orderId) external override { ++ ///@notice only the order recipient can cancel their order ++ ///@notice only pending orders can be cancelled ++ function cancelOrder(uint96 orderId) external nonReentrant whenNotPaused { + Order memory order = orders[orderId]; + require(msg.sender == order.recipient, "Only Order Owner"); +- require(_cancelOrder(order), "Order not active"); ++ _cancelOrder(order, true); + } + + function modifyOrder( +@@ -86,7 +182,10 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + bool increasePosition, + bool permit, + bytes calldata permitPayload +- ) external override { ++ ) external payable override nonReentrant paysFee whenNotPaused { ++ require(dataSet.contains(orderId), "order not active"); ++ require(_recipient != address(0x0), "recipient == zero address"); ++ + _modifyOrder( + orderId, + _tokenOut, +@@ -105,12 +204,15 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + uint96 orderId, + address target, + bytes calldata txData +- ) external override { ++ ) external override nonReentrant whenNotPaused { ++ //validate target ++ MASTER.validateTarget(target); ++ + //fetch order + Order memory order = orders[orderId]; + + require( +- order.orderId == pendingOrderIds[pendingOrderIdx], ++ order.orderId == uint96(dataSet.at(pendingOrderIdx)), + "Order Fill Mismatch" + ); + +@@ -147,25 +246,16 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + } + } + +- function _cancelOrder(Order memory order) internal returns (bool) { +- for (uint96 i = 0; i < pendingOrderIds.length; i++) { +- if (pendingOrderIds[i] == order.orderId) { +- //remove from pending array +- pendingOrderIds = ArrayMutation.removeFromArray( +- i, +- pendingOrderIds +- ); +- +- //refund tokenIn amountIn to recipient +- order.tokenIn.safeTransfer(order.recipient, order.amountIn); +- +- //emit event +- emit OrderCancelled(order.orderId); ++ function _cancelOrder(Order memory order, bool refund) internal { ++ //remove from pending set ++ dataSet.remove(order.orderId); + +- return true; +- } ++ //refund tokenIn amountIn to recipient ++ if (refund) { ++ order.tokenIn.safeTransfer(order.recipient, order.amountIn); + } +- return false; ++ //emit event ++ emit OrderCancelled(order.orderId); + } + + function _modifyOrder( +@@ -180,8 +270,10 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + ) internal { + //fetch order + Order memory order = orders[orderId]; +- ++ require(dataSet.contains(orderId), "order not active"); + require(msg.sender == order.recipient, "only order owner"); ++ require(order.tokenIn != _tokenOut, "tokenIn == tokenOut"); ++ require(whitelistedTokens[_tokenOut], "token not whitelisted"); + + //deduce any amountIn changes + uint256 newAmountIn = order.amountIn; +@@ -207,6 +299,7 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + //refund position partially + order.tokenIn.safeTransfer(order.recipient, amountInDelta); + } ++ require(newAmountIn != 0, "newAmountIn == 0"); + } + + //construct new order +@@ -232,9 +325,20 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + //update accounting + uint256 initialTokenIn = order.tokenIn.balanceOf(address(this)); + uint256 initialTokenOut = order.tokenOut.balanceOf(address(this)); ++ uint256[] memory initBalances = verifyTokenBalances( ++ new uint256[](0), ++ order.tokenIn, ++ order.tokenOut ++ ); ++ ++ //approve 0 ++ order.tokenIn.safeDecreaseAllowance( ++ target, ++ (order.tokenIn.allowance(address(this), target)) ++ ); + + //approve +- order.tokenIn.safeApprove(target, order.amountIn); ++ order.tokenIn.safeIncreaseAllowance(target, order.amountIn); + + //perform the call + (bool success, bytes memory reason) = target.call(txData); +@@ -243,6 +347,12 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + revert TransactionFailed(reason); + } + ++ //approve 0 ++ order.tokenIn.safeDecreaseAllowance( ++ target, ++ (order.tokenIn.allowance(address(this), target)) ++ ); ++ + uint256 finalTokenIn = order.tokenIn.balanceOf(address(this)); + require(finalTokenIn >= initialTokenIn - order.amountIn, "over spend"); + uint256 finalTokenOut = order.tokenOut.balanceOf(address(this)); +@@ -264,6 +375,8 @@ contract OracleLess is IOracleLess, Ownable, ReentrancyGuard { + bytes calldata permitPayload + ) internal { + if (permit) { ++ require(amount < type(uint160).max, "uint160 overflow"); ++ + IAutomation.Permit2Payload memory payload = abi.decode( + permitPayload, + (IAutomation.Permit2Payload) diff --git a/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol b/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol index 2aa0e60..cea74fa 100644 --- a/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol +++ b/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol @@ -8,10 +8,11 @@ import "../interfaces/openzeppelin/Ownable.sol"; import "../interfaces/openzeppelin/IERC20.sol"; import "../interfaces/openzeppelin/SafeERC20.sol"; import "../interfaces/openzeppelin/ReentrancyGuard.sol"; +import "../interfaces/openzeppelin/Pausable.sol"; ///@notice This contract owns and handles all logic associated with STOP_LIMIT orders ///STOP_LIMIT orders create a new Bracket order order with the same order ID once filled -contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { +contract StopLimit is Ownable, IStopLimit, ReentrancyGuard, Pausable { using SafeERC20 for IERC20; IAutomationMaster public immutable MASTER; @@ -25,11 +26,25 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { constructor( IAutomationMaster _master, IBracket _bracket, - IPermit2 _permit2 + IPermit2 _permit2, + address owner ) { MASTER = _master; BRACKET_CONTRACT = _bracket; permit2 = _permit2; + _transferOwnership(owner); + } + + function pause(bool __pause) external override{ + require( + msg.sender == address(MASTER) || msg.sender == owner(), + "Not Authorized" + ); + if (__pause) { + _pause(); + } else { + _unpause(); + } } function getPendingOrders() external view returns (uint96[] memory) { @@ -38,14 +53,24 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { ///@notice this should never be called inside of a write function due to high gas usage function checkUpkeep( - bytes calldata + bytes calldata checkData ) external view override returns (bool upkeepNeeded, bytes memory performData) { - for (uint96 i = 0; i < pendingOrderIds.length; i++) { + uint96 i = 0; + uint96 length = uint96(pendingOrderIds.length); + bytes memory checkDataBytes = checkData; + if (checkDataBytes.length == 64) { + //decode start and end idxs + (i, length) = abi.decode(checkData, (uint96, uint96)); + if (length > uint96(pendingOrderIds.length)) { + length = uint96(pendingOrderIds.length); + } + } + for (i; i < length; i++) { Order memory order = orders[pendingOrderIds[i]]; (bool inRange, uint256 exchangeRate) = checkInRange(order); if (inRange) { @@ -74,7 +99,7 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { function performUpkeep( bytes calldata performData - ) external override nonReentrant { + ) external override nonReentrant whenNotPaused { MasterUpkeepData memory data = abi.decode( performData, (MasterUpkeepData) @@ -96,10 +121,15 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { pendingOrderIds ); + //approve 0 + order.tokenIn.safeDecreaseAllowance( + address(BRACKET_CONTRACT), + (order.tokenIn.allowance(address(this), address(BRACKET_CONTRACT))) + ); + //approve - updateApproval( + order.tokenIn.safeIncreaseAllowance( address(BRACKET_CONTRACT), - order.tokenIn, order.amountIn ); @@ -110,7 +140,7 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { //for swap on fill, we expect to be paid out in the same asset we provided //so the resulting order tokenIn and tokenOut are inverted relative to our original swap limit order SwapParams memory params = SwapParams({ - swapTokenIn: order.tokenIn, //asset provided + swapTokenIn: order.tokenIn, swapAmountIn: order.amountIn, swapTarget: data.target, swapSlippage: order.swapSlippage, @@ -135,10 +165,17 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { order.feeBips, order.takeProfitSlippage, order.stopSlippage, + order.bracketDirection, false, //permit "0x" //permitPayload ); + //approve 0 + order.tokenIn.safeDecreaseAllowance( + address(BRACKET_CONTRACT), + (order.tokenIn.allowance(address(this), address(BRACKET_CONTRACT))) + ); + emit OrderProcessed(order.orderId); } @@ -158,19 +195,22 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { bool swapOnFill, bool permit, bytes calldata permitPayload - ) external override nonReentrant { + ) external override nonReentrant whenNotPaused { if (permit) { + require(amountIn < type(uint160).max, "uint160 overflow"); handlePermit( - recipient, + msg.sender, permitPayload, uint160(amountIn), address(tokenIn) ); } else { //take asset, assume prior approval - tokenIn.safeTransferFrom(recipient, address(this), amountIn); + tokenIn.safeTransferFrom(msg.sender, address(this), amountIn); } + MASTER.checkMinOrderSize(tokenIn, amountIn); + _createOrder( stopLimitPrice, takeProfit, @@ -200,12 +240,17 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { uint16 _stopSlippage, uint16 _swapSlippage, bool _swapOnFill, - bool permit, bool increasePosition, + uint96 pendingOrderIdx, + bool permit, bytes calldata permitPayload - ) external override nonReentrant { + ) external override nonReentrant whenNotPaused { //get existing order Order memory order = orders[orderId]; + require( + order.orderId == pendingOrderIds[pendingOrderIdx], + "order doesn't exist" + ); //only order owner require(msg.sender == order.recipient, "only order owner"); //deduce any amountIn changes @@ -215,6 +260,10 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { newAmountIn += _amountInDelta; //take funds via permit2 if (permit) { + require( + _amountInDelta < type(uint160).max, + "uint160 overflow" + ); handlePermit( order.recipient, permitPayload, @@ -252,6 +301,8 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { } } + require(order.tokenIn != _tokenOut, "tokenIn == tokenOut"); + //check for oracles if (_tokenOut != order.tokenOut) { require( @@ -259,6 +310,13 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { "Oracle !exist" ); } + bool bracketDirection = MASTER.getExchangeRate( + order.tokenIn, + _tokenOut + ) > _takeProfit; + if (_swapOnFill) { + !bracketDirection; + } //construct order Order memory newOrder = Order({ @@ -276,6 +334,7 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { recipient: _recipient, direction: MASTER.getExchangeRate(order.tokenIn, _tokenOut) > _stopLimitPrice, + bracketDirection: bracketDirection, swapOnFill: _swapOnFill }); @@ -283,18 +342,24 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { orders[orderId] = newOrder; } - ///@notice contract owner can cancel any order - ///@notice cancelled orders refund the order recipient - function adminCancelOrder(uint96 orderId) external onlyOwner { - _cancelOrder(orderId); + ///@notice allow administrator to cancel any order + ///@notice once cancelled, any funds assocaiated with the order are returned to the order recipient + ///@notice only pending orders can be cancelled + function adminCancelOrder( + uint96 pendingOrderIdx + ) external onlyOwner nonReentrant { + Order memory order = orders[pendingOrderIds[pendingOrderIdx]]; + _cancelOrder(order, pendingOrderIdx); } ///@notice only the order recipient can cancel their order ///@notice only pending orders can be cancelled - function cancelOrder(uint96 orderId) external { - Order memory order = orders[orderId]; + function cancelOrder( + uint96 pendingOrderIdx + ) external nonReentrant whenNotPaused { + Order memory order = orders[pendingOrderIds[pendingOrderIdx]]; require(msg.sender == order.recipient, "Only Order Owner"); - require(_cancelOrder(orderId), "Order not active"); + _cancelOrder(order, pendingOrderIdx); } function _createOrder( @@ -318,7 +383,7 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { "Oracle !exist" ); require( - pendingOrderIds.length < MASTER.maxPendingOrders(), + dataSet.length() < MASTER.maxPendingOrders(), "Max Order Count Reached" ); require( @@ -329,10 +394,18 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { "BIPS > 10k" ); - MASTER.checkMinOrderSize(tokenIn, amountIn); + require(tokenIn != tokenOut, "tokenIn == tokenOut"); uint96 orderId = MASTER.generateOrderId(msg.sender); + //deduce tokenIn / out for resulting bracket order + //if ! swap on fill, then no change, + bool bracketDirection = MASTER.getExchangeRate(tokenIn, tokenOut) > + takeProfit; + if (swapOnFill) { + !bracketDirection; + } + orders[orderId] = Order({ orderId: orderId, stopLimitPrice: stopLimitPrice, @@ -348,6 +421,7 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { recipient: recipient, direction: MASTER.getExchangeRate(tokenIn, tokenOut) > stopLimitPrice, //compare to stop price for this order's direction + bracketDirection: bracketDirection, swapOnFill: swapOnFill }); pendingOrderIds.push(uint96(orderId)); @@ -355,30 +429,23 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { emit OrderCreated(orderId); } - function _cancelOrder(uint96 orderId) internal returns (bool) { - Order memory order = orders[orderId]; - for (uint96 i = 0; i < pendingOrderIds.length; i++) { - if (pendingOrderIds[i] == orderId) { - //remove from pending array - pendingOrderIds = ArrayMutation.removeFromArray( - i, - pendingOrderIds - ); - order.tokenIn.safeTransfer(order.recipient, order.amountIn); + function _cancelOrder(Order memory order, uint96 pendingOrderIdx) internal { + //remove from pending array + pendingOrderIds = ArrayMutation.removeFromArray( + pendingOrderIdx, + pendingOrderIds + ); - //emit event - emit OrderCancelled(orderId); + //refund tokenIn amountIn to recipient + order.tokenIn.safeTransfer(order.recipient, order.amountIn); - //short circuit loop - return true; - } - } - return false; + //emit event + emit OrderCancelled(order.orderId); } ///@notice handle signature and acquisition of asset with permit2 function handlePermit( - address owner, + address tokenOwner, bytes calldata permitPayload, uint160 amount, address token @@ -388,26 +455,8 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { (Permit2Payload) ); - permit2.permit(owner, payload.permitSingle, payload.signature); - permit2.transferFrom(owner, address(this), amount, token); - } - - ///@notice if current approval is insufficient, approve max - ///@notice oz safeIncreaseAllowance controls for tokens that require allowance to be reset to 0 before increasing again - function updateApproval( - address spender, - IERC20 token, - uint256 amount - ) internal { - // get current allowance - uint256 currentAllowance = token.allowance(address(this), spender); - if (currentAllowance < amount) { - // amount is a delta, so need to pass max - current to avoid overflow - token.safeIncreaseAllowance( - spender, - type(uint256).max - currentAllowance - ); - } + permit2.permit(tokenOwner, payload.permitSingle, payload.signature); + permit2.transferFrom(tokenOwner, address(this), amount, token); } ///@notice check if the order is fillable diff --git a/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol.rej b/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol.rej new file mode 100644 index 0000000..fcb4747 --- /dev/null +++ b/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol.rej @@ -0,0 +1,359 @@ +diff a/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol b/oku-custom-order-types/contracts/automatedTrigger/StopLimit.sol (rejected hunks) +@@ -2,51 +2,107 @@ + pragma solidity ^0.8.20; + + import "./IAutomation.sol"; +-import "../libraries/ArrayMutation.sol"; + import "../interfaces/uniswapV3/IPermit2.sol"; + import "../interfaces/openzeppelin/Ownable.sol"; + import "../interfaces/openzeppelin/IERC20.sol"; + import "../interfaces/openzeppelin/SafeERC20.sol"; + import "../interfaces/openzeppelin/ReentrancyGuard.sol"; ++import "../interfaces/openzeppelin/Pausable.sol"; ++import "../interfaces/openzeppelin/EnumerableSet.sol"; + + ///@notice This contract owns and handles all logic associated with STOP_LIMIT orders + ///STOP_LIMIT orders create a new Bracket order order with the same order ID once filled +-contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { ++contract StopLimit is Ownable, IStopLimit, ReentrancyGuard, Pausable { + using SafeERC20 for IERC20; ++ using EnumerableSet for EnumerableSet.UintSet; + + IAutomationMaster public immutable MASTER; + IBracket public immutable BRACKET_CONTRACT; + IPermit2 public immutable permit2; + +- uint96[] public pendingOrderIds; +- + mapping(uint96 => Order) public orders; ++ EnumerableSet.UintSet private dataSet; + + constructor( + IAutomationMaster _master, + IBracket _bracket, +- IPermit2 _permit2 ++ IPermit2 _permit2, ++ address owner + ) { + MASTER = _master; + BRACKET_CONTRACT = _bracket; + permit2 = _permit2; ++ _transferOwnership(owner); ++ } ++ ++ modifier paysFee() { ++ uint256 orderFee = MASTER.orderFee(); ++ require(msg.value >= orderFee, "Insufficient funds for order fee"); ++ _; ++ // Transfer the fee to the contract owner ++ payable(address(MASTER)).transfer(orderFee); ++ } ++ ++ function pause(bool __pause) external override { ++ require( ++ msg.sender == address(MASTER) || msg.sender == owner(), ++ "Not Authorized" ++ ); ++ if (__pause) { ++ _pause(); ++ } else { ++ _unpause(); ++ } ++ } ++ ++ function getPendingOrders() ++ external ++ view ++ returns (Order[] memory pendingOrders) ++ { ++ pendingOrders = new Order[](dataSet.length()); ++ for (uint256 i; i < dataSet.length(); i++) { ++ pendingOrders[i] = orders[uint96(dataSet.at(i))]; ++ } + } + +- function getPendingOrders() external view returns (uint96[] memory) { +- return pendingOrderIds; ++ function getSpecificPendingOrders( ++ uint256 start, ++ uint256 count ++ ) external view returns (Order[] memory) { ++ // Validate start and count ++ uint256 end = start + count; ++ if (end > dataSet.length()) { ++ end = dataSet.length(); ++ } ++ ++ Order[] memory ordersSubset = new Order[](end - start); ++ for (uint256 i = start; i < end; i++) { ++ ordersSubset[i - start] = orders[uint96(dataSet.at(i))]; ++ } ++ return ordersSubset; + } + + ///@notice this should never be called inside of a write function due to high gas usage + function checkUpkeep( +- bytes calldata ++ bytes calldata checkData + ) + external + view + override + returns (bool upkeepNeeded, bytes memory performData) + { +- for (uint96 i = 0; i < pendingOrderIds.length; i++) { +- Order memory order = orders[pendingOrderIds[i]]; ++ uint96 i = 0; ++ uint96 length = uint96(dataSet.length()); ++ if (checkData.length == 64) { ++ //decode start and end idxs ++ (i, length) = abi.decode(checkData, (uint96, uint96)); ++ if (length > uint96(dataSet.length())) { ++ length = uint96(dataSet.length()); ++ } ++ } ++ for (i; i < length; i++) { ++ Order memory order = orders[uint96(dataSet.at(i))]; + (bool inRange, uint256 exchangeRate) = checkInRange(order); + if (inRange) { + return ( +@@ -74,15 +130,15 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + + function performUpkeep( + bytes calldata performData +- ) external override nonReentrant { ++ ) external override nonReentrant whenNotPaused { + MasterUpkeepData memory data = abi.decode( + performData, + (MasterUpkeepData) + ); +- Order memory order = orders[pendingOrderIds[data.pendingOrderIdx]]; ++ Order memory order = orders[uint96(dataSet.at(data.pendingOrderIdx))]; + + require( +- order.orderId == pendingOrderIds[data.pendingOrderIdx], ++ order.orderId == uint96(dataSet.at(data.pendingOrderIdx)), + "Order Fill Mismatch" + ); + +@@ -90,16 +146,18 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + (bool inRange, ) = checkInRange(order); + require(inRange, "order ! in range"); + +- //remove from pending array +- pendingOrderIds = ArrayMutation.removeFromArray( +- data.pendingOrderIdx, +- pendingOrderIds ++ //remove from pending dataSet ++ dataSet.remove(order.orderId); ++ ++ //approve 0 ++ order.tokenIn.safeDecreaseAllowance( ++ address(BRACKET_CONTRACT), ++ (order.tokenIn.allowance(address(this), address(BRACKET_CONTRACT))) + ); + + //approve +- updateApproval( ++ order.tokenIn.safeIncreaseAllowance( + address(BRACKET_CONTRACT), +- order.tokenIn, + order.amountIn + ); + +@@ -134,9 +192,13 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + order.recipient, + order.feeBips, + order.takeProfitSlippage, +- order.stopSlippage, +- false, //permit +- "0x" //permitPayload ++ order.stopSlippage ++ ); ++ ++ //approve 0 ++ order.tokenIn.safeDecreaseAllowance( ++ address(BRACKET_CONTRACT), ++ (order.tokenIn.allowance(address(this), address(BRACKET_CONTRACT))) + ); + + emit OrderProcessed(order.orderId); +@@ -158,19 +220,22 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + bool swapOnFill, + bool permit, + bytes calldata permitPayload +- ) external override nonReentrant { ++ ) external payable override nonReentrant whenNotPaused paysFee{ + if (permit) { ++ require(amountIn < type(uint160).max, "uint160 overflow"); + handlePermit( +- recipient, ++ msg.sender, + permitPayload, + uint160(amountIn), + address(tokenIn) + ); + } else { + //take asset, assume prior approval +- tokenIn.safeTransferFrom(recipient, address(this), amountIn); ++ tokenIn.safeTransferFrom(msg.sender, address(this), amountIn); + } + ++ MASTER.checkMinOrderSize(tokenIn, amountIn); ++ + _createOrder( + stopLimitPrice, + takeProfit, +@@ -200,14 +265,17 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + uint16 _stopSlippage, + uint16 _swapSlippage, + bool _swapOnFill, +- bool permit, + bool increasePosition, ++ bool permit, + bytes calldata permitPayload +- ) external override nonReentrant { ++ ) external payable override nonReentrant whenNotPaused paysFee { + //get existing order + Order memory order = orders[orderId]; ++ require(dataSet.contains(order.orderId), "order not active"); + //only order owner + require(msg.sender == order.recipient, "only order owner"); ++ require(_recipient != address(0x0), "recipient == zero address"); ++ + //deduce any amountIn changes + uint256 newAmountIn = order.amountIn; + if (_amountInDelta != 0) { +@@ -215,6 +283,10 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + newAmountIn += _amountInDelta; + //take funds via permit2 + if (permit) { ++ require( ++ _amountInDelta < type(uint160).max, ++ "uint160 overflow" ++ ); + handlePermit( + order.recipient, + permitPayload, +@@ -283,18 +357,25 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + orders[orderId] = newOrder; + } + +- ///@notice contract owner can cancel any order +- ///@notice cancelled orders refund the order recipient +- function adminCancelOrder(uint96 orderId) external onlyOwner { +- _cancelOrder(orderId); ++ ///@notice allow administrator to cancel any order ++ ///@notice once cancelled, any funds assocaiated with the order are returned to the order recipient ++ ///@notice only pending orders can be cancelled ++ ///NOTE if @param refund is false, then the order's tokens will not be refunded and will be stuck on this contract possibly forever ++ ///@notice ONLY SET @param refund TO FALSE IN THE CASE OF A BROKEN ORDER CAUSING cancelOrder() TO REVERT ++ function adminCancelOrder( ++ uint96 orderId, ++ bool refund ++ ) external onlyOwner nonReentrant { ++ Order memory order = orders[orderId]; ++ _cancelOrder(order, refund); + } + + ///@notice only the order recipient can cancel their order + ///@notice only pending orders can be cancelled +- function cancelOrder(uint96 orderId) external { ++ function cancelOrder(uint96 orderId) external nonReentrant whenNotPaused { + Order memory order = orders[orderId]; + require(msg.sender == order.recipient, "Only Order Owner"); +- require(_cancelOrder(orderId), "Order not active"); ++ _cancelOrder(order, true); + } + + function _createOrder( +@@ -328,8 +409,9 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + feeBips <= 10000, + "BIPS > 10k" + ); +- +- MASTER.checkMinOrderSize(tokenIn, amountIn); ++ require(tokenIn != tokenOut, "tokenIn == tokenOut"); ++ require(amountIn != 0, "amountIn == 0"); ++ require(recipient != address(0x0), "recipient == zero address"); + + uint96 orderId = MASTER.generateOrderId(msg.sender); + +@@ -350,35 +432,29 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + stopLimitPrice, //compare to stop price for this order's direction + swapOnFill: swapOnFill + }); +- pendingOrderIds.push(uint96(orderId)); ++ ++ //store pending order ++ dataSet.add(orderId); ++ + //emit + emit OrderCreated(orderId); + } + +- function _cancelOrder(uint96 orderId) internal returns (bool) { +- Order memory order = orders[orderId]; +- for (uint96 i = 0; i < pendingOrderIds.length; i++) { +- if (pendingOrderIds[i] == orderId) { +- //remove from pending array +- pendingOrderIds = ArrayMutation.removeFromArray( +- i, +- pendingOrderIds +- ); +- order.tokenIn.safeTransfer(order.recipient, order.amountIn); +- +- //emit event +- emit OrderCancelled(orderId); ++ function _cancelOrder(Order memory order, bool refund) internal { ++ //remove from pending set ++ dataSet.remove(order.orderId); + +- //short circuit loop +- return true; +- } ++ //refund tokenIn amountIn to recipient ++ if (refund) { ++ order.tokenIn.safeTransfer(order.recipient, order.amountIn); + } +- return false; ++ //emit event ++ emit OrderCancelled(order.orderId); + } + + ///@notice handle signature and acquisition of asset with permit2 + function handlePermit( +- address owner, ++ address tokenOwner, + bytes calldata permitPayload, + uint160 amount, + address token +@@ -388,26 +464,8 @@ contract StopLimit is Ownable, IStopLimit, ReentrancyGuard { + (Permit2Payload) + ); + +- permit2.permit(owner, payload.permitSingle, payload.signature); +- permit2.transferFrom(owner, address(this), amount, token); +- } +- +- ///@notice if current approval is insufficient, approve max +- ///@notice oz safeIncreaseAllowance controls for tokens that require allowance to be reset to 0 before increasing again +- function updateApproval( +- address spender, +- IERC20 token, +- uint256 amount +- ) internal { +- // get current allowance +- uint256 currentAllowance = token.allowance(address(this), spender); +- if (currentAllowance < amount) { +- // amount is a delta, so need to pass max - current to avoid overflow +- token.safeIncreaseAllowance( +- spender, +- type(uint256).max - currentAllowance +- ); +- } ++ permit2.permit(tokenOwner, payload.permitSingle, payload.signature); ++ permit2.transferFrom(tokenOwner, address(this), amount, token); + } + + ///@notice check if the order is fillable diff --git a/oku-custom-order-types/contracts/interfaces/openzeppelin/EnumerableSet.sol b/oku-custom-order-types/contracts/interfaces/openzeppelin/EnumerableSet.sol new file mode 100644 index 0000000..f89b574 --- /dev/null +++ b/oku-custom-order-types/contracts/interfaces/openzeppelin/EnumerableSet.sol @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/structs/EnumerableSet.sol) +// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. + +pragma solidity ^0.8.20; + +/** + * @dev Library for managing + * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive + * types. + * + * Sets have the following properties: + * + * - Elements are added, removed, and checked for existence in constant time + * (O(1)). + * - Elements are enumerated in O(n). No guarantees are made on the ordering. + * + * ```solidity + * contract Example { + * // Add the library methods + * using EnumerableSet for EnumerableSet.AddressSet; + * + * // Declare a set state variable + * EnumerableSet.AddressSet private mySet; + * } + * ``` + * + * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) + * and `uint256` (`UintSet`) are supported. + * + * [WARNING] + * ==== + * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure + * unusable. + * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. + * + * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an + * array of EnumerableSet. + * ==== + */ +library EnumerableSet { + // To implement this library for multiple types with as little code + // repetition as possible, we write it in terms of a generic Set type with + // bytes32 values. + // The Set implementation uses private functions, and user-facing + // implementations (such as AddressSet) are just wrappers around the + // underlying Set. + // This means that we can only create new EnumerableSets for types that fit + // in bytes32. + + struct Set { + // Storage of set values + bytes32[] _values; + // Position is the index of the value in the `values` array plus 1. + // Position 0 is used to mean a value is not in the set. + mapping(bytes32 value => uint256) _positions; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function _add(Set storage set, bytes32 value) private returns (bool) { + if (!_contains(set, value)) { + set._values.push(value); + // The value is stored at length-1, but we add 1 to all indexes + // and use 0 as a sentinel value + set._positions[value] = set._values.length; + return true; + } else { + return false; + } + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function _remove(Set storage set, bytes32 value) private returns (bool) { + // We cache the value's position to prevent multiple reads from the same storage slot + uint256 position = set._positions[value]; + + if (position != 0) { + // Equivalent to contains(set, value) + // To delete an element from the _values array in O(1), we swap the element to delete with the last one in + // the array, and then remove the last element (sometimes called as 'swap and pop'). + // This modifies the order of the array, as noted in {at}. + + uint256 valueIndex = position - 1; + uint256 lastIndex = set._values.length - 1; + + if (valueIndex != lastIndex) { + bytes32 lastValue = set._values[lastIndex]; + + // Move the lastValue to the index where the value to delete is + set._values[valueIndex] = lastValue; + // Update the tracked position of the lastValue (that was just moved) + set._positions[lastValue] = position; + } + + // Delete the slot where the moved value was stored + set._values.pop(); + + // Delete the tracked position for the deleted slot + delete set._positions[value]; + + return true; + } else { + return false; + } + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function _contains(Set storage set, bytes32 value) private view returns (bool) { + return set._positions[value] != 0; + } + + /** + * @dev Returns the number of values on the set. O(1). + */ + function _length(Set storage set) private view returns (uint256) { + return set._values.length; + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function _at(Set storage set, uint256 index) private view returns (bytes32) { + return set._values[index]; + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function _values(Set storage set) private view returns (bytes32[] memory) { + return set._values; + } + + // Bytes32Set + + struct Bytes32Set { + Set _inner; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { + return _add(set._inner, value); + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { + return _remove(set._inner, value); + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { + return _contains(set._inner, value); + } + + /** + * @dev Returns the number of values in the set. O(1). + */ + function length(Bytes32Set storage set) internal view returns (uint256) { + return _length(set._inner); + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { + return _at(set._inner, index); + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { + bytes32[] memory store = _values(set._inner); + bytes32[] memory result; + + assembly ("memory-safe") { + result := store + } + + return result; + } + + // AddressSet + + struct AddressSet { + Set _inner; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function add(AddressSet storage set, address value) internal returns (bool) { + return _add(set._inner, bytes32(uint256(uint160(value)))); + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function remove(AddressSet storage set, address value) internal returns (bool) { + return _remove(set._inner, bytes32(uint256(uint160(value)))); + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function contains(AddressSet storage set, address value) internal view returns (bool) { + return _contains(set._inner, bytes32(uint256(uint160(value)))); + } + + /** + * @dev Returns the number of values in the set. O(1). + */ + function length(AddressSet storage set) internal view returns (uint256) { + return _length(set._inner); + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function at(AddressSet storage set, uint256 index) internal view returns (address) { + return address(uint160(uint256(_at(set._inner, index)))); + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function values(AddressSet storage set) internal view returns (address[] memory) { + bytes32[] memory store = _values(set._inner); + address[] memory result; + + assembly ("memory-safe") { + result := store + } + + return result; + } + + // UintSet + + struct UintSet { + Set _inner; + } + + /** + * @dev Add a value to a set. O(1). + * + * Returns true if the value was added to the set, that is if it was not + * already present. + */ + function add(UintSet storage set, uint256 value) internal returns (bool) { + return _add(set._inner, bytes32(value)); + } + + /** + * @dev Removes a value from a set. O(1). + * + * Returns true if the value was removed from the set, that is if it was + * present. + */ + function remove(UintSet storage set, uint256 value) internal returns (bool) { + return _remove(set._inner, bytes32(value)); + } + + /** + * @dev Returns true if the value is in the set. O(1). + */ + function contains(UintSet storage set, uint256 value) internal view returns (bool) { + return _contains(set._inner, bytes32(value)); + } + + /** + * @dev Returns the number of values in the set. O(1). + */ + function length(UintSet storage set) internal view returns (uint256) { + return _length(set._inner); + } + + /** + * @dev Returns the value stored at position `index` in the set. O(1). + * + * Note that there are no guarantees on the ordering of values inside the + * array, and it may change when more values are added or removed. + * + * Requirements: + * + * - `index` must be strictly less than {length}. + */ + function at(UintSet storage set, uint256 index) internal view returns (uint256) { + return uint256(_at(set._inner, index)); + } + + /** + * @dev Return the entire set in an array + * + * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed + * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that + * this function has an unbounded cost, and using it as part of a state-changing function may render the function + * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. + */ + function values(UintSet storage set) internal view returns (uint256[] memory) { + bytes32[] memory store = _values(set._inner); + uint256[] memory result; + + assembly ("memory-safe") { + result := store + } + + return result; + } +} \ No newline at end of file diff --git a/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol b/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol index 13a0b3a..ba3250d 100644 --- a/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol +++ b/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol @@ -62,17 +62,20 @@ abstract contract Ownable is Context { _transferOwnership(address(0)); } - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), "Ownable: new owner is the zero address"); - _transferOwnership(newOwner); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. + * REMOVED: This function is removed to prevent ownership transfer after deployment + * + * function transferOwnership(address newOwner) public virtual onlyOwner { + * require(newOwner != address(0), "Ownable: new owner is the zero address"); + * _transferOwnership(newOwner); + * } + */ + + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { diff --git a/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol.rej b/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol.rej new file mode 100644 index 0000000..e6be661 --- /dev/null +++ b/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol.rej @@ -0,0 +1,20 @@ +diff a/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol b/oku-custom-order-types/contracts/interfaces/openzeppelin/Ownable.sol (rejected hunks) +@@ -65,11 +65,14 @@ abstract contract Ownable is Context { + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). + * Can only be called by the current owner. ++ * REMOVED: This function is removed to prevent ownership transfer after deployment ++ * ++ * function transferOwnership(address newOwner) public virtual onlyOwner { ++ * require(newOwner != address(0), "Ownable: new owner is the zero address"); ++ * _transferOwnership(newOwner); ++ * } + */ +- function transferOwnership(address newOwner) public virtual onlyOwner { +- require(newOwner != address(0), "Ownable: new owner is the zero address"); +- _transferOwnership(newOwner); +- } ++ + + /** + * @dev Transfers ownership of the contract to a new account (`newOwner`). diff --git a/oku-custom-order-types/contracts/interfaces/openzeppelin/Pausable.sol b/oku-custom-order-types/contracts/interfaces/openzeppelin/Pausable.sol new file mode 100644 index 0000000..9c5a467 --- /dev/null +++ b/oku-custom-order-types/contracts/interfaces/openzeppelin/Pausable.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) + +pragma solidity ^0.8.20; + +import {Context} from "./Context.sol"; + +/** + * @dev Contract module which allows children to implement an emergency stop + * mechanism that can be triggered by an authorized account. + * + * This module is used through inheritance. It will make available the + * modifiers `whenNotPaused` and `whenPaused`, which can be applied to + * the functions of your contract. Note that they will not be pausable by + * simply including this module, only once the modifiers are put in place. + */ +abstract contract Pausable is Context { + bool private _paused; + + /** + * @dev Emitted when the pause is triggered by `account`. + */ + event Paused(address account); + + /** + * @dev Emitted when the pause is lifted by `account`. + */ + event Unpaused(address account); + + /** + * @dev The operation failed because the contract is paused. + */ + error EnforcedPause(); + + /** + * @dev The operation failed because the contract is not paused. + */ + error ExpectedPause(); + + /** + * @dev Initializes the contract in unpaused state. + */ + constructor() { + _paused = false; + } + + /** + * @dev Modifier to make a function callable only when the contract is not paused. + * + * Requirements: + * + * - The contract must not be paused. + */ + modifier whenNotPaused() { + _requireNotPaused(); + _; + } + + /** + * @dev Modifier to make a function callable only when the contract is paused. + * + * Requirements: + * + * - The contract must be paused. + */ + modifier whenPaused() { + _requirePaused(); + _; + } + + /** + * @dev Returns true if the contract is paused, and false otherwise. + */ + function paused() public view virtual returns (bool) { + return _paused; + } + + /** + * @dev Throws if the contract is paused. + */ + function _requireNotPaused() internal view virtual { + if (paused()) { + revert EnforcedPause(); + } + } + + /** + * @dev Throws if the contract is not paused. + */ + function _requirePaused() internal view virtual { + if (!paused()) { + revert ExpectedPause(); + } + } + + /** + * @dev Triggers stopped state. + * + * Requirements: + * + * - The contract must not be paused. + */ + function _pause() internal virtual whenNotPaused { + _paused = true; + emit Paused(_msgSender()); + } + + /** + * @dev Returns to normal state. + * + * Requirements: + * + * - The contract must be paused. + */ + function _unpause() internal virtual whenPaused { + _paused = false; + emit Unpaused(_msgSender()); + } +} \ No newline at end of file diff --git a/oku-custom-order-types/contracts/oracle/External/PythOracle.sol b/oku-custom-order-types/contracts/oracle/External/PythOracle.sol index eee4ea9..d59ebe5 100644 --- a/oku-custom-order-types/contracts/oracle/External/PythOracle.sol +++ b/oku-custom-order-types/contracts/oracle/External/PythOracle.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.9; import "../IPythRelay.sol"; import "../../interfaces/pyth/IPyth.sol"; - contract PythOracle is IPythRelay { IPyth public immutable pythOracle; bytes32 public immutable tokenId; @@ -26,7 +25,7 @@ contract PythOracle is IPythRelay { function currentValue() external view override returns (uint256) { IPyth.Price memory price = pythOracle.getPriceUnsafe(tokenId); require( - price.publishTime < block.timestamp - noOlderThan, + price.publishTime >= block.timestamp - noOlderThan, "Stale Price" ); return uint256(uint64(price.price)); @@ -48,7 +47,9 @@ contract PythOracle is IPythRelay { updatedPrice = uint256(uint64(price.price)); } - function getUpdateFee(bytes[] calldata priceUpdate) external view override returns (uint fee){ + function getUpdateFee( + bytes[] calldata priceUpdate + ) external view override returns (uint fee) { return pythOracle.getUpdateFee(priceUpdate); } } diff --git a/oku-custom-order-types/contracts/oracle/External/PythOracle.sol.rej b/oku-custom-order-types/contracts/oracle/External/PythOracle.sol.rej new file mode 100644 index 0000000..b846ef7 --- /dev/null +++ b/oku-custom-order-types/contracts/oracle/External/PythOracle.sol.rej @@ -0,0 +1,29 @@ +diff a/oku-custom-order-types/contracts/oracle/External/PythOracle.sol b/oku-custom-order-types/contracts/oracle/External/PythOracle.sol (rejected hunks) +@@ -4,7 +4,6 @@ pragma solidity ^0.8.9; + import "../IPythRelay.sol"; + import "../../interfaces/pyth/IPyth.sol"; + +- + contract PythOracle is IPythRelay { + IPyth public immutable pythOracle; + bytes32 public immutable tokenId; +@@ -26,7 +25,7 @@ contract PythOracle is IPythRelay { + function currentValue() external view override returns (uint256) { + IPyth.Price memory price = pythOracle.getPriceUnsafe(tokenId); + require( +- price.publishTime < block.timestamp - noOlderThan, ++ price.publishTime >= block.timestamp - noOlderThan, + "Stale Price" + ); + return uint256(uint64(price.price)); +@@ -48,7 +47,9 @@ contract PythOracle is IPythRelay { + updatedPrice = uint256(uint64(price.price)); + } + +- function getUpdateFee(bytes[] calldata priceUpdate) external view override returns (uint fee){ ++ function getUpdateFee( ++ bytes[] calldata priceUpdate ++ ) external view override returns (uint fee) { + return pythOracle.getUpdateFee(priceUpdate); + } + } diff --git a/oku-custom-order-types/hardhat.config.ts b/oku-custom-order-types/hardhat.config.ts index 86e52c0..81a86a6 100644 --- a/oku-custom-order-types/hardhat.config.ts +++ b/oku-custom-order-types/hardhat.config.ts @@ -294,7 +294,11 @@ const config: HardhatUserConfig = { solidity: { version: "0.8.24", settings: { - viaIR: true + viaIR: true, + optimizer: { + enabled: true, + runs: 200, + }, } }, sourcify: { diff --git a/oku-custom-order-types/hardhat.config.ts.rej b/oku-custom-order-types/hardhat.config.ts.rej new file mode 100644 index 0000000..1e27a8f --- /dev/null +++ b/oku-custom-order-types/hardhat.config.ts.rej @@ -0,0 +1,14 @@ +diff a/oku-custom-order-types/hardhat.config.ts b/oku-custom-order-types/hardhat.config.ts (rejected hunks) +@@ -294,7 +294,11 @@ const config: HardhatUserConfig = { + solidity: { + version: "0.8.24", + settings: { +- viaIR: true ++ viaIR: true, ++ optimizer: { ++ enabled: true, ++ runs: 200, ++ }, + } + }, + sourcify: { diff --git a/oku-custom-order-types/package-lock.json b/oku-custom-order-types/package-lock.json index 80c6437..66ba478 100644 --- a/oku-custom-order-types/package-lock.json +++ b/oku-custom-order-types/package-lock.json @@ -22,6 +22,7 @@ "dotenv": "^16.4.5", "hardhat": "^2.22.5", "node-fetch": "^3.3.2", + "sleep": "^6.3.0", "typechain": "^8.3.2" }, "devDependencies": { @@ -931,13 +932,13 @@ } }, "node_modules/@matterlabs/hardhat-zksync-verify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.6.0.tgz", - "integrity": "sha512-RsWlQbI23BDXMsxTtvHXpzx1dBotI2p2trvdG+r1uN/KAmMJBOKIqxce2UNXl8skd5Gtysa4GPjXEp4yaf2KrA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.7.1.tgz", + "integrity": "sha512-FtibELgllkyAZORDW4/s/7XSC5DaqAXG0KXMqGipQyXuIXQ9l1kpaHMpoEtHvQL7xxmkgZqCcSZgATnKl91nDg==", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/address": "5.7.0", - "@matterlabs/hardhat-zksync-solc": "^1.2.1", + "@matterlabs/hardhat-zksync-solc": "^1.2.5", "@nomicfoundation/hardhat-verify": "^2.0.8", "axios": "^1.7.2", "cbor": "^9.0.2", @@ -977,9 +978,9 @@ } }, "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { "version": "6.2.1", @@ -996,22 +997,36 @@ } }, "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", "dependencies": { - "@noble/hashes": "1.3.2" + "@noble/hashes": "1.6.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1061,50 +1076,50 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.3.tgz", - "integrity": "sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.5.tgz", + "integrity": "sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==", "dependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.6.3", - "@nomicfoundation/edr-darwin-x64": "0.6.3", - "@nomicfoundation/edr-linux-arm64-gnu": "0.6.3", - "@nomicfoundation/edr-linux-arm64-musl": "0.6.3", - "@nomicfoundation/edr-linux-x64-gnu": "0.6.3", - "@nomicfoundation/edr-linux-x64-musl": "0.6.3", - "@nomicfoundation/edr-win32-x64-msvc": "0.6.3" + "@nomicfoundation/edr-darwin-arm64": "0.6.5", + "@nomicfoundation/edr-darwin-x64": "0.6.5", + "@nomicfoundation/edr-linux-arm64-gnu": "0.6.5", + "@nomicfoundation/edr-linux-arm64-musl": "0.6.5", + "@nomicfoundation/edr-linux-x64-gnu": "0.6.5", + "@nomicfoundation/edr-linux-x64-musl": "0.6.5", + "@nomicfoundation/edr-win32-x64-msvc": "0.6.5" }, "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.3.tgz", - "integrity": "sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz", + "integrity": "sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.3.tgz", - "integrity": "sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz", + "integrity": "sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.3.tgz", - "integrity": "sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz", + "integrity": "sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.3.tgz", - "integrity": "sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz", + "integrity": "sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==", "engines": { "node": ">= 18" } @@ -1118,25 +1133,25 @@ } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.3.tgz", - "integrity": "sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz", + "integrity": "sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.3.tgz", - "integrity": "sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz", + "integrity": "sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr/node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.3.tgz", - "integrity": "sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz", + "integrity": "sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==", "engines": { "node": ">= 18" } @@ -1233,12 +1248,12 @@ } }, "node_modules/@nomicfoundation/hardhat-ignition": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.6.tgz", - "integrity": "sha512-PcMf4xlYvwHYej2jcuOd/rBNNMM5FO11vh9c+MF8+m7NxV4b6NOameL3uscoD7ghg0H2GNgnGXgQ67ryRqtdIQ==", + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.9.tgz", + "integrity": "sha512-lSWqhaDOBt6gsqMadkRLvH6HdoFV1v8/bx7z+12cghaOloVwwn48CPoTH2iXXnkqilPGw8rdH5eVTE6UM+2v6Q==", "dependencies": { - "@nomicfoundation/ignition-core": "^0.15.6", - "@nomicfoundation/ignition-ui": "^0.15.6", + "@nomicfoundation/ignition-core": "^0.15.9", + "@nomicfoundation/ignition-ui": "^0.15.9", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -1251,13 +1266,13 @@ } }, "node_modules/@nomicfoundation/hardhat-ignition-ethers": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.6.tgz", - "integrity": "sha512-+jXDGWdfkuIGm0W+aFEZ9SLQz2MIj7Cf4j7ANTXUIIbK8sUkvnVOhTTAQEdqa0KgGEb45XS88BPg0w8fixwrXQ==", + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.9.tgz", + "integrity": "sha512-9PwwgLv3z2ec3B26mK0IjiFezHFFBcBcs1qKaRu8SanARE4b7RvrfiLIy8ZXE7HaxgPt32kSsQzehhzAwAIj1Q==", "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.15.6", - "@nomicfoundation/ignition-core": "^0.15.6", + "@nomicfoundation/hardhat-ignition": "^0.15.9", + "@nomicfoundation/ignition-core": "^0.15.9", "ethers": "^6.7.0", "hardhat": "^2.18.0" } @@ -1312,16 +1327,16 @@ } }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz", - "integrity": "sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz", + "integrity": "sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@ethersproject/address": "^5.0.2", "cbor": "^8.1.0", - "chalk": "^2.4.2", "debug": "^4.1.1", "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.1.0", "semver": "^6.3.0", "table": "^6.8.0", "undici": "^5.14.0" @@ -1330,17 +1345,6 @@ "hardhat": "^2.0.4" } }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@nomicfoundation/hardhat-verify/node_modules/cbor": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", @@ -1352,48 +1356,6 @@ "node": ">=12.19" } }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1402,17 +1364,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@nomicfoundation/hardhat-verify/node_modules/undici": { "version": "5.28.4", "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", @@ -1425,9 +1376,9 @@ } }, "node_modules/@nomicfoundation/ignition-core": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.6.tgz", - "integrity": "sha512-9eD1NJ2G4vh7IleRNmCz/3bGVoNEPYrRVPqx0uvWzG2xD226GGQcTgtK+NovyxsQOE/AcLF1xjX3/+8kNc1sSg==", + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.9.tgz", + "integrity": "sha512-X8W+7UP/UQPorpHUnGvA1OdsEr/edGi8tDpNwEqzaLm83FMZVbRWdOsr3vNICHN2XMzNY/xIm18Cx7xGKL2PQw==", "dependencies": { "@ethersproject/address": "5.6.1", "@nomicfoundation/solidity-analyzer": "^0.1.1", @@ -1476,9 +1427,9 @@ } }, "node_modules/@nomicfoundation/ignition-ui": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.6.tgz", - "integrity": "sha512-CW14g/BVcGZtBSF1K4eZSCjyvtz1fr9yppkFKC+Z0+sm/lXFWpwcwaVN+UiugQ/9wz9HAfSk4Y0gagdAMiSs0w==" + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.9.tgz", + "integrity": "sha512-8lzbT7gpJ5PoowPQDQilkwdyqBviUKDMoHp/5rhgnwG1bDslnCS+Lxuo6s9R2akWu9LtEL14dNyqQb6WsURTag==" }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.2", @@ -1662,6 +1613,21 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/@nomiclabs/hardhat-docker/node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -1787,29 +1753,6 @@ "@solana/web3.js": "^1.30.2" } }, - "node_modules/@pythnetwork/client/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/@pythnetwork/hermes-client": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@pythnetwork/hermes-client/-/hermes-client-1.2.0.tgz", @@ -1836,9 +1779,9 @@ } }, "node_modules/@pythnetwork/price-service-sdk": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.7.1.tgz", - "integrity": "sha512-xr2boVXTyv1KUt/c6llUTfbv2jpud99pWlMJbFaHGUBoygQsByuy7WbjIJKZ+0Blg1itLZl0Lp/pJGGg8SdJoQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.8.0.tgz", + "integrity": "sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==", "dependencies": { "bn.js": "^5.2.1" } @@ -2089,33 +2032,10 @@ "node": ">=5.10" } }, - "node_modules/@solana/buffer-layout/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/@solana/web3.js": { - "version": "1.95.5", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.5.tgz", - "integrity": "sha512-hU9cBrbg1z6gEjLH9vwIckGBVB78Ijm0iZFNk4ocm5OD82piPwuk3MeQ1rfiKD9YQtr95krrcaopb49EmQJlRg==", + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.0.tgz", + "integrity": "sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==", "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -2134,54 +2054,6 @@ "superstruct": "^2.0.2" } }, - "node_modules/@solana/web3.js/node_modules/@noble/curves": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", - "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", - "dependencies": { - "@noble/hashes": "1.5.0" - }, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@solana/web3.js/node_modules/@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@solana/web3.js/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/@solana/web3.js/node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -2357,16 +2229,16 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "node_modules/@types/mocha": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", - "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==" + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==" }, "node_modules/@types/node": { - "version": "22.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.20.0" } }, "node_modules/@types/pbkdf2": { @@ -2383,9 +2255,9 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" }, "node_modules/@types/secp256k1": { "version": "4.0.6", @@ -2479,9 +2351,9 @@ "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==" }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -2722,9 +2594,9 @@ } }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2831,6 +2703,29 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -2884,12 +2779,11 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -2945,9 +2839,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -2964,7 +2858,7 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-alloc": { @@ -3034,16 +2928,25 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -3142,9 +3045,9 @@ } }, "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dependencies": { "readdirp": "^4.0.1" }, @@ -3166,12 +3069,15 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/clean-stack": { @@ -3406,12 +3312,9 @@ } }, "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/concat-map": { "version": "0.0.1", @@ -3522,11 +3425,11 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "dependencies": { - "node-fetch": "^2.6.12" + "node-fetch": "^2.7.0" } }, "node_modules/cross-fetch/node_modules/node-fetch": { @@ -3581,9 +3484,9 @@ "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { "ms": "^2.1.3" }, @@ -3631,22 +3534,6 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/delay": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", @@ -3741,9 +3628,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "engines": { "node": ">=12" }, @@ -3751,6 +3638,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", @@ -3766,9 +3666,9 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -3804,12 +3704,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -3822,6 +3719,28 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -4039,17 +3958,6 @@ "@noble/hashes": "^1.4.0" } }, - "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/ethereum-cryptography": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", @@ -4076,6 +3984,7 @@ "version": "0.6.8", "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "deprecated": "This library has been deprecated and usage is discouraged.", "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -4090,9 +3999,9 @@ } }, "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { "version": "6.2.1", @@ -4124,9 +4033,9 @@ } }, "node_modules/ethers": { - "version": "6.13.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.3.tgz", - "integrity": "sha512-/DzbZOLVtoO4fKvvQwpEucHAQgIwBGWuRvBdwE/lMXgXvvHHTSkn7XqAQ2b+gjJzZDJjWA9OD05bVceVOsBHbg==", + "version": "6.13.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", + "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", "funding": [ { "type": "individual", @@ -4141,19 +4050,69 @@ "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", + "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", + "tslib": "2.7.0", "ws": "8.17.1" }, "engines": { "node": ">=14.0.0" } }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/ethjs-unit": { "version": "0.1.6", @@ -4247,14 +4206,14 @@ "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" }, "node_modules/fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dependencies": { "reusify": "^1.0.4" } @@ -4309,14 +4268,18 @@ } }, "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { @@ -4347,9 +4310,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4441,15 +4404,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4543,20 +4511,19 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "deprecated": "Glob versions prior to v9 are no longer supported", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4615,12 +4582,52 @@ "node": ">=8" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "get-intrinsic": "^1.1.3" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4660,13 +4667,13 @@ } }, "node_modules/hardhat": { - "version": "2.22.12", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.12.tgz", - "integrity": "sha512-yok65M+LsOeTBHQsjg//QreGCyrsaNmeLVzhTFqlOvZ4ZE5y69N0wRxH1b2BC9dGK8S8OPUJMNiL9X0RAvbm8w==", + "version": "2.22.17", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.17.tgz", + "integrity": "sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.6.1", + "@nomicfoundation/edr": "^0.6.5", "@nomicfoundation/ethereumjs-common": "4.0.4", "@nomicfoundation/ethereumjs-tx": "5.0.4", "@nomicfoundation/ethereumjs-util": "9.0.4", @@ -4678,7 +4685,6 @@ "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", "boxen": "^5.1.2", - "chalk": "^2.4.2", "chokidar": "^4.0.0", "ci-info": "^2.0.0", "debug": "^4.1.1", @@ -4686,10 +4692,9 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", + "find-up": "^5.0.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", - "glob": "7.2.0", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", "json-stream-stringify": "^3.1.4", @@ -4698,12 +4703,14 @@ "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", + "picocolors": "^1.1.0", "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", "solc": "0.8.26", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.6", "tsort": "0.0.1", "undici": "^5.14.0", "uuid": "^8.3.2", @@ -4780,51 +4787,6 @@ "@scure/base": "~1.1.0" } }, - "node_modules/hardhat/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/hardhat/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/hardhat/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/hardhat/node_modules/ethereum-cryptography": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", @@ -4849,14 +4811,6 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/hardhat/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, "node_modules/hardhat/node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -4873,17 +4827,6 @@ "semver": "bin/semver.js" } }, - "node_modules/hardhat/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/hardhat/node_modules/undici": { "version": "5.28.4", "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", @@ -4931,32 +4874,10 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -5282,9 +5203,9 @@ } }, "node_modules/jayson": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", - "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", + "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -5319,26 +5240,6 @@ "@types/node": "*" } }, - "node_modules/jayson/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/jayson/node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, "node_modules/jayson/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -5381,9 +5282,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stream-stringify": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.5.tgz", - "integrity": "sha512-wurRuTiw27mck9MWaUIGAunfwqhPDxnXQVN/+Rzi+IEQUUALU10AZs1nWkSdtjH7PAVuAUcqQjH11S/JHOWeaA==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", + "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", "engines": { "node": ">=7.10.1" } @@ -5432,9 +5333,9 @@ } }, "node_modules/JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -5494,15 +5395,17 @@ } }, "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -5581,6 +5484,14 @@ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -5654,14 +5565,14 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=10" } }, "node_modules/minimist": { @@ -5697,9 +5608,9 @@ } }, "node_modules/mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", "dependencies": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -5730,14 +5641,6 @@ "node": ">= 14.0.0" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/mocha/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -5761,101 +5664,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5887,10 +5695,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" }, "node_modules/ndjson": { "version": "2.0.0", @@ -5928,9 +5735,9 @@ } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", - "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dependencies": { "@sinonjs/commons": "^3.0.1" } @@ -5993,9 +5800,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -6056,9 +5863,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "engines": { "node": ">= 0.4" }, @@ -6109,25 +5916,31 @@ } }, "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { - "p-try": "^1.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { - "p-limit": "^1.1.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -6144,14 +5957,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "engines": { - "node": ">=4" - } - }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -6163,11 +5968,11 @@ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { @@ -6222,6 +6027,11 @@ "node": ">=0.12" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -6313,9 +6123,9 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dependencies": { "side-channel": "^1.0.6" }, @@ -6414,6 +6224,26 @@ "node": ">=6.0.0" } }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", @@ -6543,29 +6373,6 @@ "utf-8-validate": "^5.0.2" } }, - "node_modules/rpc-websockets/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/rpc-websockets/node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -6649,6 +6456,15 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -6697,6 +6513,17 @@ "node": ">=4" } }, + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -6751,22 +6578,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -6817,15 +6628,106 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -6878,6 +6780,18 @@ "node": ">=8" } }, + "node_modules/sleep": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/sleep/-/sleep-6.3.0.tgz", + "integrity": "sha512-+WgYl951qdUlb1iS97UvQ01pkauoBK9ML9I/CMPg41v0Ze4EyMlTgFTDDo32iYj98IYqxIjDMRd+L71lawFfpQ==", + "hasInstallScript": true, + "dependencies": { + "nan": "^2.14.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -6923,6 +6837,14 @@ "node": ">=10.0.0" } }, + "node_modules/solc/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, "node_modules/solc/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -6932,12 +6854,12 @@ } }, "node_modules/solidity-coverage": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.13.tgz", - "integrity": "sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==", + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", + "integrity": "sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==", "dependencies": { "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.18.0", + "@solidity-parser/parser": "^0.19.0", "chalk": "^2.4.2", "death": "^1.1.0", "difflib": "^0.2.4", @@ -6964,9 +6886,9 @@ } }, "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", - "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==" + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", + "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==" }, "node_modules/solidity-coverage/node_modules/ansi-styles": { "version": "3.2.1", @@ -7250,9 +7172,9 @@ } }, "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -7352,13 +7274,14 @@ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" }, "node_modules/then-request/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", + "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "mime-types": "^2.1.12", + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.12" @@ -7382,6 +7305,42 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -7505,9 +7464,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tsort": { "version": "0.0.1", @@ -7577,6 +7536,15 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -7618,6 +7586,17 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -7643,9 +7622,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7675,17 +7654,17 @@ } }, "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", "engines": { "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "node_modules/universalify": { "version": "2.0.1", @@ -7894,9 +7873,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, @@ -7988,9 +7967,9 @@ } }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -8534,13 +8513,13 @@ } }, "@matterlabs/hardhat-zksync-verify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.6.0.tgz", - "integrity": "sha512-RsWlQbI23BDXMsxTtvHXpzx1dBotI2p2trvdG+r1uN/KAmMJBOKIqxce2UNXl8skd5Gtysa4GPjXEp4yaf2KrA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.7.1.tgz", + "integrity": "sha512-FtibELgllkyAZORDW4/s/7XSC5DaqAXG0KXMqGipQyXuIXQ9l1kpaHMpoEtHvQL7xxmkgZqCcSZgATnKl91nDg==", "requires": { "@ethersproject/abi": "^5.7.0", "@ethersproject/address": "5.7.0", - "@matterlabs/hardhat-zksync-solc": "^1.2.1", + "@matterlabs/hardhat-zksync-solc": "^1.2.5", "@nomicfoundation/hardhat-verify": "^2.0.8", "axios": "^1.7.2", "cbor": "^9.0.2", @@ -8573,9 +8552,9 @@ } }, "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "ethereumjs-util": { "version": "6.2.1", @@ -8594,17 +8573,24 @@ } }, "@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", + "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", "requires": { - "@noble/hashes": "1.3.2" + "@noble/hashes": "1.6.0" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", + "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==" + } } }, "@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", + "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==" }, "@noble/secp256k1": { "version": "1.7.1", @@ -8635,45 +8621,45 @@ } }, "@nomicfoundation/edr": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.3.tgz", - "integrity": "sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.5.tgz", + "integrity": "sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==", "requires": { - "@nomicfoundation/edr-darwin-arm64": "0.6.3", - "@nomicfoundation/edr-darwin-x64": "0.6.3", - "@nomicfoundation/edr-linux-arm64-gnu": "0.6.3", - "@nomicfoundation/edr-linux-arm64-musl": "0.6.3", - "@nomicfoundation/edr-linux-x64-gnu": "0.6.3", - "@nomicfoundation/edr-linux-x64-musl": "0.6.3", - "@nomicfoundation/edr-win32-x64-msvc": "0.6.3" + "@nomicfoundation/edr-darwin-arm64": "0.6.5", + "@nomicfoundation/edr-darwin-x64": "0.6.5", + "@nomicfoundation/edr-linux-arm64-gnu": "0.6.5", + "@nomicfoundation/edr-linux-arm64-musl": "0.6.5", + "@nomicfoundation/edr-linux-x64-gnu": "0.6.5", + "@nomicfoundation/edr-linux-x64-musl": "0.6.5", + "@nomicfoundation/edr-win32-x64-msvc": "0.6.5" }, "dependencies": { "@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.3.tgz", - "integrity": "sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==" + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz", + "integrity": "sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==" } } }, "@nomicfoundation/edr-darwin-arm64": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.3.tgz", - "integrity": "sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==" + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz", + "integrity": "sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==" }, "@nomicfoundation/edr-darwin-x64": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.3.tgz", - "integrity": "sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==" + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz", + "integrity": "sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==" }, "@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.3.tgz", - "integrity": "sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==" + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz", + "integrity": "sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==" }, "@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.3.tgz", - "integrity": "sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==" + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz", + "integrity": "sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==" }, "@nomicfoundation/edr-linux-x64-gnu": { "version": "0.3.8", @@ -8681,14 +8667,14 @@ "integrity": "sha512-6AcvA/XKoipGap5jJmQ9Y6yT7Uf39D9lu2hBcDCXnXbMcXaDGw4mn1/L4R63D+9VGZyu1PqlcJixCUZlGGIWlg==" }, "@nomicfoundation/edr-linux-x64-musl": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.3.tgz", - "integrity": "sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==" + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz", + "integrity": "sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==" }, "@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.3.tgz", - "integrity": "sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==" + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz", + "integrity": "sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==" }, "@nomicfoundation/ethereumjs-common": { "version": "4.0.4", @@ -8744,12 +8730,12 @@ } }, "@nomicfoundation/hardhat-ignition": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.6.tgz", - "integrity": "sha512-PcMf4xlYvwHYej2jcuOd/rBNNMM5FO11vh9c+MF8+m7NxV4b6NOameL3uscoD7ghg0H2GNgnGXgQ67ryRqtdIQ==", + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.9.tgz", + "integrity": "sha512-lSWqhaDOBt6gsqMadkRLvH6HdoFV1v8/bx7z+12cghaOloVwwn48CPoTH2iXXnkqilPGw8rdH5eVTE6UM+2v6Q==", "requires": { - "@nomicfoundation/ignition-core": "^0.15.6", - "@nomicfoundation/ignition-ui": "^0.15.6", + "@nomicfoundation/ignition-core": "^0.15.9", + "@nomicfoundation/ignition-ui": "^0.15.9", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -8770,9 +8756,9 @@ } }, "@nomicfoundation/hardhat-ignition-ethers": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.6.tgz", - "integrity": "sha512-+jXDGWdfkuIGm0W+aFEZ9SLQz2MIj7Cf4j7ANTXUIIbK8sUkvnVOhTTAQEdqa0KgGEb45XS88BPg0w8fixwrXQ==", + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.9.tgz", + "integrity": "sha512-9PwwgLv3z2ec3B26mK0IjiFezHFFBcBcs1qKaRu8SanARE4b7RvrfiLIy8ZXE7HaxgPt32kSsQzehhzAwAIj1Q==", "requires": {} }, "@nomicfoundation/hardhat-network-helpers": { @@ -8790,29 +8776,21 @@ "requires": {} }, "@nomicfoundation/hardhat-verify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz", - "integrity": "sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz", + "integrity": "sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg==", "requires": { "@ethersproject/abi": "^5.1.2", "@ethersproject/address": "^5.0.2", "cbor": "^8.1.0", - "chalk": "^2.4.2", "debug": "^4.1.1", "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.1.0", "semver": "^6.3.0", "table": "^6.8.0", "undici": "^5.14.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, "cbor": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", @@ -8821,52 +8799,11 @@ "nofilter": "^3.1.0" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, "undici": { "version": "5.28.4", "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", @@ -8878,9 +8815,9 @@ } }, "@nomicfoundation/ignition-core": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.6.tgz", - "integrity": "sha512-9eD1NJ2G4vh7IleRNmCz/3bGVoNEPYrRVPqx0uvWzG2xD226GGQcTgtK+NovyxsQOE/AcLF1xjX3/+8kNc1sSg==", + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.9.tgz", + "integrity": "sha512-X8W+7UP/UQPorpHUnGvA1OdsEr/edGi8tDpNwEqzaLm83FMZVbRWdOsr3vNICHN2XMzNY/xIm18Cx7xGKL2PQw==", "requires": { "@ethersproject/address": "5.6.1", "@nomicfoundation/solidity-analyzer": "^0.1.1", @@ -8918,9 +8855,9 @@ } }, "@nomicfoundation/ignition-ui": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.6.tgz", - "integrity": "sha512-CW14g/BVcGZtBSF1K4eZSCjyvtz1fr9yppkFKC+Z0+sm/lXFWpwcwaVN+UiugQ/9wz9HAfSk4Y0gagdAMiSs0w==" + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.9.tgz", + "integrity": "sha512-8lzbT7gpJ5PoowPQDQilkwdyqBviUKDMoHp/5rhgnwG1bDslnCS+Lxuo6s9R2akWu9LtEL14dNyqQb6WsURTag==" }, "@nomicfoundation/solidity-analyzer": { "version": "0.1.2", @@ -9073,6 +9010,15 @@ "graceful-fs": "^4.1.6" } }, + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -9180,17 +9126,6 @@ "@coral-xyz/anchor": "^0.29.0", "@coral-xyz/borsh": "^0.28.0", "buffer": "^6.0.1" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } } }, "@pythnetwork/hermes-client": { @@ -9218,9 +9153,9 @@ } }, "@pythnetwork/price-service-sdk": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.7.1.tgz", - "integrity": "sha512-xr2boVXTyv1KUt/c6llUTfbv2jpud99pWlMJbFaHGUBoygQsByuy7WbjIJKZ+0Blg1itLZl0Lp/pJGGg8SdJoQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.8.0.tgz", + "integrity": "sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==", "requires": { "bn.js": "^5.2.1" } @@ -9436,23 +9371,12 @@ "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", "requires": { "buffer": "~6.0.3" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - } } }, "@solana/web3.js": { - "version": "1.95.5", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.5.tgz", - "integrity": "sha512-hU9cBrbg1z6gEjLH9vwIckGBVB78Ijm0iZFNk4ocm5OD82piPwuk3MeQ1rfiKD9YQtr95krrcaopb49EmQJlRg==", + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.0.tgz", + "integrity": "sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==", "requires": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -9471,28 +9395,6 @@ "superstruct": "^2.0.2" }, "dependencies": { - "@noble/curves": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", - "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", - "requires": { - "@noble/hashes": "1.5.0" - } - }, - "@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==" - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -9646,16 +9548,16 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" }, "@types/mocha": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", - "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==" + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==" }, "@types/node": { - "version": "22.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "requires": { - "undici-types": "~6.19.2" + "undici-types": "~6.20.0" } }, "@types/pbkdf2": { @@ -9672,9 +9574,9 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "@types/qs": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", - "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" }, "@types/secp256k1": { "version": "4.0.6", @@ -9757,9 +9659,9 @@ "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==" }, "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-walk": { "version": "8.3.4", @@ -9933,9 +9835,9 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "requires": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -10018,6 +9920,17 @@ "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } } }, "blakejs": { @@ -10063,12 +9976,11 @@ } }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "braces": { @@ -10121,12 +10033,12 @@ } }, "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "requires": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "buffer-alloc": { @@ -10183,16 +10095,22 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "requires": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" } }, "camelcase": { @@ -10258,9 +10176,9 @@ } }, "chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "requires": { "readdirp": "^4.0.1" } @@ -10276,12 +10194,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" } }, "clean-stack": { @@ -10458,9 +10376,9 @@ } }, "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "concat-map": { "version": "0.0.1", @@ -10563,11 +10481,11 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "requires": { - "node-fetch": "^2.6.12" + "node-fetch": "^2.7.0" }, "dependencies": { "node-fetch": { @@ -10601,9 +10519,9 @@ "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==" }, "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "requires": { "ms": "^2.1.3" } @@ -10631,16 +10549,6 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, "delay": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", @@ -10708,9 +10616,19 @@ } }, "dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } }, "elliptic": { "version": "6.5.4", @@ -10727,9 +10645,9 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" } } }, @@ -10761,18 +10679,23 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, + "es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "requires": { + "es-errors": "^1.3.0" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -10923,13 +10846,6 @@ "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", "requires": { "@noble/hashes": "^1.4.0" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", - "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==" - } } }, "ethereum-cryptography": { @@ -10972,9 +10888,9 @@ } }, "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "ethereumjs-util": { "version": "6.2.1", @@ -11005,23 +10921,50 @@ } }, "ethers": { - "version": "6.13.3", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.3.tgz", - "integrity": "sha512-/DzbZOLVtoO4fKvvQwpEucHAQgIwBGWuRvBdwE/lMXgXvvHHTSkn7XqAQ2b+gjJzZDJjWA9OD05bVceVOsBHbg==", + "version": "6.13.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", + "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", "requires": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", + "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", + "tslib": "2.7.0", "ws": "8.17.1" }, "dependencies": { + "@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "requires": { + "@noble/hashes": "1.3.2" + } + }, + "@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" + }, "@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "requires": { + "undici-types": "~6.19.2" + } + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "requires": {} } } }, @@ -11102,14 +11045,14 @@ "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" }, "fast-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", - "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" }, "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "requires": { "reusify": "^1.0.4" } @@ -11145,11 +11088,12 @@ } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "locate-path": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, "flat": { @@ -11163,9 +11107,9 @@ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -11232,15 +11176,20 @@ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==" }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "requires": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" } }, "get-port": { @@ -11309,16 +11258,15 @@ } }, "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, "glob-parent": { @@ -11360,15 +11308,44 @@ "ignore": "^5.1.1", "merge2": "^1.2.3", "slash": "^3.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "graceful-fs": { "version": "4.2.11", @@ -11395,13 +11372,13 @@ } }, "hardhat": { - "version": "2.22.12", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.12.tgz", - "integrity": "sha512-yok65M+LsOeTBHQsjg//QreGCyrsaNmeLVzhTFqlOvZ4ZE5y69N0wRxH1b2BC9dGK8S8OPUJMNiL9X0RAvbm8w==", + "version": "2.22.17", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.17.tgz", + "integrity": "sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==", "requires": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.6.1", + "@nomicfoundation/edr": "^0.6.5", "@nomicfoundation/ethereumjs-common": "4.0.4", "@nomicfoundation/ethereumjs-tx": "5.0.4", "@nomicfoundation/ethereumjs-util": "9.0.4", @@ -11413,7 +11390,6 @@ "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", "boxen": "^5.1.2", - "chalk": "^2.4.2", "chokidar": "^4.0.0", "ci-info": "^2.0.0", "debug": "^4.1.1", @@ -11421,10 +11397,9 @@ "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", + "find-up": "^5.0.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", - "glob": "7.2.0", "immutable": "^4.0.0-rc.12", "io-ts": "1.10.4", "json-stream-stringify": "^3.1.4", @@ -11433,12 +11408,14 @@ "mnemonist": "^0.38.0", "mocha": "^10.0.0", "p-map": "^4.0.0", + "picocolors": "^1.1.0", "raw-body": "^2.4.1", "resolve": "1.17.0", "semver": "^6.3.0", "solc": "0.8.26", "source-map-support": "^0.5.13", "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.6", "tsort": "0.0.1", "undici": "^5.14.0", "uuid": "^8.3.2", @@ -11469,42 +11446,6 @@ "@scure/base": "~1.1.0" } }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, "ethereum-cryptography": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", @@ -11526,11 +11467,6 @@ "universalify": "^0.1.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -11544,14 +11480,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, "undici": { "version": "5.28.4", "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", @@ -11588,23 +11516,10 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "hash-base": { "version": "3.1.0", @@ -11841,9 +11756,9 @@ "requires": {} }, "jayson": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", - "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", + "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", "requires": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -11872,20 +11787,6 @@ "@types/node": "*" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -11913,9 +11814,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json-stream-stringify": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.5.tgz", - "integrity": "sha512-wurRuTiw27mck9MWaUIGAunfwqhPDxnXQVN/+Rzi+IEQUUALU10AZs1nWkSdtjH7PAVuAUcqQjH11S/JHOWeaA==" + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", + "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==" }, "json-stringify-safe": { "version": "5.0.1", @@ -11947,9 +11848,9 @@ "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==" }, "JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -11990,12 +11891,11 @@ } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -12068,6 +11968,11 @@ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -12126,11 +12031,11 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" } }, "minimist": { @@ -12160,9 +12065,9 @@ } }, "mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", "requires": { "ansi-colors": "^4.1.3", "browser-stdout": "^1.3.1", @@ -12186,14 +12091,6 @@ "yargs-unparser": "^2.0.0" }, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -12209,64 +12106,6 @@ "readdirp": "~3.6.0" } }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -12291,10 +12130,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "optional": true + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" }, "ndjson": { "version": "2.0.0", @@ -12326,9 +12164,9 @@ }, "dependencies": { "@sinonjs/fake-timers": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", - "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "requires": { "@sinonjs/commons": "^3.0.1" } @@ -12373,9 +12211,9 @@ } }, "node-gyp-build": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", - "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==" + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" }, "nofilter": { "version": "3.1.0", @@ -12417,9 +12255,9 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==" }, "obliterator": { "version": "2.0.4", @@ -12458,19 +12296,19 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { - "p-try": "^1.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^3.0.2" } }, "p-map": { @@ -12481,11 +12319,6 @@ "aggregate-error": "^3.0.0" } }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" - }, "pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -12497,9 +12330,9 @@ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -12538,6 +12371,11 @@ "sha.js": "^2.4.8" } }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -12605,9 +12443,9 @@ } }, "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "requires": { "side-channel": "^1.0.6" } @@ -12665,6 +12503,25 @@ "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "requires": { "minimatch": "^3.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "reduce-flatten": { @@ -12759,15 +12616,6 @@ "ws": "^8.5.0" }, "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", @@ -12822,6 +12670,15 @@ "sprintf-js": "~1.0.2" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -12855,6 +12712,14 @@ } } }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -12898,19 +12763,6 @@ "randombytes": "^2.1.0" } }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -12947,17 +12799,82 @@ "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "requires": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" } }, "signal-exit": { @@ -12994,6 +12911,14 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, + "sleep": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/sleep/-/sleep-6.3.0.tgz", + "integrity": "sha512-+WgYl951qdUlb1iS97UvQ01pkauoBK9ML9I/CMPg41v0Ze4EyMlTgFTDDo32iYj98IYqxIjDMRd+L71lawFfpQ==", + "requires": { + "nan": "^2.14.1" + } + }, "slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -13027,6 +12952,11 @@ "tmp": "0.0.33" }, "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -13035,12 +12965,12 @@ } }, "solidity-coverage": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.13.tgz", - "integrity": "sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==", + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", + "integrity": "sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==", "requires": { "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.18.0", + "@solidity-parser/parser": "^0.19.0", "chalk": "^2.4.2", "death": "^1.1.0", "difflib": "^0.2.4", @@ -13061,9 +12991,9 @@ }, "dependencies": { "@solidity-parser/parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", - "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==" + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", + "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==" }, "ansi-styles": { "version": "3.2.1", @@ -13111,11 +13041,6 @@ "universalify": "^0.1.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -13289,9 +13214,9 @@ } }, "table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "requires": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -13375,13 +13300,14 @@ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" }, "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", + "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "mime-types": "^2.1.12", + "safe-buffer": "^5.2.1" } } } @@ -13404,6 +13330,28 @@ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, + "tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "requires": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, + "dependencies": { + "fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" + } + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13490,9 +13438,9 @@ } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "tsort": { "version": "0.0.1", @@ -13544,6 +13492,15 @@ "ts-essentials": "^7.0.1" }, "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -13575,6 +13532,14 @@ "graceful-fs": "^4.1.6" } }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -13593,9 +13558,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" }, "typical": { "version": "4.0.0", @@ -13609,14 +13574,14 @@ "optional": true }, "undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==" }, "undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" }, "universalify": { "version": "2.0.1", @@ -13780,9 +13745,9 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "requires": {} }, "xtend": { @@ -13836,9 +13801,9 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" }, "zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==" } } } diff --git a/oku-custom-order-types/package-lock.json.rej b/oku-custom-order-types/package-lock.json.rej new file mode 100644 index 0000000..26abeca --- /dev/null +++ b/oku-custom-order-types/package-lock.json.rej @@ -0,0 +1,4022 @@ +diff a/oku-custom-order-types/package-lock.json b/oku-custom-order-types/package-lock.json (rejected hunks) +@@ -22,6 +22,7 @@ + "dotenv": "^16.4.5", + "hardhat": "^2.22.5", + "node-fetch": "^3.3.2", ++ "sleep": "^6.3.0", + "typechain": "^8.3.2" + }, + "devDependencies": { +@@ -931,13 +932,13 @@ + } + }, + "node_modules/@matterlabs/hardhat-zksync-verify": { +- "version": "1.6.0", +- "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.6.0.tgz", +- "integrity": "sha512-RsWlQbI23BDXMsxTtvHXpzx1dBotI2p2trvdG+r1uN/KAmMJBOKIqxce2UNXl8skd5Gtysa4GPjXEp4yaf2KrA==", ++ "version": "1.7.1", ++ "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.7.1.tgz", ++ "integrity": "sha512-FtibELgllkyAZORDW4/s/7XSC5DaqAXG0KXMqGipQyXuIXQ9l1kpaHMpoEtHvQL7xxmkgZqCcSZgATnKl91nDg==", + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/address": "5.7.0", +- "@matterlabs/hardhat-zksync-solc": "^1.2.1", ++ "@matterlabs/hardhat-zksync-solc": "^1.2.5", + "@nomicfoundation/hardhat-verify": "^2.0.8", + "axios": "^1.7.2", + "cbor": "^9.0.2", +@@ -977,9 +978,9 @@ + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { +- "version": "4.12.0", +- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", +- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", ++ "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", +@@ -996,22 +997,36 @@ + } + }, + "node_modules/@noble/curves": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", +- "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", ++ "version": "1.7.0", ++ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", ++ "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "dependencies": { +- "@noble/hashes": "1.3.2" ++ "@noble/hashes": "1.6.0" ++ }, ++ "engines": { ++ "node": "^14.21.3 || >=16" ++ }, ++ "funding": { ++ "url": "https://paulmillr.com/funding/" ++ } ++ }, ++ "node_modules/@noble/curves/node_modules/@noble/hashes": { ++ "version": "1.6.0", ++ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", ++ "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==", ++ "engines": { ++ "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { +- "version": "1.3.2", +- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", +- "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", ++ "version": "1.6.1", ++ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", ++ "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "engines": { +- "node": ">= 16" ++ "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" +@@ -1061,50 +1076,50 @@ + } + }, + "node_modules/@nomicfoundation/edr": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.3.tgz", +- "integrity": "sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.5.tgz", ++ "integrity": "sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==", + "dependencies": { +- "@nomicfoundation/edr-darwin-arm64": "0.6.3", +- "@nomicfoundation/edr-darwin-x64": "0.6.3", +- "@nomicfoundation/edr-linux-arm64-gnu": "0.6.3", +- "@nomicfoundation/edr-linux-arm64-musl": "0.6.3", +- "@nomicfoundation/edr-linux-x64-gnu": "0.6.3", +- "@nomicfoundation/edr-linux-x64-musl": "0.6.3", +- "@nomicfoundation/edr-win32-x64-msvc": "0.6.3" ++ "@nomicfoundation/edr-darwin-arm64": "0.6.5", ++ "@nomicfoundation/edr-darwin-x64": "0.6.5", ++ "@nomicfoundation/edr-linux-arm64-gnu": "0.6.5", ++ "@nomicfoundation/edr-linux-arm64-musl": "0.6.5", ++ "@nomicfoundation/edr-linux-x64-gnu": "0.6.5", ++ "@nomicfoundation/edr-linux-x64-musl": "0.6.5", ++ "@nomicfoundation/edr-win32-x64-msvc": "0.6.5" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.3.tgz", +- "integrity": "sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz", ++ "integrity": "sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-darwin-x64": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.3.tgz", +- "integrity": "sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz", ++ "integrity": "sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.3.tgz", +- "integrity": "sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz", ++ "integrity": "sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.3.tgz", +- "integrity": "sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz", ++ "integrity": "sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==", + "engines": { + "node": ">= 18" + } +@@ -1118,25 +1133,25 @@ + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-musl": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.3.tgz", +- "integrity": "sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz", ++ "integrity": "sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.3.tgz", +- "integrity": "sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz", ++ "integrity": "sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr/node_modules/@nomicfoundation/edr-linux-x64-gnu": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.3.tgz", +- "integrity": "sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz", ++ "integrity": "sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==", + "engines": { + "node": ">= 18" + } +@@ -1233,12 +1248,12 @@ + } + }, + "node_modules/@nomicfoundation/hardhat-ignition": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.6.tgz", +- "integrity": "sha512-PcMf4xlYvwHYej2jcuOd/rBNNMM5FO11vh9c+MF8+m7NxV4b6NOameL3uscoD7ghg0H2GNgnGXgQ67ryRqtdIQ==", ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.9.tgz", ++ "integrity": "sha512-lSWqhaDOBt6gsqMadkRLvH6HdoFV1v8/bx7z+12cghaOloVwwn48CPoTH2iXXnkqilPGw8rdH5eVTE6UM+2v6Q==", + "dependencies": { +- "@nomicfoundation/ignition-core": "^0.15.6", +- "@nomicfoundation/ignition-ui": "^0.15.6", ++ "@nomicfoundation/ignition-core": "^0.15.9", ++ "@nomicfoundation/ignition-ui": "^0.15.9", + "chalk": "^4.0.0", + "debug": "^4.3.2", + "fs-extra": "^10.0.0", +@@ -1251,13 +1266,13 @@ + } + }, + "node_modules/@nomicfoundation/hardhat-ignition-ethers": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.6.tgz", +- "integrity": "sha512-+jXDGWdfkuIGm0W+aFEZ9SLQz2MIj7Cf4j7ANTXUIIbK8sUkvnVOhTTAQEdqa0KgGEb45XS88BPg0w8fixwrXQ==", ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.9.tgz", ++ "integrity": "sha512-9PwwgLv3z2ec3B26mK0IjiFezHFFBcBcs1qKaRu8SanARE4b7RvrfiLIy8ZXE7HaxgPt32kSsQzehhzAwAIj1Q==", + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.4", +- "@nomicfoundation/hardhat-ignition": "^0.15.6", +- "@nomicfoundation/ignition-core": "^0.15.6", ++ "@nomicfoundation/hardhat-ignition": "^0.15.9", ++ "@nomicfoundation/ignition-core": "^0.15.9", + "ethers": "^6.7.0", + "hardhat": "^2.18.0" + } +@@ -1312,16 +1327,16 @@ + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { +- "version": "2.0.11", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz", +- "integrity": "sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==", ++ "version": "2.0.12", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz", ++ "integrity": "sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg==", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", +- "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", ++ "picocolors": "^1.1.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" +@@ -1330,17 +1345,6 @@ + "hardhat": "^2.0.4" + } + }, +- "node_modules/@nomicfoundation/hardhat-verify/node_modules/ansi-styles": { +- "version": "3.2.1", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", +- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", +- "dependencies": { +- "color-convert": "^1.9.0" +- }, +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", +@@ -1352,48 +1356,6 @@ + "node": ">=12.19" + } + }, +- "node_modules/@nomicfoundation/hardhat-verify/node_modules/chalk": { +- "version": "2.4.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", +- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", +- "dependencies": { +- "ansi-styles": "^3.2.1", +- "escape-string-regexp": "^1.0.5", +- "supports-color": "^5.3.0" +- }, +- "engines": { +- "node": ">=4" +- } +- }, +- "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-convert": { +- "version": "1.9.3", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", +- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", +- "dependencies": { +- "color-name": "1.1.3" +- } +- }, +- "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-name": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", +- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" +- }, +- "node_modules/@nomicfoundation/hardhat-verify/node_modules/escape-string-regexp": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", +- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", +- "engines": { +- "node": ">=0.8.0" +- } +- }, +- "node_modules/@nomicfoundation/hardhat-verify/node_modules/has-flag": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", +- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", +@@ -1402,17 +1364,6 @@ + "semver": "bin/semver.js" + } + }, +- "node_modules/@nomicfoundation/hardhat-verify/node_modules/supports-color": { +- "version": "5.5.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", +- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", +- "dependencies": { +- "has-flag": "^3.0.0" +- }, +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", +@@ -1425,9 +1376,9 @@ + } + }, + "node_modules/@nomicfoundation/ignition-core": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.6.tgz", +- "integrity": "sha512-9eD1NJ2G4vh7IleRNmCz/3bGVoNEPYrRVPqx0uvWzG2xD226GGQcTgtK+NovyxsQOE/AcLF1xjX3/+8kNc1sSg==", ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.9.tgz", ++ "integrity": "sha512-X8W+7UP/UQPorpHUnGvA1OdsEr/edGi8tDpNwEqzaLm83FMZVbRWdOsr3vNICHN2XMzNY/xIm18Cx7xGKL2PQw==", + "dependencies": { + "@ethersproject/address": "5.6.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", +@@ -1476,9 +1427,9 @@ + } + }, + "node_modules/@nomicfoundation/ignition-ui": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.6.tgz", +- "integrity": "sha512-CW14g/BVcGZtBSF1K4eZSCjyvtz1fr9yppkFKC+Z0+sm/lXFWpwcwaVN+UiugQ/9wz9HAfSk4Y0gagdAMiSs0w==" ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.9.tgz", ++ "integrity": "sha512-8lzbT7gpJ5PoowPQDQilkwdyqBviUKDMoHp/5rhgnwG1bDslnCS+Lxuo6s9R2akWu9LtEL14dNyqQb6WsURTag==" + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.2", +@@ -1662,6 +1613,21 @@ + "graceful-fs": "^4.1.6" + } + }, ++ "node_modules/@nomiclabs/hardhat-docker/node_modules/JSONStream": { ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", ++ "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", ++ "dependencies": { ++ "jsonparse": "^1.2.0", ++ "through": ">=2.2.7 <3" ++ }, ++ "bin": { ++ "JSONStream": "bin.js" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/@nomiclabs/hardhat-docker/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", +@@ -1787,29 +1753,6 @@ + "@solana/web3.js": "^1.30.2" + } + }, +- "node_modules/@pythnetwork/client/node_modules/buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "funding": [ +- { +- "type": "github", +- "url": "https://github.com/sponsors/feross" +- }, +- { +- "type": "patreon", +- "url": "https://www.patreon.com/feross" +- }, +- { +- "type": "consulting", +- "url": "https://feross.org/support" +- } +- ], +- "dependencies": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- }, + "node_modules/@pythnetwork/hermes-client": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@pythnetwork/hermes-client/-/hermes-client-1.2.0.tgz", +@@ -1836,9 +1779,9 @@ + } + }, + "node_modules/@pythnetwork/price-service-sdk": { +- "version": "1.7.1", +- "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.7.1.tgz", +- "integrity": "sha512-xr2boVXTyv1KUt/c6llUTfbv2jpud99pWlMJbFaHGUBoygQsByuy7WbjIJKZ+0Blg1itLZl0Lp/pJGGg8SdJoQ==", ++ "version": "1.8.0", ++ "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.8.0.tgz", ++ "integrity": "sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==", + "dependencies": { + "bn.js": "^5.2.1" + } +@@ -2089,33 +2032,10 @@ + "node": ">=5.10" + } + }, +- "node_modules/@solana/buffer-layout/node_modules/buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "funding": [ +- { +- "type": "github", +- "url": "https://github.com/sponsors/feross" +- }, +- { +- "type": "patreon", +- "url": "https://www.patreon.com/feross" +- }, +- { +- "type": "consulting", +- "url": "https://feross.org/support" +- } +- ], +- "dependencies": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- }, + "node_modules/@solana/web3.js": { +- "version": "1.95.5", +- "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.5.tgz", +- "integrity": "sha512-hU9cBrbg1z6gEjLH9vwIckGBVB78Ijm0iZFNk4ocm5OD82piPwuk3MeQ1rfiKD9YQtr95krrcaopb49EmQJlRg==", ++ "version": "1.98.0", ++ "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.0.tgz", ++ "integrity": "sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==", + "dependencies": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", +@@ -2134,54 +2054,6 @@ + "superstruct": "^2.0.2" + } + }, +- "node_modules/@solana/web3.js/node_modules/@noble/curves": { +- "version": "1.6.0", +- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", +- "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", +- "dependencies": { +- "@noble/hashes": "1.5.0" +- }, +- "engines": { +- "node": "^14.21.3 || >=16" +- }, +- "funding": { +- "url": "https://paulmillr.com/funding/" +- } +- }, +- "node_modules/@solana/web3.js/node_modules/@noble/hashes": { +- "version": "1.5.0", +- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", +- "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", +- "engines": { +- "node": "^14.21.3 || >=16" +- }, +- "funding": { +- "url": "https://paulmillr.com/funding/" +- } +- }, +- "node_modules/@solana/web3.js/node_modules/buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "funding": [ +- { +- "type": "github", +- "url": "https://github.com/sponsors/feross" +- }, +- { +- "type": "patreon", +- "url": "https://www.patreon.com/feross" +- }, +- { +- "type": "consulting", +- "url": "https://feross.org/support" +- } +- ], +- "dependencies": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- }, + "node_modules/@solana/web3.js/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", +@@ -2357,16 +2229,16 @@ + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "node_modules/@types/mocha": { +- "version": "10.0.8", +- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", +- "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==" ++ "version": "10.0.10", ++ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", ++ "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==" + }, + "node_modules/@types/node": { +- "version": "22.7.4", +- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", +- "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", ++ "version": "22.10.2", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", ++ "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "dependencies": { +- "undici-types": "~6.19.2" ++ "undici-types": "~6.20.0" + } + }, + "node_modules/@types/pbkdf2": { +@@ -2383,9 +2255,9 @@ + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/qs": { +- "version": "6.9.16", +- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", +- "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" ++ "version": "6.9.17", ++ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", ++ "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", +@@ -2479,9 +2351,9 @@ + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==" + }, + "node_modules/acorn": { +- "version": "8.12.1", +- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", +- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", ++ "version": "8.14.0", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", ++ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, +@@ -2722,9 +2594,9 @@ + } + }, + "node_modules/axios": { +- "version": "1.7.7", +- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", +- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", ++ "version": "1.7.9", ++ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", ++ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", +@@ -2831,6 +2703,29 @@ + "readable-stream": "^3.4.0" + } + }, ++ "node_modules/bl/node_modules/buffer": { ++ "version": "5.7.1", ++ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", ++ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/feross" ++ }, ++ { ++ "type": "patreon", ++ "url": "https://www.patreon.com/feross" ++ }, ++ { ++ "type": "consulting", ++ "url": "https://feross.org/support" ++ } ++ ], ++ "dependencies": { ++ "base64-js": "^1.3.1", ++ "ieee754": "^1.1.13" ++ } ++ }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", +@@ -2884,12 +2779,11 @@ + } + }, + "node_modules/brace-expansion": { +- "version": "1.1.11", +- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", +- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", ++ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { +- "balanced-match": "^1.0.0", +- "concat-map": "0.0.1" ++ "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { +@@ -2945,9 +2839,9 @@ + } + }, + "node_modules/buffer": { +- "version": "5.7.1", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", +- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", ++ "version": "6.0.3", ++ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", ++ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", +@@ -2964,7 +2858,7 @@ + ], + "dependencies": { + "base64-js": "^1.3.1", +- "ieee754": "^1.1.13" ++ "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-alloc": { +@@ -3034,16 +2928,25 @@ + "node": ">= 0.8" + } + }, +- "node_modules/call-bind": { +- "version": "1.0.7", +- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", +- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", ++ "node_modules/call-bind-apply-helpers": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", ++ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { +- "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", +- "function-bind": "^1.1.2", +- "get-intrinsic": "^1.2.4", +- "set-function-length": "^1.2.1" ++ "function-bind": "^1.1.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, ++ "node_modules/call-bound": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", ++ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" +@@ -3142,9 +3045,9 @@ + } + }, + "node_modules/chokidar": { +- "version": "4.0.1", +- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", +- "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", ++ "version": "4.0.3", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ++ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dependencies": { + "readdirp": "^4.0.1" + }, +@@ -3166,12 +3069,15 @@ + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cipher-base": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", +- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", ++ "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dependencies": { +- "inherits": "^2.0.1", +- "safe-buffer": "^5.0.1" ++ "inherits": "^2.0.4", ++ "safe-buffer": "^5.2.1" ++ }, ++ "engines": { ++ "node": ">= 0.10" + } + }, + "node_modules/clean-stack": { +@@ -3406,12 +3312,9 @@ + } + }, + "node_modules/commander": { +- "version": "8.3.0", +- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", +- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", +- "engines": { +- "node": ">= 12" +- } ++ "version": "2.20.3", ++ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", ++ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/concat-map": { + "version": "0.0.1", +@@ -3522,11 +3425,11 @@ + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/cross-fetch": { +- "version": "3.1.8", +- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", +- "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", ++ "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dependencies": { +- "node-fetch": "^2.6.12" ++ "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { +@@ -3581,9 +3484,9 @@ + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==" + }, + "node_modules/debug": { +- "version": "4.3.7", +- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", +- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", ++ "version": "4.4.0", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", ++ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, +@@ -3631,22 +3534,6 @@ + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, +- "node_modules/define-data-property": { +- "version": "1.1.4", +- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", +- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", +- "dependencies": { +- "es-define-property": "^1.0.0", +- "es-errors": "^1.3.0", +- "gopd": "^1.0.1" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", +@@ -3741,9 +3628,9 @@ + } + }, + "node_modules/dotenv": { +- "version": "16.4.5", +- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", +- "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", ++ "version": "16.4.7", ++ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", ++ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "engines": { + "node": ">=12" + }, +@@ -3751,6 +3638,19 @@ + "url": "https://dotenvx.com" + } + }, ++ "node_modules/dunder-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", ++ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", ++ "dependencies": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "gopd": "^1.2.0" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", +@@ -3766,9 +3666,9 @@ + } + }, + "node_modules/elliptic/node_modules/bn.js": { +- "version": "4.12.0", +- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", +- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", ++ "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", +@@ -3804,12 +3704,9 @@ + } + }, + "node_modules/es-define-property": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", +- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", +- "dependencies": { +- "get-intrinsic": "^1.2.4" +- }, ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ++ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } +@@ -4039,17 +3947,6 @@ + "@noble/hashes": "^1.4.0" + } + }, +- "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { +- "version": "1.5.0", +- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", +- "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", +- "engines": { +- "node": "^14.21.3 || >=16" +- }, +- "funding": { +- "url": "https://paulmillr.com/funding/" +- } +- }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", +@@ -4076,6 +3973,7 @@ + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", ++ "deprecated": "This library has been deprecated and usage is discouraged.", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" +@@ -4090,9 +3988,9 @@ + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { +- "version": "4.12.0", +- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", +- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", ++ "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", +@@ -4124,9 +4022,9 @@ + } + }, + "node_modules/ethers": { +- "version": "6.13.3", +- "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.3.tgz", +- "integrity": "sha512-/DzbZOLVtoO4fKvvQwpEucHAQgIwBGWuRvBdwE/lMXgXvvHHTSkn7XqAQ2b+gjJzZDJjWA9OD05bVceVOsBHbg==", ++ "version": "6.13.4", ++ "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", ++ "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", + "funding": [ + { + "type": "individual", +@@ -4141,19 +4039,69 @@ + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", +- "@types/node": "18.15.13", ++ "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", +- "tslib": "2.4.0", ++ "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, ++ "node_modules/ethers/node_modules/@noble/curves": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", ++ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", ++ "dependencies": { ++ "@noble/hashes": "1.3.2" ++ }, ++ "funding": { ++ "url": "https://paulmillr.com/funding/" ++ } ++ }, ++ "node_modules/ethers/node_modules/@noble/hashes": { ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", ++ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", ++ "engines": { ++ "node": ">= 16" ++ }, ++ "funding": { ++ "url": "https://paulmillr.com/funding/" ++ } ++ }, + "node_modules/ethers/node_modules/@types/node": { +- "version": "18.15.13", +- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", +- "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" ++ "version": "22.7.5", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", ++ "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", ++ "dependencies": { ++ "undici-types": "~6.19.2" ++ } ++ }, ++ "node_modules/ethers/node_modules/undici-types": { ++ "version": "6.19.8", ++ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", ++ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" ++ }, ++ "node_modules/ethers/node_modules/ws": { ++ "version": "8.17.1", ++ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", ++ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", ++ "engines": { ++ "node": ">=10.0.0" ++ }, ++ "peerDependencies": { ++ "bufferutil": "^4.0.1", ++ "utf-8-validate": ">=5.0.2" ++ }, ++ "peerDependenciesMeta": { ++ "bufferutil": { ++ "optional": true ++ }, ++ "utf-8-validate": { ++ "optional": true ++ } ++ } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", +@@ -4247,14 +4195,14 @@ + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" + }, + "node_modules/fast-uri": { +- "version": "3.0.2", +- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", +- "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==" ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", ++ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" + }, + "node_modules/fastq": { +- "version": "1.17.1", +- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", +- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", ++ "version": "1.18.0", ++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", ++ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dependencies": { + "reusify": "^1.0.4" + } +@@ -4309,14 +4257,18 @@ + } + }, + "node_modules/find-up": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", +- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", ++ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { +- "locate-path": "^2.0.0" ++ "locate-path": "^6.0.0", ++ "path-exists": "^4.0.0" + }, + "engines": { +- "node": ">=4" ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { +@@ -4347,9 +4299,9 @@ + } + }, + "node_modules/form-data": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", +- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", ++ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", +@@ -4441,15 +4393,20 @@ + } + }, + "node_modules/get-intrinsic": { +- "version": "1.2.4", +- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", +- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", ++ "version": "1.2.6", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", ++ "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "dependencies": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "dunder-proto": "^1.0.0", ++ "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", +- "has-proto": "^1.0.1", +- "has-symbols": "^1.0.3", +- "hasown": "^2.0.0" ++ "gopd": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "hasown": "^2.0.2", ++ "math-intrinsics": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4543,20 +4500,19 @@ + } + }, + "node_modules/glob": { +- "version": "7.2.0", +- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", +- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", ++ "version": "8.1.0", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", ++ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", +- "minimatch": "^3.0.4", +- "once": "^1.3.0", +- "path-is-absolute": "^1.0.0" ++ "minimatch": "^5.0.1", ++ "once": "^1.3.0" + }, + "engines": { +- "node": "*" ++ "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" +@@ -4615,12 +4571,52 @@ + "node": ">=8" + } + }, +- "node_modules/gopd": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", +- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", ++ "node_modules/globby/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/globby/node_modules/glob": { ++ "version": "7.2.3", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", ++ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", ++ "deprecated": "Glob versions prior to v9 are no longer supported", ++ "dependencies": { ++ "fs.realpath": "^1.0.0", ++ "inflight": "^1.0.4", ++ "inherits": "2", ++ "minimatch": "^3.1.1", ++ "once": "^1.3.0", ++ "path-is-absolute": "^1.0.0" ++ }, ++ "engines": { ++ "node": "*" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/globby/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { +- "get-intrinsic": "^1.1.3" ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, ++ "node_modules/gopd": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", ++ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", ++ "engines": { ++ "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -4660,13 +4656,13 @@ + } + }, + "node_modules/hardhat": { +- "version": "2.22.12", +- "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.12.tgz", +- "integrity": "sha512-yok65M+LsOeTBHQsjg//QreGCyrsaNmeLVzhTFqlOvZ4ZE5y69N0wRxH1b2BC9dGK8S8OPUJMNiL9X0RAvbm8w==", ++ "version": "2.22.17", ++ "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.17.tgz", ++ "integrity": "sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", +- "@nomicfoundation/edr": "^0.6.1", ++ "@nomicfoundation/edr": "^0.6.5", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", +@@ -4678,7 +4674,6 @@ + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", +- "chalk": "^2.4.2", + "chokidar": "^4.0.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", +@@ -4686,10 +4681,9 @@ + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", +- "find-up": "^2.1.0", ++ "find-up": "^5.0.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", +- "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "json-stream-stringify": "^3.1.4", +@@ -4698,12 +4692,14 @@ + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", ++ "picocolors": "^1.1.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.8.26", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", ++ "tinyglobby": "^0.2.6", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", +@@ -4780,51 +4776,6 @@ + "@scure/base": "~1.1.0" + } + }, +- "node_modules/hardhat/node_modules/ansi-styles": { +- "version": "3.2.1", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", +- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", +- "dependencies": { +- "color-convert": "^1.9.0" +- }, +- "engines": { +- "node": ">=4" +- } +- }, +- "node_modules/hardhat/node_modules/chalk": { +- "version": "2.4.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", +- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", +- "dependencies": { +- "ansi-styles": "^3.2.1", +- "escape-string-regexp": "^1.0.5", +- "supports-color": "^5.3.0" +- }, +- "engines": { +- "node": ">=4" +- } +- }, +- "node_modules/hardhat/node_modules/color-convert": { +- "version": "1.9.3", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", +- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", +- "dependencies": { +- "color-name": "1.1.3" +- } +- }, +- "node_modules/hardhat/node_modules/color-name": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", +- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" +- }, +- "node_modules/hardhat/node_modules/escape-string-regexp": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", +- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", +- "engines": { +- "node": ">=0.8.0" +- } +- }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", +@@ -4849,14 +4800,6 @@ + "node": ">=6 <7 || >=8" + } + }, +- "node_modules/hardhat/node_modules/has-flag": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", +- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", +@@ -4873,17 +4816,6 @@ + "semver": "bin/semver.js" + } + }, +- "node_modules/hardhat/node_modules/supports-color": { +- "version": "5.5.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", +- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", +- "dependencies": { +- "has-flag": "^3.0.0" +- }, +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/hardhat/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", +@@ -4931,32 +4863,10 @@ + "node": ">=8" + } + }, +- "node_modules/has-property-descriptors": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", +- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", +- "dependencies": { +- "es-define-property": "^1.0.0" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, +- "node_modules/has-proto": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", +- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, + "node_modules/has-symbols": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", +- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", ++ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, +@@ -5282,9 +5192,9 @@ + } + }, + "node_modules/jayson": { +- "version": "4.1.2", +- "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", +- "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", ++ "version": "4.1.3", ++ "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", ++ "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", +@@ -5319,26 +5229,6 @@ + "@types/node": "*" + } + }, +- "node_modules/jayson/node_modules/commander": { +- "version": "2.20.3", +- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", +- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" +- }, +- "node_modules/jayson/node_modules/JSONStream": { +- "version": "1.3.5", +- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", +- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", +- "dependencies": { +- "jsonparse": "^1.2.0", +- "through": ">=2.2.7 <3" +- }, +- "bin": { +- "JSONStream": "bin.js" +- }, +- "engines": { +- "node": "*" +- } +- }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", +@@ -5381,9 +5271,9 @@ + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/json-stream-stringify": { +- "version": "3.1.5", +- "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.5.tgz", +- "integrity": "sha512-wurRuTiw27mck9MWaUIGAunfwqhPDxnXQVN/+Rzi+IEQUUALU10AZs1nWkSdtjH7PAVuAUcqQjH11S/JHOWeaA==", ++ "version": "3.1.6", ++ "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", ++ "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "engines": { + "node": ">=7.10.1" + } +@@ -5432,9 +5322,9 @@ + } + }, + "node_modules/JSONStream": { +- "version": "1.3.2", +- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", +- "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", ++ "version": "1.3.5", ++ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", ++ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" +@@ -5494,18 +5384,20 @@ + } + }, + "node_modules/locate-path": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", +- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", ++ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { +- "p-locate": "^2.0.0", +- "path-exists": "^3.0.0" ++ "p-locate": "^5.0.0" + }, + "engines": { +- "node": ">=4" +- } +- }, +- "node_modules/lodash": { ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" ++ } ++ }, ++ "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" +@@ -5581,6 +5473,14 @@ + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" + }, ++ "node_modules/math-intrinsics": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ++ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", ++ "engines": { ++ "node": ">= 0.4" ++ } ++ }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", +@@ -5654,14 +5554,14 @@ + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { +- "version": "3.1.2", +- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", +- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "version": "5.1.6", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", ++ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { +- "brace-expansion": "^1.1.7" ++ "brace-expansion": "^2.0.1" + }, + "engines": { +- "node": "*" ++ "node": ">=10" + } + }, + "node_modules/minimist": { +@@ -5697,9 +5597,9 @@ + } + }, + "node_modules/mocha": { +- "version": "10.7.3", +- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", +- "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", ++ "version": "10.8.2", ++ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", ++ "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", +@@ -5730,14 +5630,6 @@ + "node": ">= 14.0.0" + } + }, +- "node_modules/mocha/node_modules/brace-expansion": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", +- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", +- "dependencies": { +- "balanced-match": "^1.0.0" +- } +- }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", +@@ -5761,101 +5653,6 @@ + "fsevents": "~2.3.2" + } + }, +- "node_modules/mocha/node_modules/find-up": { +- "version": "5.0.0", +- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", +- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", +- "dependencies": { +- "locate-path": "^6.0.0", +- "path-exists": "^4.0.0" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, +- "node_modules/mocha/node_modules/glob": { +- "version": "8.1.0", +- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", +- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", +- "deprecated": "Glob versions prior to v9 are no longer supported", +- "dependencies": { +- "fs.realpath": "^1.0.0", +- "inflight": "^1.0.4", +- "inherits": "2", +- "minimatch": "^5.0.1", +- "once": "^1.3.0" +- }, +- "engines": { +- "node": ">=12" +- }, +- "funding": { +- "url": "https://github.com/sponsors/isaacs" +- } +- }, +- "node_modules/mocha/node_modules/locate-path": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", +- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", +- "dependencies": { +- "p-locate": "^5.0.0" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, +- "node_modules/mocha/node_modules/minimatch": { +- "version": "5.1.6", +- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", +- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", +- "dependencies": { +- "brace-expansion": "^2.0.1" +- }, +- "engines": { +- "node": ">=10" +- } +- }, +- "node_modules/mocha/node_modules/p-limit": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", +- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", +- "dependencies": { +- "yocto-queue": "^0.1.0" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, +- "node_modules/mocha/node_modules/p-locate": { +- "version": "5.0.0", +- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", +- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", +- "dependencies": { +- "p-limit": "^3.0.2" +- }, +- "engines": { +- "node": ">=10" +- }, +- "funding": { +- "url": "https://github.com/sponsors/sindresorhus" +- } +- }, +- "node_modules/mocha/node_modules/path-exists": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", +- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", +- "engines": { +- "node": ">=8" +- } +- }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", +@@ -5887,10 +5684,9 @@ + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nan": { +- "version": "2.20.0", +- "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", +- "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", +- "optional": true ++ "version": "2.22.0", ++ "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", ++ "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" + }, + "node_modules/ndjson": { + "version": "2.0.0", +@@ -5928,9 +5724,9 @@ + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { +- "version": "13.0.2", +- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", +- "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", ++ "version": "13.0.5", ++ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", ++ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } +@@ -5993,9 +5789,9 @@ + } + }, + "node_modules/node-gyp-build": { +- "version": "4.8.2", +- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", +- "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", ++ "version": "4.8.4", ++ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", ++ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", +@@ -6056,9 +5852,9 @@ + } + }, + "node_modules/object-inspect": { +- "version": "1.13.2", +- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", +- "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", ++ "version": "1.13.3", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", ++ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "engines": { + "node": ">= 0.4" + }, +@@ -6109,25 +5905,31 @@ + } + }, + "node_modules/p-limit": { +- "version": "1.3.0", +- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", +- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", ++ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { +- "p-try": "^1.0.0" ++ "yocto-queue": "^0.1.0" + }, + "engines": { +- "node": ">=4" ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", +- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", ++ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { +- "p-limit": "^1.1.0" ++ "p-limit": "^3.0.2" + }, + "engines": { +- "node": ">=4" ++ "node": ">=10" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { +@@ -6144,14 +5946,6 @@ + "url": "https://github.com/sponsors/sindresorhus" + } + }, +- "node_modules/p-try": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", +- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", +@@ -6163,11 +5957,11 @@ + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/path-exists": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", +- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", ++ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { +- "node": ">=4" ++ "node": ">=8" + } + }, + "node_modules/path-is-absolute": { +@@ -6222,6 +6016,11 @@ + "node": ">=0.12" + } + }, ++ "node_modules/picocolors": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", ++ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" ++ }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", +@@ -6313,9 +6112,9 @@ + } + }, + "node_modules/qs": { +- "version": "6.13.0", +- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", +- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", ++ "version": "6.13.1", ++ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", ++ "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "dependencies": { + "side-channel": "^1.0.6" + }, +@@ -6414,6 +6213,26 @@ + "node": ">=6.0.0" + } + }, ++ "node_modules/recursive-readdir/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/recursive-readdir/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", +@@ -6543,29 +6362,6 @@ + "utf-8-validate": "^5.0.2" + } + }, +- "node_modules/rpc-websockets/node_modules/buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "funding": [ +- { +- "type": "github", +- "url": "https://github.com/sponsors/feross" +- }, +- { +- "type": "patreon", +- "url": "https://www.patreon.com/feross" +- }, +- { +- "type": "consulting", +- "url": "https://feross.org/support" +- } +- ], +- "dependencies": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- }, + "node_modules/rpc-websockets/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", +@@ -6649,6 +6445,15 @@ + "sprintf-js": "~1.0.2" + } + }, ++ "node_modules/sc-istanbul/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", +@@ -6697,6 +6502,17 @@ + "node": ">=4" + } + }, ++ "node_modules/sc-istanbul/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", +@@ -6751,22 +6567,6 @@ + "randombytes": "^2.1.0" + } + }, +- "node_modules/set-function-length": { +- "version": "1.2.2", +- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", +- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", +- "dependencies": { +- "define-data-property": "^1.1.4", +- "es-errors": "^1.3.0", +- "function-bind": "^1.1.2", +- "get-intrinsic": "^1.2.4", +- "gopd": "^1.0.1", +- "has-property-descriptors": "^1.0.2" +- }, +- "engines": { +- "node": ">= 0.4" +- } +- }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", +@@ -6817,15 +6617,106 @@ + "node": ">=4" + } + }, ++ "node_modules/shelljs/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "node_modules/shelljs/node_modules/glob": { ++ "version": "7.2.3", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", ++ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", ++ "deprecated": "Glob versions prior to v9 are no longer supported", ++ "dependencies": { ++ "fs.realpath": "^1.0.0", ++ "inflight": "^1.0.4", ++ "inherits": "2", ++ "minimatch": "^3.1.1", ++ "once": "^1.3.0", ++ "path-is-absolute": "^1.0.0" ++ }, ++ "engines": { ++ "node": "*" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/isaacs" ++ } ++ }, ++ "node_modules/shelljs/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/side-channel": { +- "version": "1.0.6", +- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", +- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", ++ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { +- "call-bind": "^1.0.7", + "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.4", +- "object-inspect": "^1.13.1" ++ "object-inspect": "^1.13.3", ++ "side-channel-list": "^1.0.0", ++ "side-channel-map": "^1.0.1", ++ "side-channel-weakmap": "^1.0.2" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-list": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", ++ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", ++ "dependencies": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-map": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", ++ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3" ++ }, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, ++ "node_modules/side-channel-weakmap": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", ++ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", ++ "dependencies": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3", ++ "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" +@@ -6878,6 +6769,18 @@ + "node": ">=8" + } + }, ++ "node_modules/sleep": { ++ "version": "6.3.0", ++ "resolved": "https://registry.npmjs.org/sleep/-/sleep-6.3.0.tgz", ++ "integrity": "sha512-+WgYl951qdUlb1iS97UvQ01pkauoBK9ML9I/CMPg41v0Ze4EyMlTgFTDDo32iYj98IYqxIjDMRd+L71lawFfpQ==", ++ "hasInstallScript": true, ++ "dependencies": { ++ "nan": "^2.14.1" ++ }, ++ "engines": { ++ "node": ">=0.8.0" ++ } ++ }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", +@@ -6920,7 +6823,15 @@ + "solcjs": "solc.js" + }, + "engines": { +- "node": ">=10.0.0" ++ "node": ">=10.0.0" ++ } ++ }, ++ "node_modules/solc/node_modules/commander": { ++ "version": "8.3.0", ++ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", ++ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", ++ "engines": { ++ "node": ">= 12" + } + }, + "node_modules/solc/node_modules/semver": { +@@ -6932,12 +6843,12 @@ + } + }, + "node_modules/solidity-coverage": { +- "version": "0.8.13", +- "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.13.tgz", +- "integrity": "sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==", ++ "version": "0.8.14", ++ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", ++ "integrity": "sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==", + "dependencies": { + "@ethersproject/abi": "^5.0.9", +- "@solidity-parser/parser": "^0.18.0", ++ "@solidity-parser/parser": "^0.19.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "difflib": "^0.2.4", +@@ -6964,9 +6875,9 @@ + } + }, + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { +- "version": "0.18.0", +- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", +- "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==" ++ "version": "0.19.0", ++ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", ++ "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==" + }, + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", +@@ -7250,9 +7161,9 @@ + } + }, + "node_modules/table": { +- "version": "6.8.2", +- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", +- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", ++ "version": "6.9.0", ++ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", ++ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", +@@ -7352,13 +7263,14 @@ + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "node_modules/then-request/node_modules/form-data": { +- "version": "2.5.1", +- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", +- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", ++ "version": "2.5.2", ++ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", ++ "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", +- "mime-types": "^2.1.12" ++ "mime-types": "^2.1.12", ++ "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" +@@ -7382,6 +7294,42 @@ + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, ++ "node_modules/tinyglobby": { ++ "version": "0.2.10", ++ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", ++ "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", ++ "dependencies": { ++ "fdir": "^6.4.2", ++ "picomatch": "^4.0.2" ++ }, ++ "engines": { ++ "node": ">=12.0.0" ++ } ++ }, ++ "node_modules/tinyglobby/node_modules/fdir": { ++ "version": "6.4.2", ++ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", ++ "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", ++ "peerDependencies": { ++ "picomatch": "^3 || ^4" ++ }, ++ "peerDependenciesMeta": { ++ "picomatch": { ++ "optional": true ++ } ++ } ++ }, ++ "node_modules/tinyglobby/node_modules/picomatch": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", ++ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", ++ "engines": { ++ "node": ">=12" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/jonschlinkert" ++ } ++ }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", +@@ -7505,9 +7453,9 @@ + } + }, + "node_modules/tslib": { +- "version": "2.4.0", +- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", +- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" ++ "version": "2.7.0", ++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", ++ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, + "node_modules/tsort": { + "version": "0.0.1", +@@ -7577,6 +7525,15 @@ + "typescript": ">=4.3.0" + } + }, ++ "node_modules/typechain/node_modules/brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "dependencies": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", +@@ -7618,6 +7575,17 @@ + "graceful-fs": "^4.1.6" + } + }, ++ "node_modules/typechain/node_modules/minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "dependencies": { ++ "brace-expansion": "^1.1.7" ++ }, ++ "engines": { ++ "node": "*" ++ } ++ }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", +@@ -7643,9 +7611,9 @@ + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { +- "version": "5.6.2", +- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", +- "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", ++ "version": "5.7.2", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", ++ "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" +@@ -7675,17 +7643,17 @@ + } + }, + "node_modules/undici": { +- "version": "6.19.8", +- "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", +- "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", ++ "version": "6.21.0", ++ "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", ++ "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { +- "version": "6.19.8", +- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", +- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" ++ "version": "6.20.0", ++ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", ++ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "node_modules/universalify": { + "version": "2.0.1", +@@ -7894,9 +7862,9 @@ + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { +- "version": "8.17.1", +- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", +- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", ++ "version": "8.18.0", ++ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", ++ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, +@@ -7988,9 +7956,9 @@ + } + }, + "node_modules/zod": { +- "version": "3.23.8", +- "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", +- "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", ++ "version": "3.24.1", ++ "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", ++ "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } +@@ -8534,13 +8502,13 @@ + } + }, + "@matterlabs/hardhat-zksync-verify": { +- "version": "1.6.0", +- "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.6.0.tgz", +- "integrity": "sha512-RsWlQbI23BDXMsxTtvHXpzx1dBotI2p2trvdG+r1uN/KAmMJBOKIqxce2UNXl8skd5Gtysa4GPjXEp4yaf2KrA==", ++ "version": "1.7.1", ++ "resolved": "https://registry.npmjs.org/@matterlabs/hardhat-zksync-verify/-/hardhat-zksync-verify-1.7.1.tgz", ++ "integrity": "sha512-FtibELgllkyAZORDW4/s/7XSC5DaqAXG0KXMqGipQyXuIXQ9l1kpaHMpoEtHvQL7xxmkgZqCcSZgATnKl91nDg==", + "requires": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/address": "5.7.0", +- "@matterlabs/hardhat-zksync-solc": "^1.2.1", ++ "@matterlabs/hardhat-zksync-solc": "^1.2.5", + "@nomicfoundation/hardhat-verify": "^2.0.8", + "axios": "^1.7.2", + "cbor": "^9.0.2", +@@ -8573,9 +8541,9 @@ + } + }, + "bn.js": { +- "version": "4.12.0", +- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", +- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", ++ "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "ethereumjs-util": { + "version": "6.2.1", +@@ -8594,17 +8562,24 @@ + } + }, + "@noble/curves": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", +- "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", ++ "version": "1.7.0", ++ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz", ++ "integrity": "sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==", + "requires": { +- "@noble/hashes": "1.3.2" ++ "@noble/hashes": "1.6.0" ++ }, ++ "dependencies": { ++ "@noble/hashes": { ++ "version": "1.6.0", ++ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz", ++ "integrity": "sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==" ++ } + } + }, + "@noble/hashes": { +- "version": "1.3.2", +- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", +- "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" ++ "version": "1.6.1", ++ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", ++ "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==" + }, + "@noble/secp256k1": { + "version": "1.7.1", +@@ -8635,45 +8610,45 @@ + } + }, + "@nomicfoundation/edr": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.3.tgz", +- "integrity": "sha512-hThe5ORR75WFYTXKL0K2AyLDxkTMrG+VQ1yL9BhQYsuh3OIH+3yNDxMz2LjfvrpOrMmJ4kk5NKdFewpqDojjXQ==", ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.5.tgz", ++ "integrity": "sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==", + "requires": { +- "@nomicfoundation/edr-darwin-arm64": "0.6.3", +- "@nomicfoundation/edr-darwin-x64": "0.6.3", +- "@nomicfoundation/edr-linux-arm64-gnu": "0.6.3", +- "@nomicfoundation/edr-linux-arm64-musl": "0.6.3", +- "@nomicfoundation/edr-linux-x64-gnu": "0.6.3", +- "@nomicfoundation/edr-linux-x64-musl": "0.6.3", +- "@nomicfoundation/edr-win32-x64-msvc": "0.6.3" ++ "@nomicfoundation/edr-darwin-arm64": "0.6.5", ++ "@nomicfoundation/edr-darwin-x64": "0.6.5", ++ "@nomicfoundation/edr-linux-arm64-gnu": "0.6.5", ++ "@nomicfoundation/edr-linux-arm64-musl": "0.6.5", ++ "@nomicfoundation/edr-linux-x64-gnu": "0.6.5", ++ "@nomicfoundation/edr-linux-x64-musl": "0.6.5", ++ "@nomicfoundation/edr-win32-x64-msvc": "0.6.5" + }, + "dependencies": { + "@nomicfoundation/edr-linux-x64-gnu": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.3.tgz", +- "integrity": "sha512-3AUferhkLIXtLV63w5GjpHttzdxZ36i656XMy+pkBZbbiqnzIVeKWg6DJv1A94fQY16gB4gqj9CLq4CWvbNN6w==" ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz", ++ "integrity": "sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==" + } + } + }, + "@nomicfoundation/edr-darwin-arm64": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.3.tgz", +- "integrity": "sha512-hqtI7tYDqKG5PDmZ//Z65EH5cgH8VL/SAAu50rpHP7WAVfJWkOCcYbecywwF6nhHdonJbRTDGAeG1/+VOy6zew==" ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz", ++ "integrity": "sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==" + }, + "@nomicfoundation/edr-darwin-x64": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.3.tgz", +- "integrity": "sha512-4fGi79/lyOlRUORhCYsYb3sWqRHuHT7qqzyZfZuNOn8llaxmT1k36xNmvpyg37R8SzjnhT/DzoukSJrs23Ip9Q==" ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz", ++ "integrity": "sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==" + }, + "@nomicfoundation/edr-linux-arm64-gnu": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.3.tgz", +- "integrity": "sha512-yFFTvGFMhfAvQ1Z2itUh1jpoUA+mVROyVELcaxjIq8fyg602lQmbS+NXkhQ+oaeDgJ+06mSENrHBg4fcfRf9cw==" ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz", ++ "integrity": "sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==" + }, + "@nomicfoundation/edr-linux-arm64-musl": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.3.tgz", +- "integrity": "sha512-pOKmd0Fa3a6BHg5qbjbl/jMRELVi9oazbfiuU7Bvgn/dpTK+ID3jwT0SXiuC2zxjmPByWgXL6G9XRf5BPAM2rQ==" ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz", ++ "integrity": "sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==" + }, + "@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.3.8", +@@ -8681,14 +8656,14 @@ + "integrity": "sha512-6AcvA/XKoipGap5jJmQ9Y6yT7Uf39D9lu2hBcDCXnXbMcXaDGw4mn1/L4R63D+9VGZyu1PqlcJixCUZlGGIWlg==" + }, + "@nomicfoundation/edr-linux-x64-musl": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.3.tgz", +- "integrity": "sha512-fr6bD872WIBXe9YnTDi0CzYepMcYRgSnkVqn0yK4wRnIvKrloWhxXNVY45GVIl51aNZguBnvoA4WEt6HIazs3A==" ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz", ++ "integrity": "sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==" + }, + "@nomicfoundation/edr-win32-x64-msvc": { +- "version": "0.6.3", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.3.tgz", +- "integrity": "sha512-sn34MvN1ajw2Oq1+Drpxej78Z0HfIzI4p4WlolupAV9dOZKzp2JAIQeLVfZpjIFbF3zuyxLPP4dUBrQoFPEqhA==" ++ "version": "0.6.5", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz", ++ "integrity": "sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==" + }, + "@nomicfoundation/ethereumjs-common": { + "version": "4.0.4", +@@ -8744,12 +8719,12 @@ + } + }, + "@nomicfoundation/hardhat-ignition": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.6.tgz", +- "integrity": "sha512-PcMf4xlYvwHYej2jcuOd/rBNNMM5FO11vh9c+MF8+m7NxV4b6NOameL3uscoD7ghg0H2GNgnGXgQ67ryRqtdIQ==", ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.9.tgz", ++ "integrity": "sha512-lSWqhaDOBt6gsqMadkRLvH6HdoFV1v8/bx7z+12cghaOloVwwn48CPoTH2iXXnkqilPGw8rdH5eVTE6UM+2v6Q==", + "requires": { +- "@nomicfoundation/ignition-core": "^0.15.6", +- "@nomicfoundation/ignition-ui": "^0.15.6", ++ "@nomicfoundation/ignition-core": "^0.15.9", ++ "@nomicfoundation/ignition-ui": "^0.15.9", + "chalk": "^4.0.0", + "debug": "^4.3.2", + "fs-extra": "^10.0.0", +@@ -8770,9 +8745,9 @@ + } + }, + "@nomicfoundation/hardhat-ignition-ethers": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.6.tgz", +- "integrity": "sha512-+jXDGWdfkuIGm0W+aFEZ9SLQz2MIj7Cf4j7ANTXUIIbK8sUkvnVOhTTAQEdqa0KgGEb45XS88BPg0w8fixwrXQ==", ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.9.tgz", ++ "integrity": "sha512-9PwwgLv3z2ec3B26mK0IjiFezHFFBcBcs1qKaRu8SanARE4b7RvrfiLIy8ZXE7HaxgPt32kSsQzehhzAwAIj1Q==", + "requires": {} + }, + "@nomicfoundation/hardhat-network-helpers": { +@@ -8790,29 +8765,21 @@ + "requires": {} + }, + "@nomicfoundation/hardhat-verify": { +- "version": "2.0.11", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.11.tgz", +- "integrity": "sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==", ++ "version": "2.0.12", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.12.tgz", ++ "integrity": "sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg==", + "requires": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", +- "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", ++ "picocolors": "^1.1.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "dependencies": { +- "ansi-styles": { +- "version": "3.2.1", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", +- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", +- "requires": { +- "color-convert": "^1.9.0" +- } +- }, + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", +@@ -8821,52 +8788,11 @@ + "nofilter": "^3.1.0" + } + }, +- "chalk": { +- "version": "2.4.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", +- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", +- "requires": { +- "ansi-styles": "^3.2.1", +- "escape-string-regexp": "^1.0.5", +- "supports-color": "^5.3.0" +- } +- }, +- "color-convert": { +- "version": "1.9.3", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", +- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", +- "requires": { +- "color-name": "1.1.3" +- } +- }, +- "color-name": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", +- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" +- }, +- "escape-string-regexp": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", +- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" +- }, +- "has-flag": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", +- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" +- }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, +- "supports-color": { +- "version": "5.5.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", +- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", +- "requires": { +- "has-flag": "^3.0.0" +- } +- }, + "undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", +@@ -8878,9 +8804,9 @@ + } + }, + "@nomicfoundation/ignition-core": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.6.tgz", +- "integrity": "sha512-9eD1NJ2G4vh7IleRNmCz/3bGVoNEPYrRVPqx0uvWzG2xD226GGQcTgtK+NovyxsQOE/AcLF1xjX3/+8kNc1sSg==", ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.9.tgz", ++ "integrity": "sha512-X8W+7UP/UQPorpHUnGvA1OdsEr/edGi8tDpNwEqzaLm83FMZVbRWdOsr3vNICHN2XMzNY/xIm18Cx7xGKL2PQw==", + "requires": { + "@ethersproject/address": "5.6.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", +@@ -8918,9 +8844,9 @@ + } + }, + "@nomicfoundation/ignition-ui": { +- "version": "0.15.6", +- "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.6.tgz", +- "integrity": "sha512-CW14g/BVcGZtBSF1K4eZSCjyvtz1fr9yppkFKC+Z0+sm/lXFWpwcwaVN+UiugQ/9wz9HAfSk4Y0gagdAMiSs0w==" ++ "version": "0.15.9", ++ "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.9.tgz", ++ "integrity": "sha512-8lzbT7gpJ5PoowPQDQilkwdyqBviUKDMoHp/5rhgnwG1bDslnCS+Lxuo6s9R2akWu9LtEL14dNyqQb6WsURTag==" + }, + "@nomicfoundation/solidity-analyzer": { + "version": "0.1.2", +@@ -9073,6 +8999,15 @@ + "graceful-fs": "^4.1.6" + } + }, ++ "JSONStream": { ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", ++ "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", ++ "requires": { ++ "jsonparse": "^1.2.0", ++ "through": ">=2.2.7 <3" ++ } ++ }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", +@@ -9180,17 +9115,6 @@ + "@coral-xyz/anchor": "^0.29.0", + "@coral-xyz/borsh": "^0.28.0", + "buffer": "^6.0.1" +- }, +- "dependencies": { +- "buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "requires": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- } + } + }, + "@pythnetwork/hermes-client": { +@@ -9218,9 +9142,9 @@ + } + }, + "@pythnetwork/price-service-sdk": { +- "version": "1.7.1", +- "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.7.1.tgz", +- "integrity": "sha512-xr2boVXTyv1KUt/c6llUTfbv2jpud99pWlMJbFaHGUBoygQsByuy7WbjIJKZ+0Blg1itLZl0Lp/pJGGg8SdJoQ==", ++ "version": "1.8.0", ++ "resolved": "https://registry.npmjs.org/@pythnetwork/price-service-sdk/-/price-service-sdk-1.8.0.tgz", ++ "integrity": "sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA==", + "requires": { + "bn.js": "^5.2.1" + } +@@ -9436,23 +9360,12 @@ + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "requires": { + "buffer": "~6.0.3" +- }, +- "dependencies": { +- "buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "requires": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- } + } + }, + "@solana/web3.js": { +- "version": "1.95.5", +- "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.5.tgz", +- "integrity": "sha512-hU9cBrbg1z6gEjLH9vwIckGBVB78Ijm0iZFNk4ocm5OD82piPwuk3MeQ1rfiKD9YQtr95krrcaopb49EmQJlRg==", ++ "version": "1.98.0", ++ "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.98.0.tgz", ++ "integrity": "sha512-nz3Q5OeyGFpFCR+erX2f6JPt3sKhzhYcSycBCSPkWjzSVDh/Rr1FqTVMRe58FKO16/ivTUcuJjeS5MyBvpkbzA==", + "requires": { + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", +@@ -9471,28 +9384,6 @@ + "superstruct": "^2.0.2" + }, + "dependencies": { +- "@noble/curves": { +- "version": "1.6.0", +- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", +- "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", +- "requires": { +- "@noble/hashes": "1.5.0" +- } +- }, +- "@noble/hashes": { +- "version": "1.5.0", +- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", +- "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==" +- }, +- "buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "requires": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", +@@ -9646,16 +9537,16 @@ + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "@types/mocha": { +- "version": "10.0.8", +- "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", +- "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==" ++ "version": "10.0.10", ++ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", ++ "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==" + }, + "@types/node": { +- "version": "22.7.4", +- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", +- "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", ++ "version": "22.10.2", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", ++ "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "requires": { +- "undici-types": "~6.19.2" ++ "undici-types": "~6.20.0" + } + }, + "@types/pbkdf2": { +@@ -9672,9 +9563,9 @@ + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "@types/qs": { +- "version": "6.9.16", +- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", +- "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" ++ "version": "6.9.17", ++ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", ++ "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==" + }, + "@types/secp256k1": { + "version": "4.0.6", +@@ -9757,9 +9648,9 @@ + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==" + }, + "acorn": { +- "version": "8.12.1", +- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", +- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==" ++ "version": "8.14.0", ++ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", ++ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" + }, + "acorn-walk": { + "version": "8.3.4", +@@ -9933,9 +9824,9 @@ + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "axios": { +- "version": "1.7.7", +- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", +- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", ++ "version": "1.7.9", ++ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", ++ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", +@@ -10018,6 +9909,17 @@ + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" ++ }, ++ "dependencies": { ++ "buffer": { ++ "version": "5.7.1", ++ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", ++ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", ++ "requires": { ++ "base64-js": "^1.3.1", ++ "ieee754": "^1.1.13" ++ } ++ } + } + }, + "blakejs": { +@@ -10063,12 +9965,11 @@ + } + }, + "brace-expansion": { +- "version": "1.1.11", +- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", +- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "version": "2.0.1", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", ++ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { +- "balanced-match": "^1.0.0", +- "concat-map": "0.0.1" ++ "balanced-match": "^1.0.0" + } + }, + "braces": { +@@ -10121,12 +10022,12 @@ + } + }, + "buffer": { +- "version": "5.7.1", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", +- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", ++ "version": "6.0.3", ++ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", ++ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", +- "ieee754": "^1.1.13" ++ "ieee754": "^1.2.1" + } + }, + "buffer-alloc": { +@@ -10183,16 +10084,22 @@ + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, +- "call-bind": { +- "version": "1.0.7", +- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", +- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", ++ "call-bind-apply-helpers": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", ++ "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "requires": { +- "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", +- "function-bind": "^1.1.2", +- "get-intrinsic": "^1.2.4", +- "set-function-length": "^1.2.1" ++ "function-bind": "^1.1.2" ++ } ++ }, ++ "call-bound": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", ++ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", ++ "requires": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "get-intrinsic": "^1.2.6" + } + }, + "camelcase": { +@@ -10258,9 +10165,9 @@ + } + }, + "chokidar": { +- "version": "4.0.1", +- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", +- "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", ++ "version": "4.0.3", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", ++ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "requires": { + "readdirp": "^4.0.1" + } +@@ -10276,12 +10183,12 @@ + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", +- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", ++ "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "requires": { +- "inherits": "^2.0.1", +- "safe-buffer": "^5.0.1" ++ "inherits": "^2.0.4", ++ "safe-buffer": "^5.2.1" + } + }, + "clean-stack": { +@@ -10458,9 +10365,9 @@ + } + }, + "commander": { +- "version": "8.3.0", +- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", +- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" ++ "version": "2.20.3", ++ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", ++ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "concat-map": { + "version": "0.0.1", +@@ -10563,11 +10470,11 @@ + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "cross-fetch": { +- "version": "3.1.8", +- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", +- "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", ++ "version": "3.2.0", ++ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", ++ "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "requires": { +- "node-fetch": "^2.6.12" ++ "node-fetch": "^2.7.0" + }, + "dependencies": { + "node-fetch": { +@@ -10601,9 +10508,9 @@ + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==" + }, + "debug": { +- "version": "4.3.7", +- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", +- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", ++ "version": "4.4.0", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", ++ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "requires": { + "ms": "^2.1.3" + } +@@ -10631,16 +10538,6 @@ + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, +- "define-data-property": { +- "version": "1.1.4", +- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", +- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", +- "requires": { +- "es-define-property": "^1.0.0", +- "es-errors": "^1.3.0", +- "gopd": "^1.0.1" +- } +- }, + "delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", +@@ -10708,9 +10605,19 @@ + } + }, + "dotenv": { +- "version": "16.4.5", +- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", +- "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" ++ "version": "16.4.7", ++ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", ++ "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" ++ }, ++ "dunder-proto": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", ++ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", ++ "requires": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "es-errors": "^1.3.0", ++ "gopd": "^1.2.0" ++ } + }, + "elliptic": { + "version": "6.5.4", +@@ -10727,9 +10634,9 @@ + }, + "dependencies": { + "bn.js": { +- "version": "4.12.0", +- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", +- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", ++ "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + } + } + }, +@@ -10761,18 +10668,23 @@ + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "es-define-property": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", +- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", +- "requires": { +- "get-intrinsic": "^1.2.4" +- } ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", ++ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, ++ "es-object-atoms": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", ++ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", ++ "requires": { ++ "es-errors": "^1.3.0" ++ } ++ }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", +@@ -10923,13 +10835,6 @@ + "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", + "requires": { + "@noble/hashes": "^1.4.0" +- }, +- "dependencies": { +- "@noble/hashes": { +- "version": "1.5.0", +- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", +- "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==" +- } + } + }, + "ethereum-cryptography": { +@@ -10972,9 +10877,9 @@ + } + }, + "bn.js": { +- "version": "4.12.0", +- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", +- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" ++ "version": "4.12.1", ++ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", ++ "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" + }, + "ethereumjs-util": { + "version": "6.2.1", +@@ -11005,23 +10910,50 @@ + } + }, + "ethers": { +- "version": "6.13.3", +- "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.3.tgz", +- "integrity": "sha512-/DzbZOLVtoO4fKvvQwpEucHAQgIwBGWuRvBdwE/lMXgXvvHHTSkn7XqAQ2b+gjJzZDJjWA9OD05bVceVOsBHbg==", ++ "version": "6.13.4", ++ "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", ++ "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", + "requires": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", +- "@types/node": "18.15.13", ++ "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", +- "tslib": "2.4.0", ++ "tslib": "2.7.0", + "ws": "8.17.1" + }, + "dependencies": { ++ "@noble/curves": { ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", ++ "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", ++ "requires": { ++ "@noble/hashes": "1.3.2" ++ } ++ }, ++ "@noble/hashes": { ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", ++ "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" ++ }, + "@types/node": { +- "version": "18.15.13", +- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", +- "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" ++ "version": "22.7.5", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", ++ "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", ++ "requires": { ++ "undici-types": "~6.19.2" ++ } ++ }, ++ "undici-types": { ++ "version": "6.19.8", ++ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", ++ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" ++ }, ++ "ws": { ++ "version": "8.17.1", ++ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", ++ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", ++ "requires": {} + } + } + }, +@@ -11102,14 +11034,14 @@ + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" + }, + "fast-uri": { +- "version": "3.0.2", +- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", +- "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==" ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", ++ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==" + }, + "fastq": { +- "version": "1.17.1", +- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", +- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", ++ "version": "1.18.0", ++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", ++ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "requires": { + "reusify": "^1.0.4" + } +@@ -11145,11 +11077,12 @@ + } + }, + "find-up": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", +- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", ++ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { +- "locate-path": "^2.0.0" ++ "locate-path": "^6.0.0", ++ "path-exists": "^4.0.0" + } + }, + "flat": { +@@ -11163,9 +11096,9 @@ + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" + }, + "form-data": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", +- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", ++ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", +@@ -11232,15 +11165,20 @@ + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==" + }, + "get-intrinsic": { +- "version": "1.2.4", +- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", +- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", ++ "version": "1.2.6", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", ++ "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "requires": { ++ "call-bind-apply-helpers": "^1.0.1", ++ "dunder-proto": "^1.0.0", ++ "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", ++ "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", +- "has-proto": "^1.0.1", +- "has-symbols": "^1.0.3", +- "hasown": "^2.0.0" ++ "gopd": "^1.2.0", ++ "has-symbols": "^1.1.0", ++ "hasown": "^2.0.2", ++ "math-intrinsics": "^1.0.0" + } + }, + "get-port": { +@@ -11309,16 +11247,15 @@ + } + }, + "glob": { +- "version": "7.2.0", +- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", +- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", ++ "version": "8.1.0", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", ++ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", +- "minimatch": "^3.0.4", +- "once": "^1.3.0", +- "path-is-absolute": "^1.0.0" ++ "minimatch": "^5.0.1", ++ "once": "^1.3.0" + } + }, + "glob-parent": { +@@ -11360,15 +11297,44 @@ + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "glob": { ++ "version": "7.2.3", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", ++ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", ++ "requires": { ++ "fs.realpath": "^1.0.0", ++ "inflight": "^1.0.4", ++ "inherits": "2", ++ "minimatch": "^3.1.1", ++ "once": "^1.3.0", ++ "path-is-absolute": "^1.0.0" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } + } + }, + "gopd": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", +- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", +- "requires": { +- "get-intrinsic": "^1.1.3" +- } ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", ++ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "graceful-fs": { + "version": "4.2.11", +@@ -11395,13 +11361,13 @@ + } + }, + "hardhat": { +- "version": "2.22.12", +- "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.12.tgz", +- "integrity": "sha512-yok65M+LsOeTBHQsjg//QreGCyrsaNmeLVzhTFqlOvZ4ZE5y69N0wRxH1b2BC9dGK8S8OPUJMNiL9X0RAvbm8w==", ++ "version": "2.22.17", ++ "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.17.tgz", ++ "integrity": "sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==", + "requires": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", +- "@nomicfoundation/edr": "^0.6.1", ++ "@nomicfoundation/edr": "^0.6.5", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", +@@ -11413,7 +11379,6 @@ + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", +- "chalk": "^2.4.2", + "chokidar": "^4.0.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", +@@ -11421,10 +11386,9 @@ + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", +- "find-up": "^2.1.0", ++ "find-up": "^5.0.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", +- "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "json-stream-stringify": "^3.1.4", +@@ -11433,12 +11397,14 @@ + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", ++ "picocolors": "^1.1.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.8.26", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", ++ "tinyglobby": "^0.2.6", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", +@@ -11469,42 +11435,6 @@ + "@scure/base": "~1.1.0" + } + }, +- "ansi-styles": { +- "version": "3.2.1", +- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", +- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", +- "requires": { +- "color-convert": "^1.9.0" +- } +- }, +- "chalk": { +- "version": "2.4.2", +- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", +- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", +- "requires": { +- "ansi-styles": "^3.2.1", +- "escape-string-regexp": "^1.0.5", +- "supports-color": "^5.3.0" +- } +- }, +- "color-convert": { +- "version": "1.9.3", +- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", +- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", +- "requires": { +- "color-name": "1.1.3" +- } +- }, +- "color-name": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", +- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" +- }, +- "escape-string-regexp": { +- "version": "1.0.5", +- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", +- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" +- }, + "ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", +@@ -11544,14 +11469,6 @@ + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, +- "supports-color": { +- "version": "5.5.0", +- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", +- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", +- "requires": { +- "has-flag": "^3.0.0" +- } +- }, + "undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", +@@ -11588,23 +11505,10 @@ + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, +- "has-property-descriptors": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", +- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", +- "requires": { +- "es-define-property": "^1.0.0" +- } +- }, +- "has-proto": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", +- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" +- }, + "has-symbols": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", +- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", ++ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "hash-base": { + "version": "3.1.0", +@@ -11841,9 +11745,9 @@ + "requires": {} + }, + "jayson": { +- "version": "4.1.2", +- "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", +- "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", ++ "version": "4.1.3", ++ "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.3.tgz", ++ "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", + "requires": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", +@@ -11872,20 +11776,6 @@ + "@types/node": "*" + } + }, +- "commander": { +- "version": "2.20.3", +- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", +- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" +- }, +- "JSONStream": { +- "version": "1.3.5", +- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", +- "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", +- "requires": { +- "jsonparse": "^1.2.0", +- "through": ">=2.2.7 <3" +- } +- }, + "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", +@@ -11913,9 +11803,9 @@ + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "json-stream-stringify": { +- "version": "3.1.5", +- "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.5.tgz", +- "integrity": "sha512-wurRuTiw27mck9MWaUIGAunfwqhPDxnXQVN/+Rzi+IEQUUALU10AZs1nWkSdtjH7PAVuAUcqQjH11S/JHOWeaA==" ++ "version": "3.1.6", ++ "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", ++ "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==" + }, + "json-stringify-safe": { + "version": "5.0.1", +@@ -11947,9 +11837,9 @@ + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==" + }, + "JSONStream": { +- "version": "1.3.2", +- "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", +- "integrity": "sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA==", ++ "version": "1.3.5", ++ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", ++ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" +@@ -11990,12 +11880,11 @@ + } + }, + "locate-path": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", +- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", ++ "version": "6.0.0", ++ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", ++ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { +- "p-locate": "^2.0.0", +- "path-exists": "^3.0.0" ++ "p-locate": "^5.0.0" + } + }, + "lodash": { +@@ -12068,6 +11957,11 @@ + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" + }, ++ "math-intrinsics": { ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ++ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" ++ }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", +@@ -12126,11 +12020,11 @@ + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "minimatch": { +- "version": "3.1.2", +- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", +- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "version": "5.1.6", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", ++ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { +- "brace-expansion": "^1.1.7" ++ "brace-expansion": "^2.0.1" + } + }, + "minimist": { +@@ -12160,9 +12054,9 @@ + } + }, + "mocha": { +- "version": "10.7.3", +- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", +- "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", ++ "version": "10.8.2", ++ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", ++ "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "requires": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", +@@ -12186,14 +12080,6 @@ + "yargs-unparser": "^2.0.0" + }, + "dependencies": { +- "brace-expansion": { +- "version": "2.0.1", +- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", +- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", +- "requires": { +- "balanced-match": "^1.0.0" +- } +- }, + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", +@@ -12209,64 +12095,6 @@ + "readdirp": "~3.6.0" + } + }, +- "find-up": { +- "version": "5.0.0", +- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", +- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", +- "requires": { +- "locate-path": "^6.0.0", +- "path-exists": "^4.0.0" +- } +- }, +- "glob": { +- "version": "8.1.0", +- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", +- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", +- "requires": { +- "fs.realpath": "^1.0.0", +- "inflight": "^1.0.4", +- "inherits": "2", +- "minimatch": "^5.0.1", +- "once": "^1.3.0" +- } +- }, +- "locate-path": { +- "version": "6.0.0", +- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", +- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", +- "requires": { +- "p-locate": "^5.0.0" +- } +- }, +- "minimatch": { +- "version": "5.1.6", +- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", +- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", +- "requires": { +- "brace-expansion": "^2.0.1" +- } +- }, +- "p-limit": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", +- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", +- "requires": { +- "yocto-queue": "^0.1.0" +- } +- }, +- "p-locate": { +- "version": "5.0.0", +- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", +- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", +- "requires": { +- "p-limit": "^3.0.2" +- } +- }, +- "path-exists": { +- "version": "4.0.0", +- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", +- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" +- }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", +@@ -12291,10 +12119,9 @@ + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "nan": { +- "version": "2.20.0", +- "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", +- "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", +- "optional": true ++ "version": "2.22.0", ++ "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", ++ "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" + }, + "ndjson": { + "version": "2.0.0", +@@ -12326,9 +12153,9 @@ + }, + "dependencies": { + "@sinonjs/fake-timers": { +- "version": "13.0.2", +- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", +- "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", ++ "version": "13.0.5", ++ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", ++ "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "requires": { + "@sinonjs/commons": "^3.0.1" + } +@@ -12373,9 +12200,9 @@ + } + }, + "node-gyp-build": { +- "version": "4.8.2", +- "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", +- "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==" ++ "version": "4.8.4", ++ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", ++ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" + }, + "nofilter": { + "version": "3.1.0", +@@ -12417,9 +12244,9 @@ + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { +- "version": "1.13.2", +- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", +- "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" ++ "version": "1.13.3", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", ++ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==" + }, + "obliterator": { + "version": "2.0.4", +@@ -12458,19 +12285,19 @@ + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "p-limit": { +- "version": "1.3.0", +- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", +- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", ++ "version": "3.1.0", ++ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", ++ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { +- "p-try": "^1.0.0" ++ "yocto-queue": "^0.1.0" + } + }, + "p-locate": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", +- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", ++ "version": "5.0.0", ++ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", ++ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { +- "p-limit": "^1.1.0" ++ "p-limit": "^3.0.2" + } + }, + "p-map": { +@@ -12481,11 +12308,6 @@ + "aggregate-error": "^3.0.0" + } + }, +- "p-try": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", +- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" +- }, + "pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", +@@ -12497,9 +12319,9 @@ + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path-exists": { +- "version": "3.0.0", +- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", +- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", ++ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", +@@ -12538,6 +12360,11 @@ + "sha.js": "^2.4.8" + } + }, ++ "picocolors": { ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", ++ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" ++ }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", +@@ -12605,9 +12432,9 @@ + } + }, + "qs": { +- "version": "6.13.0", +- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", +- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", ++ "version": "6.13.1", ++ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", ++ "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "requires": { + "side-channel": "^1.0.6" + } +@@ -12665,6 +12492,25 @@ + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "requires": { + "minimatch": "^3.0.5" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } + } + }, + "reduce-flatten": { +@@ -12759,15 +12605,6 @@ + "ws": "^8.5.0" + }, + "dependencies": { +- "buffer": { +- "version": "6.0.3", +- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", +- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", +- "requires": { +- "base64-js": "^1.3.1", +- "ieee754": "^1.2.1" +- } +- }, + "eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", +@@ -12822,6 +12659,15 @@ + "sprintf-js": "~1.0.2" + } + }, ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", +@@ -12855,6 +12701,14 @@ + } + } + }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", +@@ -12898,19 +12752,6 @@ + "randombytes": "^2.1.0" + } + }, +- "set-function-length": { +- "version": "1.2.2", +- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", +- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", +- "requires": { +- "define-data-property": "^1.1.4", +- "es-errors": "^1.3.0", +- "function-bind": "^1.1.2", +- "get-intrinsic": "^1.2.4", +- "gopd": "^1.0.1", +- "has-property-descriptors": "^1.0.2" +- } +- }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", +@@ -12947,17 +12788,82 @@ + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" ++ }, ++ "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, ++ "glob": { ++ "version": "7.2.3", ++ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", ++ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", ++ "requires": { ++ "fs.realpath": "^1.0.0", ++ "inflight": "^1.0.4", ++ "inherits": "2", ++ "minimatch": "^3.1.1", ++ "once": "^1.3.0", ++ "path-is-absolute": "^1.0.0" ++ } ++ }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ } + } + }, + "side-channel": { +- "version": "1.0.6", +- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", +- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", ++ "version": "1.1.0", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", ++ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", ++ "requires": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3", ++ "side-channel-list": "^1.0.0", ++ "side-channel-map": "^1.0.1", ++ "side-channel-weakmap": "^1.0.2" ++ } ++ }, ++ "side-channel-list": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", ++ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", ++ "requires": { ++ "es-errors": "^1.3.0", ++ "object-inspect": "^1.13.3" ++ } ++ }, ++ "side-channel-map": { ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", ++ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", ++ "requires": { ++ "call-bound": "^1.0.2", ++ "es-errors": "^1.3.0", ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3" ++ } ++ }, ++ "side-channel-weakmap": { ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", ++ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "requires": { +- "call-bind": "^1.0.7", ++ "call-bound": "^1.0.2", + "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.4", +- "object-inspect": "^1.13.1" ++ "get-intrinsic": "^1.2.5", ++ "object-inspect": "^1.13.3", ++ "side-channel-map": "^1.0.1" + } + }, + "signal-exit": { +@@ -12994,6 +12900,14 @@ + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, ++ "sleep": { ++ "version": "6.3.0", ++ "resolved": "https://registry.npmjs.org/sleep/-/sleep-6.3.0.tgz", ++ "integrity": "sha512-+WgYl951qdUlb1iS97UvQ01pkauoBK9ML9I/CMPg41v0Ze4EyMlTgFTDDo32iYj98IYqxIjDMRd+L71lawFfpQ==", ++ "requires": { ++ "nan": "^2.14.1" ++ } ++ }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", +@@ -13027,6 +12941,11 @@ + "tmp": "0.0.33" + }, + "dependencies": { ++ "commander": { ++ "version": "8.3.0", ++ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", ++ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" ++ }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", +@@ -13035,12 +12954,12 @@ + } + }, + "solidity-coverage": { +- "version": "0.8.13", +- "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.13.tgz", +- "integrity": "sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==", ++ "version": "0.8.14", ++ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", ++ "integrity": "sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==", + "requires": { + "@ethersproject/abi": "^5.0.9", +- "@solidity-parser/parser": "^0.18.0", ++ "@solidity-parser/parser": "^0.19.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "difflib": "^0.2.4", +@@ -13061,9 +12980,9 @@ + }, + "dependencies": { + "@solidity-parser/parser": { +- "version": "0.18.0", +- "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", +- "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==" ++ "version": "0.19.0", ++ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", ++ "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==" + }, + "ansi-styles": { + "version": "3.2.1", +@@ -13289,9 +13208,9 @@ + } + }, + "table": { +- "version": "6.8.2", +- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", +- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", ++ "version": "6.9.0", ++ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", ++ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", +@@ -13375,13 +13294,14 @@ + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" + }, + "form-data": { +- "version": "2.5.1", +- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", +- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", ++ "version": "2.5.2", ++ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", ++ "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", +- "mime-types": "^2.1.12" ++ "mime-types": "^2.1.12", ++ "safe-buffer": "^5.2.1" + } + } + } +@@ -13404,6 +13324,28 @@ + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, ++ "tinyglobby": { ++ "version": "0.2.10", ++ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", ++ "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", ++ "requires": { ++ "fdir": "^6.4.2", ++ "picomatch": "^4.0.2" ++ }, ++ "dependencies": { ++ "fdir": { ++ "version": "6.4.2", ++ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", ++ "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", ++ "requires": {} ++ }, ++ "picomatch": { ++ "version": "4.0.2", ++ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", ++ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" ++ } ++ } ++ }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", +@@ -13490,9 +13432,9 @@ + } + }, + "tslib": { +- "version": "2.4.0", +- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", +- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" ++ "version": "2.7.0", ++ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", ++ "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, + "tsort": { + "version": "0.0.1", +@@ -13544,6 +13486,15 @@ + "ts-essentials": "^7.0.1" + }, + "dependencies": { ++ "brace-expansion": { ++ "version": "1.1.11", ++ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", ++ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", ++ "requires": { ++ "balanced-match": "^1.0.0", ++ "concat-map": "0.0.1" ++ } ++ }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", +@@ -13575,6 +13526,14 @@ + "graceful-fs": "^4.1.6" + } + }, ++ "minimatch": { ++ "version": "3.1.2", ++ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", ++ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", ++ "requires": { ++ "brace-expansion": "^1.1.7" ++ } ++ }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", +@@ -13593,9 +13552,9 @@ + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { +- "version": "5.6.2", +- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", +- "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==" ++ "version": "5.7.2", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", ++ "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" + }, + "typical": { + "version": "4.0.0", +@@ -13609,14 +13568,14 @@ + "optional": true + }, + "undici": { +- "version": "6.19.8", +- "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", +- "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" ++ "version": "6.21.0", ++ "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", ++ "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==" + }, + "undici-types": { +- "version": "6.19.8", +- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", +- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" ++ "version": "6.20.0", ++ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", ++ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" + }, + "universalify": { + "version": "2.0.1", +@@ -13780,9 +13739,9 @@ + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { +- "version": "8.17.1", +- "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", +- "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", ++ "version": "8.18.0", ++ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", ++ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "requires": {} + }, + "xtend": { +@@ -13836,9 +13795,9 @@ + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zod": { +- "version": "3.23.8", +- "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", +- "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==" ++ "version": "3.24.1", ++ "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", ++ "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==" + } + } + } diff --git a/oku-custom-order-types/package.json b/oku-custom-order-types/package.json index 2952d83..ba94095 100644 --- a/oku-custom-order-types/package.json +++ b/oku-custom-order-types/package.json @@ -20,6 +20,7 @@ "dotenv": "^16.4.5", "hardhat": "^2.22.5", "node-fetch": "^3.3.2", + "sleep": "^6.3.0", "typechain": "^8.3.2" }, "devDependencies": { diff --git a/oku-custom-order-types/package.json.rej b/oku-custom-order-types/package.json.rej new file mode 100644 index 0000000..94e5809 --- /dev/null +++ b/oku-custom-order-types/package.json.rej @@ -0,0 +1,9 @@ +diff a/oku-custom-order-types/package.json b/oku-custom-order-types/package.json (rejected hunks) +@@ -20,6 +20,7 @@ + "dotenv": "^16.4.5", + "hardhat": "^2.22.5", + "node-fetch": "^3.3.2", ++ "sleep": "^6.3.0", + "typechain": "^8.3.2" + }, + "devDependencies": { diff --git a/oku-custom-order-types/scripts/bulkDeploy.ts b/oku-custom-order-types/scripts/bulkDeploy.ts new file mode 100644 index 0000000..aa98711 --- /dev/null +++ b/oku-custom-order-types/scripts/bulkDeploy.ts @@ -0,0 +1,346 @@ +import hre from "hardhat"; +import { DeployContract } from "../util/deploy"; +import { currentBlock, resetCurrentArb, resetCurrentBase, resetCurrentOP, resetGeneric } from "../util/block"; +import { AutomationMaster, AutomationMaster__factory, Bracket, Bracket__factory, IAutomationMaster__factory, IERC20__factory, IOracleRelay, OracleLess, OracleLess__factory, OracleRelay__factory, StopLimit, StopLimit__factory, TokenEthRelay__factory, UniswapV3Pool__factory } from "../typechain-types"; +import { Signer } from "ethers"; +import { impersonateAccount } from "../util/impersonator"; +import { setBalance } from "@nomicfoundation/hardhat-network-helpers"; +import { decodeUpkeepData, generateUniTx } from "../util/msc"; +import { ChainConfig, chainConfigs } from "./chainConfig"; +import { ChainAddresses, getAddressesByChainId, getFeeByChainId, tokenInfo } from "../util/deploymentAddresses" +import { a, o } from "../util/addresser"; +import { sleep } from "sleep" +import {network} from "hardhat" +type OraclePair = { + token: string, + oracle: string +} + +type CoreDeployments = { + master: string, + bracket: string, + stopLimit: string, + oracleLess: string +} + +const chainsToDeploy = [ + 10, // Optimism + /** + 42161, // Arbitrum + 137, // Polygon (MATIC) + 8453, // Base + 56, // Binance Smart Chain (BSC) + 324, // ZkSync + 534353, // Scroll + 314, // Filecoin (FIL) + 1284, // Moonbeam (GLMR) + 1101, // Polygon zkEVM + 81457, // Blast + 30, // Rootstock (RBTC) + 169, // Manta Pacific (MANTA) + 288, // Boba + 59144, // Linea + 167000, // Taiko + 15000, // Sei + 100, // Gnosis (xDAI) + 1294, // Bob + 2025, // XLayer (OKB) + 1750, // Metall2 (MTL) + 1, // Mainnet + */ +]; + +const zaddr = "0x0000000000000000000000000000000000000000" + +const { ethers } = require("hardhat"); + +//"https://github.com/adrastia-oracle/oku-automation-config/blob/main/worker-config.ts" + +const maxPendingOrders = 50 +const minOrderDollars = ethers.parseUnits("25", 8) + + +const userAddr = "0x085909388fc0cE9E5761ac8608aF8f2F52cb8B89" + +let mainnet = true +async function main() { + console.log("STARTING") + let networkName = hre.network.name + console.log(networkName) + if (networkName == "hardhat" || networkName == "localhost") { + //testing + mainnet = false + } else { + console.log("DEPLOYING TO LIVE NETWORKS") + } + + for (const config of chainConfigs) { + let signer: Signer + + if (chainsToDeploy.includes(config.chainId)) { + //reset for testing + if (!mainnet) { + try { + console.log(`Resetting network to ${config.name}`) + await resetGeneric(config.rpcUrl!) + } catch (e) { + console.log("Resseting RPC failed for ", config.name) + continue + } + signer = await ethers.getSigner(userAddr) + await setBalance(userAddr, ethers.parseEther("1000")) + await impersonateAccount(userAddr) + } else { + console.log("Deploying to: ", config.name) + const provider = new ethers.JsonRpcProvider(config.rpcUrl) + signer = new ethers.Wallet(config.privateKey, provider) + } + try { + //mainnet = false + const addresses: ChainAddresses = getAddressesByChainId(config.chainId) + await deployAndSetup(signer, config, addresses) + + } catch (e) { + console.log(e) + continue + } + } + + } + console.log("DONE") +} + +const deployAndSetup = async (signer: Signer, config: ChainConfig, a: ChainAddresses) => { + + let oracles: OraclePair[] = [] + if (config.chainlink) { + oracles = await bulkDeployOracles(signer, config, a) + } + + + //deploy and setup contracts + const coreDeployments = await deployContracts(signer, config, a, oracles) + console.log("") + console.log("Core Deployments for: ", config.name) + console.log(coreDeployments) + const master = IAutomationMaster__factory.connect(coreDeployments.master, signer) + const result = await master.checkUpkeep("0x") + await sleep(15) + console.log("Upkeep: ", result.upkeepNeeded) + console.log("") + + +} + +const bulkDeployOracles = async (signer: Signer, config: ChainConfig, addresses: ChainAddresses) => { + console.log("DEPLOYING ORACLES ON ", config.name) + let oracles: OraclePair[] = [] + + const tokens: tokenInfo[] = addresses.allTokens + + let deployed = false + let relay = "" + let args: string[] = [] + + + for (let i = 0; i < tokens.length; i++) { + const token = tokens[i] + + let oraclePair: OraclePair = { + token: token.token, + oracle: token.relay + } + + //can't do anything if there is no token addr + if (token.token == '') { + console.log(`No token addr for ${token.symbol} on ${config.name}`) + continue + } + + //if we have a feed + if (token.relay != '') { + console.log(`Found relay for ${token.symbol} on ${config.name} @ ${token.relay}`) + oracles.push(oraclePair) + continue + } + + + //if there is no relay and we have a feed, deploy a relay + if (token.relay == '' && token.feed != '') { + console.log("Deploying oracle for ", token.symbol) + const oracle = await DeployContract(new OracleRelay__factory(signer), signer, ethers.getAddress(token.token), ethers.getAddress(token.feed)) + await oracle!.deploymentTransaction() + console.log(`${token.symbol} Oracle Deployed to ${config.name} @ ${await oracle!.getAddress()}`) + console.log(`${token.symbol} PRICE: `, await oracle!.currentValue()) + oraclePair.oracle = await oracle.getAddress() + oracles.push(oraclePair) + deployed = true + relay = await oracle.getAddress() + args = [token.token, token.feed] + + } + + } + //submit 1 for verification + + if (mainnet && deployed) { + console.log("Submitting oracle for verificaiton on ", config.name) + await sleep(15) + try { + Promise.all([ + hre.run("verify:verify", { + address: relay, + constructorArguments: args,//[tokens[0].token, tokens[0].feed] + }), + ]) + }catch (e) { + console.log("Error verifying oracle on ", config.name) + } + } + + + return oracles +} + +const deployContracts = async (signer: Signer, config: ChainConfig, addresses: ChainAddresses, oracles: OraclePair[]) => { + + //init to what we have + let coreDeployments: CoreDeployments = { + master: addresses.coreDeployments.master, + bracket: addresses.coreDeployments.bracket, + stopLimit: addresses.coreDeployments.stopLimit, + oracleLess: addresses.coreDeployments.oracleLess + } + + let newMaster = false + + if (coreDeployments.master == '') { + //deploy + const master: AutomationMaster = await DeployContract(new AutomationMaster__factory(signer), signer) + await master.deploymentTransaction() + console.log(`Master deployed to ${config.name} @ ${await master.getAddress()}`) + newMaster = true + coreDeployments.master = await master.getAddress() + + //register oracles + //split oracle pairs + const tokenAddrs = oracles.map(pair => ethers.getAddress(pair.token)); + const oracleAddrs = oracles.map(pair => ethers.getAddress(pair.oracle)); + console.log("TOKENS: ", tokenAddrs) + console.log("ORACLE: ", oracleAddrs) + + let tx = await master.registerOracle(tokenAddrs, oracleAddrs) + await tx.wait() + console.log("Registered Oracles on Master on ", config.name) + + tx = await master.setMinOrderSize(minOrderDollars) + await tx.wait() + console.log(`Set min order size to ${minOrderDollars} on ${config.name}`) + tx = await master.setMaxPendingOrders(maxPendingOrders) + await tx.wait() + console.log(`Set max pending orders to ${maxPendingOrders} on ${config.name}`) + + + if (mainnet) { + const ogNetwork = network.name + console.log("Submitting Master for verification...") + await sleep(1) + Promise.all([ + hre.run("verify:verify", { + address: await master.getAddress(), + }), + ]) + } + + } + + if (coreDeployments.bracket == '') { + let permit2 = addresses.permit2 + if (permit2 == "") { + permit2 = zaddr + } + //deploy + const bracket: Bracket = await DeployContract(new Bracket__factory(signer), signer, coreDeployments.master, addresses.permit2) + await bracket.deploymentTransaction() + console.log(`Bracket deployed to ${config.name} @ ${await bracket.getAddress()}`) + coreDeployments.bracket = await bracket.getAddress() + + if (mainnet) { + console.log("Submitting Bracket for verification...") + await sleep(15) + Promise.all([ + hre.run("verify:verify", { + address: await bracket.getAddress(), + constructorArguments: [coreDeployments.master, addresses.permit2], + }), + ]) + } + } + + if (coreDeployments.stopLimit == '') { + //deploy + const stopLimit: StopLimit = await DeployContract(new StopLimit__factory(signer), signer, coreDeployments.master, coreDeployments.bracket, addresses.permit2) + await stopLimit.deploymentTransaction() + console.log(`Stop Limit deployed to ${config.name} @ ${await stopLimit.getAddress()}`) + coreDeployments.stopLimit = await stopLimit.getAddress() + if (mainnet) { + console.log("Submitting StopLimit for verification...") + await sleep(15) + Promise.all([ + hre.run("verify:verify", { + address: await stopLimit.getAddress(), + constructorArguments: [coreDeployments.master, coreDeployments.bracket, addresses.permit2], + }), + ]) + } + } + + if (coreDeployments.oracleLess == '') { + //deploy + const oracleLess: OracleLess = await DeployContract(new OracleLess__factory(signer), signer, coreDeployments.master, addresses.permit2) + await oracleLess.deploymentTransaction() + console.log(`OracleLess deployed to ${config.name} @ ${await oracleLess.getAddress()}`) + coreDeployments.oracleLess = await oracleLess.getAddress() + await sleep(1) + + //set fee + let tx = await oracleLess.setOrderFee(getFeeByChainId(config.chainId)) + await tx.wait() + await sleep(1) + console.log("Set fee on Oracleless") + + if (mainnet) { + console.log("Submitting OracleLess for verification...") + await sleep(15) + Promise.all([ + hre.run("verify:verify", { + address: await oracleLess.getAddress(), + constructorArguments: [coreDeployments.master, addresses.permit2], + }), + ]) + } + } + + if (newMaster) { + //register sub keepers + const master = AutomationMaster__factory.connect(coreDeployments.master, signer) + let tx = await master.registerSubKeepers( + coreDeployments.stopLimit, + coreDeployments.bracket + ) + await tx.wait() + console.log("Sub Keepers Registered to Master on ", config.name) + } + + console.log("Core deployments complete for ", config.name) + + + return coreDeployments +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) diff --git a/oku-custom-order-types/scripts/chainConfig.ts b/oku-custom-order-types/scripts/chainConfig.ts new file mode 100644 index 0000000..c96f640 --- /dev/null +++ b/oku-custom-order-types/scripts/chainConfig.ts @@ -0,0 +1,168 @@ +import * as dotenv from "dotenv"; + +dotenv.config(); + +export type ChainConfig = { + name: string, + chainId: number, + rpcUrl: string, + privateKey: string, + chainlink: boolean +} + +export const chainConfigs: ChainConfig[] = [ + { + name: "arbitrum", + chainId: 42161, + rpcUrl: process.env.ARB_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "optimism", + chainId: 10, + rpcUrl: process.env.OP_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "polygon", + chainId: 137, + rpcUrl: process.env.POLYGON_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "base", + chainId: 8453, + rpcUrl: process.env.BASE_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "bsc", + chainId: 56, + rpcUrl: process.env.BSC_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "zksolc", + chainId: 324, + rpcUrl: process.env.ZKSYNC_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "scroll", + chainId: 534353, + rpcUrl: process.env.SCROLL_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "filecoin", + chainId: 314, + rpcUrl: process.env.FILECOIN_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "moonbeam", + chainId: 1284, + rpcUrl: process.env.MOONBEAM_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "polygonzkevm", + chainId: 1101, + rpcUrl: process.env.POLYGONZKEVM_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "blast", + chainId: 81457, + rpcUrl: process.env.BLAST_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "rootstock", + chainId: 30, + rpcUrl: process.env.ROOTSTOCK_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "mantapacific", + chainId: 169, + rpcUrl: process.env.MANTAPACIFIC_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "boba", + chainId: 288, + rpcUrl: process.env.BOBA_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false//double check + }, + { + name: "linea", + chainId: 59144, + rpcUrl: process.env.LINEA_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "taiko", + chainId: 167000, + rpcUrl: process.env.TAIKO_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "sei", + chainId: 15000, + rpcUrl: process.env.SEI_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "gnosis", + chainId: 100, + rpcUrl: process.env.GNOSIS_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + }, + { + name: "bob", + chainId: 1294, + rpcUrl: process.env.BOB_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "xlayer", + chainId: 2025, + rpcUrl: process.env.XLAYER_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "metall2", + chainId: 1750, + rpcUrl: process.env.METAL_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: false + }, + { + name: "mainnet", + chainId: 1, + rpcUrl: process.env.MAINNET_URL!, + privateKey: process.env.MAINNET_PRIVATE_KEY!, + chainlink: true + } +]; diff --git a/oku-custom-order-types/scripts/createOrder.ts b/oku-custom-order-types/scripts/createOrder.ts new file mode 100644 index 0000000..55ec375 --- /dev/null +++ b/oku-custom-order-types/scripts/createOrder.ts @@ -0,0 +1,210 @@ +import hre, { network } from "hardhat"; +import { currentBlock, resetCurrentArb, resetCurrentBase, resetCurrentOP } from "../util/block"; +import { AutomationMaster, AutomationMaster__factory, Bracket, Bracket__factory, IERC20, IERC20__factory, IPermit2__factory, OracleLess, OracleLess__factory, PermitTest, PermitTest__factory, StopLimit, StopLimit__factory, UniswapV3Pool__factory } from "../typechain-types"; +import { AbiCoder, getBytes, Signer } from "ethers"; +import { impersonateAccount } from "../util/impersonator"; +import { setBalance } from "@nomicfoundation/hardhat-network-helpers"; +import { decodeUpkeepData, encodePermit2Payload, encodePermitSingle, generateUniTx, generateUniTxData, MasterUpkeepData, MasterUpkeepTuple, Permit2Payload, permitSingle } from "../util/msc"; +import { a, b, o } from "../util/addresser"; +import { s, SwapParams } from "../test/triggerV2/scope"; +import { ChainAddresses, OptimisimAddresses } from "../util/deploymentAddresses"; +import { DeployContract } from "../util/deploy"; +const { ethers } = require("hardhat"); +const abi = new AbiCoder() + + + +//SET THIS FOR TESTING +const testingNetwork = "op" +const userAddr = "0x085909388fc0cE9E5761ac8608aF8f2F52cb8B89" +const wethAmount = ethers.parseEther("0.0005") +const stopLimitDelta = ethers.parseUnits("1", 8) +const strikeDelta = ethers.parseUnits("5", 8) +const stopDelta = ethers.parseUnits("5", 8) + +let master: AutomationMaster +let stopLimit: StopLimit +let bracket: Bracket +let oracleLess: OracleLess +let mainnet = true +let permitAddr: string +let chainId = 42161 +let addrs: ChainAddresses + +//tokens +let WETH: IERC20 +let USDC: IERC20 + +const main = async () => { + console.log("STARTING") + let networkName = hre.network.name + console.log("Running on: ", networkName) + const network = await ethers.provider.getNetwork(); + chainId = Number(network.chainId) + + let [signer] = await ethers.getSigners() + + + if (networkName == "hardhat" || networkName == "localhost") { + networkName = testingNetwork + mainnet = false + console.log("Testing on network : ", networkName) + } else { + console.log("RUNNING ON LIVE NETWORK: ", networkName) + } + + if (networkName == "op") { + if (!mainnet) { + console.log("RESETTING TO OP") + await resetCurrentOP() + console.log("Testing on OP @", (await currentBlock())?.number) + chainId = 10 + signer = await ethers.getSigner(userAddr) + + //testing does not scale tx cost correctly + await setBalance(await signer.getAddress(), ethers.parseEther("1")) + await impersonateAccount(await signer.getAddress()) + } else { + chainId = Number(network.chainId) + console.log("GOT CI: ", chainId) + } + + addrs = new OptimisimAddresses() + } + + master = AutomationMaster__factory.connect(addrs.coreDeployments.master, signer) + stopLimit = StopLimit__factory.connect(addrs.coreDeployments.stopLimit, signer) + bracket = Bracket__factory.connect(addrs.coreDeployments.bracket, signer) + oracleLess = OracleLess__factory.connect(addrs.coreDeployments.oracleLess, signer) + WETH = IERC20__factory.connect((addrs.allTokens.find(token => token.symbol === "WETH"))!.token, signer) + USDC = IERC20__factory.connect((addrs.allTokens.find(token => token.symbol === "USDC"))!.token, signer) + + //await createStopLimitOrder(signer, stopLimitDelta) + if (mainnet) { + await createStopLimitPermit(signer, stopLimitDelta) + } + //await createStopLimitPermit(signer, stopLimitDelta) + if (!mainnet) { + await debugPermit(signer) + } + +} + + + + +const debugPermit = async (signer: Signer) => { + /** + const permit = { + signature: '0x30fcc4d3e0603406cf88aca9299a3ec7e8aae2e1c24515c6b83c53817cede0a63f4a3047c106169deecfaca7e455c9349dc9657b624654479aa8531751b073571c', + permitSingle: { + details: { + token: '0x4200000000000000000000000000000000000006', + amount: '500000000000000', + expiration: '1735958812', + nonce: '0' + }, + spender: '0xF9fFbA0fE174bf7a099B10D1142379322CD1Bf46', + sigDeadline: '1736045212' + } + } + */ + const permit: Permit2Payload = { + signature: '0xe463806c46551812fde3cc213a69812d64a9d80157a4622dc7f89eb2941d4951221a145c933175ed3a15fd6cbeb76d33ecad1117978607b91165d843e22a87da1b', + permitSingle: { + details: { + token: '0x4200000000000000000000000000000000000006', + amount: '500000000000000', + expiration: '1735957820', + nonce: '0' + }, + spender: '0xF9fFbA0fE174bf7a099B10D1142379322CD1Bf46', + sigDeadline: '1736044220' + } + }; + + const encodedData = encodePermit2Payload(permit); + console.log("Encoded Data:", encodedData); + + const testContract: PermitTest = await DeployContract(new PermitTest__factory(signer), signer, addrs.permit2) + console.log("Testing deployed") + await testContract.testDecode(encodedData) + +} + + + +const createStopLimitOrder = async (signer: Signer, delta: bigint) => { + const currentPrice = await master.getExchangeRate(await WETH.getAddress(), await USDC.getAddress()) + await WETH.connect(signer).approve(await stopLimit.getAddress(), wethAmount) + const tx = await stopLimit.connect(signer).createOrder( + currentPrice - delta, + currentPrice + delta, + currentPrice - (delta * 2n), + wethAmount, + await WETH.getAddress(), + await USDC.getAddress(), + await signer.getAddress(), + 5, + 500, + 500, + 500, + true, + false, + "0x" + ) + await tx.wait() + + const filter = stopLimit.filters.OrderCreated + const events = await stopLimit.queryFilter(filter, -1) + const event = events[0].args + console.log("Stop Limit Order Created: ", event[0].toString()) + +} + + + +const createStopLimitPermit = async (signer: Signer, delta: bigint) => { + const encodedPermit = await encodePermitSingle( + signer, + chainId, + await WETH.getAddress(), + wethAmount, + await stopLimit.getAddress(), + o.permit2 + ) + const currentPrice = await master.getExchangeRate(await WETH.getAddress(), await USDC.getAddress()) + + + const tx = await stopLimit.connect(signer).createOrder( + currentPrice - delta, + currentPrice + delta, + currentPrice - (delta * 2n), + wethAmount, + await WETH.getAddress(), + await USDC.getAddress(), + await signer.getAddress(), + 5, + 500, + 500, + 500, + true, + true, + encodedPermit + ) + + await tx.wait() + + const filter = stopLimit.filters.OrderCreated + const events = await stopLimit.queryFilter(filter, -1) + const event = events[0].args + console.log("Stop Limit Order Created: ", event[0].toString()) + +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) diff --git a/oku-custom-order-types/scripts/debug.ts b/oku-custom-order-types/scripts/debug.ts deleted file mode 100644 index e39b621..0000000 --- a/oku-custom-order-types/scripts/debug.ts +++ /dev/null @@ -1,230 +0,0 @@ -import hre, { network } from "hardhat"; -import { currentBlock, hardhat_mine_timed, resetCurrentArb, resetCurrentArbBlock, resetCurrentBase, resetCurrentOP, resetCurrentOPblock } from "../util/block"; -import { AutomationMaster, AutomationMaster__factory, Bracket, Bracket__factory, IERC20, IERC20__factory, IPermit2__factory, StopLimit, StopLimit__factory, UniswapV3Pool__factory } from "../typechain-types"; -import { Signer } from "ethers"; -import { impersonateAccount } from "../util/impersonator"; -import { setBalance } from "@nomicfoundation/hardhat-network-helpers"; -import { decodeUpkeepData, generateUniTx, generateUniTxData, MasterUpkeepData, permitSingle } from "../util/msc"; -import { a, b, o } from "../util/addresser"; -import { s, SwapParams } from "../test/triggerV2/scope"; -const { ethers } = require("hardhat"); - - -let Master: AutomationMaster -let StopLimit: StopLimit -let Bracket: Bracket -let mainnet = true -let masterAddr: string //"0x8327B0168858bd918A0177e89b2c172475F6B16f"//second deploy//0x4f38FA4F676a053ea497F295f855B2dC3580f517"//initial deploy -let bracketAddr: string -let stopLimitAddr: string -let permitAddr: string - -//tokens -let WETH: IERC20 -let USDC: IERC20 - - -//SET THIS FOR TESTING -const testingNetwork = "arbitrum" -const userAddr = "0x085909388fc0cE9E5761ac8608aF8f2F52cb8B89" -const wethAmount = ethers.parseEther("0.0005") -const stopLimitDelta = ethers.parseUnits("1", 8) -const strikeDelta = ethers.parseUnits("5", 8) -const stopDelta = ethers.parseUnits("5", 8) -const testBips = 2000 -let chainId = 42161 - -async function main() { - console.log("STARTING") - let networkName = hre.network.name - console.log(networkName) - - let [signer] = await ethers.getSigners() - - const network = await ethers.provider.getNetwork(); - chainId = Number(network.chainId) - console.log("GOT CHAINID: ", chainId) - - if (networkName == "hardhat" || networkName == "localhost") { - networkName = testingNetwork - mainnet = false - console.log("Testing on network : ", networkName) - - } else { - console.log("Sending for real to: ", networkName) - } - - if (networkName == "arbitrum") { - - if (!mainnet) { - await resetCurrentArbBlock(266974358) - console.log("Testing on ARB @", (await currentBlock())?.number) - - } - masterAddr = a.Master - stopLimitAddr = a.stopLimit - bracketAddr = a.bracket - permitAddr = a.permit2 - - WETH = IERC20__factory.connect(a.wethAddress, signer) - USDC = IERC20__factory.connect(a.nativeUsdcAddress, signer) - } - - if (networkName == "base") { - - if (!mainnet) { - await resetCurrentBase() - console.log("Testing on BASE @", (await currentBlock())?.number) - - } - masterAddr = b.Master - stopLimitAddr = b.stopLimit - bracketAddr = b.bracket - permitAddr = b.permit2 - - WETH = IERC20__factory.connect(b.wethAddress, signer) - USDC = IERC20__factory.connect(b.nativeUsdcAddress, signer) - } - - if (networkName == "op") { - - if (!mainnet) { - await resetCurrentOP - console.log("Testing on OP @", (await currentBlock())?.number) - - } - masterAddr = o.Master - stopLimitAddr = o.stopLimit - bracketAddr = o.bracket - permitAddr = o.permit2 - - WETH = IERC20__factory.connect(o.wethAddress, signer) - USDC = IERC20__factory.connect(o.nativeUsdcAddress, signer) - } - - - Master = AutomationMaster__factory.connect(masterAddr, signer) - StopLimit = StopLimit__factory.connect(stopLimitAddr, signer) - Bracket = Bracket__factory.connect(bracketAddr, signer) - - if (!mainnet) { - signer = await ethers.getSigner(userAddr) - - console.log("IMPERSONATING: ", await signer.getAddress()) - - //testing does not scale tx cost correctly - await setBalance(await signer.getAddress(), ethers.parseEther("1")) - await impersonateAccount(await signer.getAddress()) - - } - - await checkOrder(signer) - -} - -const checkOrder = async (signer: Signer) => { - - //await resetCurrentArbBlock(266980619) - await resetCurrentArb() - - const orderId = 4//266980619//current sl price, high str price low stop price - //const orderId = 3//266977095//high sl price - //const orderId = 2//266974358//low sl price - - //const result = await Master.checkUpkeep("0x") - //console.log(result.upkeepNeeded) - - //get order - const order = await StopLimit.orders(orderId) - //console.log("order", order) - - const er = await Master.getExchangeRate(order.tokenIn, order.tokenOut) - console.log("EXCHANGE RATE: ", er) - - - await impersonateAccount(await signer.getAddress()) - await setBalance(await signer.getAddress(), ethers.parseEther("1")) - - let check = await Master.checkUpkeep("0x") - console.log("UpkeepNeeded: ", check.upkeepNeeded) - - - //create an order to compare - await WETH.connect(signer).approve(await StopLimit.getAddress(), wethAmount) - await StopLimit.connect(signer).createOrder( - 249399113866n, - er, - 1n, - wethAmount, - await WETH.getAddress(), - await USDC.getAddress(), - await signer.getAddress(), - 500, - 500, - 500, - false, - false, - "0x" - ) - - const filter = StopLimit.filters.OrderCreated - const events = await StopLimit.queryFilter(filter, -1) - const event = events[0].args - const testOrderId = (event[0]) - - const testOrder = await StopLimit.orders(testOrderId) - console.log(testOrder) - console.log("ORDER CREATED") - - await hardhat_mine_timed(10, 5) - - check = await Master.checkUpkeep("0x") - console.log("UpkeepNeeded: ", check.upkeepNeeded) - - //252295854237n - //252292592233n - - - - - - - - /** - if (result.upkeepNeeded) { - - - const data: MasterUpkeepData = await decodeUpkeepData(result.performData, signer) - console.log("DECODED", data.txData)//todo - - const minAmountReceived = await Master.getMinAmountReceived(data.amountIn, data.tokenIn, data.tokenOut, data.bips) - console.log("MAR: ", ethers.formatUnits(minAmountReceived, 6), minAmountReceived) - - const encodedTxData = await generateUniTx( - a.uniRouter, - UniswapV3Pool__factory.connect(a.bridgedUsdcPool, signer), - bracketAddr, - minAmountReceived, - data - ) - - await Master.performUpkeep(encodedTxData) - console.log("DONE") - - - - - - - } - */ - -} - - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error) - process.exit(1) - }) diff --git a/oku-custom-order-types/scripts/makeOrders.ts b/oku-custom-order-types/scripts/makeOrders.ts deleted file mode 100644 index ed9ffcb..0000000 --- a/oku-custom-order-types/scripts/makeOrders.ts +++ /dev/null @@ -1,260 +0,0 @@ -import hre, { network } from "hardhat"; -import { currentBlock, resetCurrentArb, resetCurrentBase, resetCurrentOP } from "../util/block"; -import { AutomationMaster, AutomationMaster__factory, Bracket, Bracket__factory, IERC20, IERC20__factory, IPermit2__factory, StopLimit, StopLimit__factory, UniswapV3Pool__factory } from "../typechain-types"; -import { AbiCoder, Signer } from "ethers"; -import { impersonateAccount } from "../util/impersonator"; -import { setBalance } from "@nomicfoundation/hardhat-network-helpers"; -import { decodeUpkeepData, generateUniTx, generateUniTxData, MasterUpkeepData, permitSingle } from "../util/msc"; -import { a, b, o } from "../util/addresser"; -import { s, SwapParams } from "../test/triggerV2/scope"; -const { ethers } = require("hardhat"); - - -let Master: AutomationMaster -let StopLimit: StopLimit -let Bracket: Bracket -let mainnet = true -let masterAddr: string //"0x8327B0168858bd918A0177e89b2c172475F6B16f"//second deploy//0x4f38FA4F676a053ea497F295f855B2dC3580f517"//initial deploy -let bracketAddr: string -let stopLimitAddr: string -let permitAddr: string - -//tokens -let WETH: IERC20 -let USDC: IERC20 - - -//SET THIS FOR TESTING -const testingNetwork = "op" -const userAddr = "0x085909388fc0cE9E5761ac8608aF8f2F52cb8B89" -const wethAmount = ethers.parseEther("0.0005") -const stopLimitDelta = ethers.parseUnits("1", 8) -const strikeDelta = ethers.parseUnits("5", 8) -const stopDelta = ethers.parseUnits("5", 8) -const testBips = 2000 -let chainId = 42161 - -async function main() { - console.log("STARTING") - let networkName = hre.network.name - console.log(networkName) - - let [signer] = await ethers.getSigners() - - const network = await ethers.provider.getNetwork(); - chainId = Number(network.chainId) - - if (networkName == "hardhat" || networkName == "localhost") { - networkName = testingNetwork - mainnet = false - console.log("Testing on network : ", networkName) - - } else { - console.log("Sending for real to: ", networkName) - } - - if (networkName == "arbitrum") { - - if (!mainnet) { - await resetCurrentArb() - console.log("Testing on ARB @", (await currentBlock())?.number) - - } - masterAddr = a.Master - stopLimitAddr = a.stopLimit - bracketAddr = a.bracket - permitAddr = a.permit2 - - WETH = IERC20__factory.connect(a.wethAddress, signer) - USDC = IERC20__factory.connect(a.nativeUsdcAddress, signer) - } - - if (networkName == "base") { - - if (!mainnet) { - await resetCurrentBase() - console.log("Testing on BASE @", (await currentBlock())?.number) - - } - masterAddr = b.Master - stopLimitAddr = b.stopLimit - bracketAddr = b.bracket - permitAddr = b.permit2 - - WETH = IERC20__factory.connect(b.wethAddress, signer) - USDC = IERC20__factory.connect(b.nativeUsdcAddress, signer) - } - - if (networkName == "op") { - - if (!mainnet) { - console.log("RESETTING TO OP") - await resetCurrentOP() - console.log("Testing on OP @", (await currentBlock())?.number) - chainId = Number(network.chainId) - console.log("GOT CI: ", chainId) - } else { - chainId = 10 - } - masterAddr = o.Master - stopLimitAddr = o.stopLimit - bracketAddr = o.bracket - permitAddr = o.permit2 - - WETH = IERC20__factory.connect(o.wethAddress, signer) - USDC = IERC20__factory.connect(o.nativeUsdcAddress, signer) - - } - - - Master = AutomationMaster__factory.connect(masterAddr, signer) - StopLimit = StopLimit__factory.connect(stopLimitAddr, signer) - Bracket = Bracket__factory.connect(bracketAddr, signer) - - if (!mainnet) { - signer = await ethers.getSigner(userAddr) - - //testing does not scale tx cost correctly - await setBalance(await signer.getAddress(), ethers.parseEther("1")) - await impersonateAccount(await signer.getAddress()) - - } - const delta = ethers.parseUnits("50", 8) - - await createStopLimitOrder(signer, delta) - await createStopLimitOrder(signer, delta * 2n) - await createStopLimitOrder(signer, delta * 3n) - await createBracketOrder(signer, delta) - await createBracketOrder(signer, delta * 2n) - await createBracketOrder(signer, delta * 3n) - - -} - -const createBracketOrder = async (signer: Signer, delta: bigint) => { - const currentPrice = await Master.getExchangeRate(await WETH.getAddress(), await USDC.getAddress()) - await WETH.connect(signer).approve(await Bracket.getAddress(), wethAmount) - - await Bracket.connect(signer).createOrder( - "0x", - currentPrice + delta, - currentPrice - delta, - wethAmount, - await WETH.getAddress(), - await USDC.getAddress(), - await signer.getAddress(), - 5, - 500, - 500, - false, - "0x" - ) -} - -const createStopLimitOrder = async (signer: Signer, delta: bigint) => { - - - const currentPrice = await Master.getExchangeRate(await WETH.getAddress(), await USDC.getAddress()) - await WETH.connect(signer).approve(await StopLimit.getAddress(), wethAmount) - await StopLimit.connect(signer).createOrder( - currentPrice - delta, - currentPrice + delta, - currentPrice - (delta * 2n), - wethAmount, - await WETH.getAddress(), - await USDC.getAddress(), - await signer.getAddress(), - 5, - 500, - 500, - 500, - true, - false, - "0x" - ) - - - -} - -const createStopLimitPermit = async (signer: Signer) => { - - const permit = await permitSingle( - signer, - chainId, - await WETH.getAddress(), - wethAmount, - await StopLimit.getAddress(), - o.permit2 - ) - - const abi = new AbiCoder() - const encoded = abi.encode( - [ - "tuple(" + - "tuple(address token, uint160 amount, uint48 nonce, uint48 expiry) details, " + - "address spender, " + - "uint48 sigDeadline" + - "), " + - "bytes" - ], - [ - [ - [ - permit.permitSingle.details.token, - permit.permitSingle.details.amount, - permit.permitSingle.details.nonce, - permit.permitSingle.details.expiration - ], - permit.permitSingle.spender, - permit.permitSingle.sigDeadline - ], - permit.signature - ] - ); - //await StopLimit.connect(signer) - -} - -const checkOrder = async (signer: Signer) => { - - - const result = await Master.checkUpkeep("0x") - console.log(result.upkeepNeeded) - - if (result.upkeepNeeded) { - - - const data: MasterUpkeepData = await decodeUpkeepData(result.performData, signer) - console.log("DECODED", data.txData)//todo - - const minAmountReceived = await Master.getMinAmountReceived(data.amountIn, data.tokenIn, data.tokenOut, data.bips) - console.log("MAR: ", ethers.formatUnits(minAmountReceived, 6), minAmountReceived) - - const encodedTxData = await generateUniTx( - a.uniRouter, - UniswapV3Pool__factory.connect(a.bridgedUsdcPool, signer), - bracketAddr, - minAmountReceived, - data - ) - - await Master.performUpkeep(encodedTxData) - console.log("DONE") - - - - - - - } - -} - - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error) - process.exit(1) - }) diff --git a/oku-custom-order-types/test/triggerV2/failure_STOP_LOSS_LIMIT.ts b/oku-custom-order-types/test/triggerV2/failure_BRACKET.ts similarity index 83% rename from oku-custom-order-types/test/triggerV2/failure_STOP_LOSS_LIMIT.ts rename to oku-custom-order-types/test/triggerV2/failure_BRACKET.ts index 97c74cc..c690132 100644 --- a/oku-custom-order-types/test/triggerV2/failure_STOP_LOSS_LIMIT.ts +++ b/oku-custom-order-types/test/triggerV2/failure_BRACKET.ts @@ -56,7 +56,7 @@ describe("Test for failure - STOP LOSS LIMIT", () => { "0x" ) - + const filter = s.Bracket.filters.OrderCreated const events = await s.Bracket.queryFilter(filter, -1) const event = events[0].args @@ -96,7 +96,9 @@ describe("Test for failure - STOP LOSS LIMIT", () => { expect(s.Master.performUpkeep(encodedTxData)).to.be.revertedWith("Too Little Received") //try to cancel order that isn't yours - expect(s.Bracket.connect(s.Bob).cancelOrder(steveOrder)).to.be.revertedWith("Only Order Owner") + let orders = await s.Bracket.getPendingOrders() + let orderIndex = orders.findIndex((id: bigint) => id === steveOrder) + expect(s.Bracket.connect(s.Bob).cancelOrder(orderIndex)).to.be.revertedWith("Only Order Owner") minAmountReceived = await s.Master.getMinAmountReceived(data.amountIn, data.tokenIn, data.tokenOut, data.bips)//actual bips are 0% slippage @@ -113,7 +115,9 @@ describe("Test for failure - STOP LOSS LIMIT", () => { //cancel order for future tests - await s.Bracket.connect(s.Steve).cancelOrder(steveOrder) + orders = await s.Bracket.getPendingOrders() + orderIndex = orders.findIndex((id: bigint) => id === steveOrder) + await s.Bracket.connect(s.Steve).cancelOrder(orderIndex) }) @@ -182,7 +186,6 @@ describe("Test for failure - STOP LOSS LIMIT", () => { //how much weth is on the contract, relative to how much we are supposed to be allowed to send (steve's order.amountIn)? const totalWeths = await s.WETH.balanceOf(await s.Bracket.getAddress()) const expectedAmountIn = data.amountIn - const expectedRemaining = totalWeths - expectedAmountIn //inject malicious amount into the tx data data.amountIn += ethers.parseEther("5")//increase the amount we pass in to encoded data @@ -219,6 +222,39 @@ describe("Test for failure - STOP LOSS LIMIT", () => { }) + it("check pausable", async () => { + + //try to pause when not authorized + expect(s.Master.connect(s.Bob).pauseAll(true, await s.OracleLess.getAddress())).to.be.revertedWith("Not Authorized") + expect(s.Bracket.connect(s.Bob).pause(true)).to.be.revertedWith("Not Authorized") + expect(s.StopLimit.connect(s.Bob).pause(true)).to.be.revertedWith("Not Authorized") + expect(s.OracleLess.connect(s.Bob).pause(true)).to.be.revertedWith("Not Authorized") + + //check pausable + await s.Master.pauseAll(true, await s.OracleLess.getAddress()) + + //create order + await s.WETH.connect(s.Steve).approve(await s.Bracket.getAddress(), s.wethAmount) + expect(s.Bracket.connect(s.Steve).createOrder( + "0x", + currentPrice + steveStrikeDelta, + currentPrice - steveStrikeDelta, + s.wethAmount, + await s.WETH.getAddress(), + await s.USDC.getAddress(), + await s.Steve.getAddress(), + 5,//5 bips fee + steveBips, + steveBips, + false, + "0x" + )).to.be.revertedWith("EnforcedPause()") + + //unpause + await s.Master.pauseAll(false, await s.OracleLess.getAddress()) + + }) + }) diff --git a/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts b/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts index 4c8bf15..e42a602 100644 --- a/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts +++ b/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts @@ -55,8 +55,28 @@ describe("Test for failure - Oracleless", () => { )).to.be.revertedWith("ERC20: transfer amount exceeds balance") }) - it("Create an order", async () => { + it("check pausable", async () => { + + //check pausable + await s.Master.pauseAll(true, await s.OracleLess.getAddress()) + + //create order + await s.WETH.connect(s.Steve).approve(await s.StopLimit.getAddress(), veryLargeWethAmount) + expect(s.OracleLess.connect(s.Steve).createOrder( + await s.WETH.getAddress(), + await s.USDC.getAddress(), + veryLargeWethAmount, + 0, + await s.Steve.getAddress(), + 25, + false,//no permit + "0x" + )).to.be.revertedWith("EnforcedPause()") + + //unpause + await s.Master.pauseAll(false, await s.OracleLess.getAddress()) + }) }) diff --git a/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts.rej b/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts.rej new file mode 100644 index 0000000..57067e9 --- /dev/null +++ b/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts.rej @@ -0,0 +1,31 @@ +diff a/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts b/oku-custom-order-types/test/triggerV2/failure_ORACLE_LESS.ts (rejected hunks) +@@ -55,8 +55,28 @@ describe("Test for failure - Oracleless", () => { + )).to.be.revertedWith("ERC20: transfer amount exceeds balance") + }) + +- it("Create an order", async () => { ++ it("check pausable", async () => { ++ + ++ //check pausable ++ await s.Master.pauseAll(true, await s.OracleLess.getAddress()) ++ ++ //create order ++ await s.WETH.connect(s.Steve).approve(await s.StopLimit.getAddress(), veryLargeWethAmount) ++ expect(s.OracleLess.connect(s.Steve).createOrder( ++ await s.WETH.getAddress(), ++ await s.USDC.getAddress(), ++ veryLargeWethAmount, ++ 0, ++ await s.Steve.getAddress(), ++ 25, ++ false,//no permit ++ "0x" ++ )).to.be.revertedWith("EnforcedPause()") ++ ++ //unpause ++ await s.Master.pauseAll(false, await s.OracleLess.getAddress()) ++ + }) + + }) diff --git a/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts b/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts index d4da4ac..6b2a996 100644 --- a/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts +++ b/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts @@ -61,6 +61,34 @@ describe("Test for failure - STOP LIMIT", () => { )).to.be.revertedWith("ERC20: transfer amount exceeds balance") }) + it("check pausable", async () => { + + //check pausable + await s.Master.pauseAll(true, await s.OracleLess.getAddress()) + + await s.WETH.connect(s.Steve).approve(await s.StopLimit.getAddress(), veryLargeWethAmount) + expect(s.StopLimit.connect(s.Steve).createOrder( + currentPrice - steveStrikeDelta, + currentPrice + steveStrikeDelta, + 0, + veryLargeWethAmount, + await s.WETH.getAddress(), + await s.USDC.getAddress(), + await s.Steve.getAddress(), + smallSlippage, + smallSlippage, + 5n,//fee + 0, + false, + false,//no permit + "0x" + )).to.be.revertedWith("EnforcedPause()") + + //unpause + await s.Master.pauseAll(false, await s.OracleLess.getAddress()) + + }) + }) diff --git a/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts.rej b/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts.rej new file mode 100644 index 0000000..28e2302 --- /dev/null +++ b/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts.rej @@ -0,0 +1,43 @@ +diff a/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts b/oku-custom-order-types/test/triggerV2/failure_STOP_LIMIT.ts (rejected hunks) +@@ -57,10 +57,40 @@ describe("Test for failure - STOP LIMIT", () => { + 0, + false, + false,//no permit +- "0x" ++ "0x", ++ { value: s.fee } + )).to.be.revertedWith("ERC20: transfer amount exceeds balance") + }) + ++ it("check pausable", async () => { ++ ++ //check pausable ++ await s.Master.pauseAll(true, await s.OracleLess.getAddress()) ++ ++ await s.WETH.connect(s.Steve).approve(await s.StopLimit.getAddress(), veryLargeWethAmount) ++ expect(s.StopLimit.connect(s.Steve).createOrder( ++ currentPrice - steveStrikeDelta, ++ currentPrice + steveStrikeDelta, ++ 0, ++ veryLargeWethAmount, ++ await s.WETH.getAddress(), ++ await s.USDC.getAddress(), ++ await s.Steve.getAddress(), ++ smallSlippage, ++ smallSlippage, ++ 5n,//fee ++ 0, ++ false, ++ false,//no permit ++ "0x", ++ { value: s.fee } ++ )).to.be.revertedWith("EnforcedPause()") ++ ++ //unpause ++ await s.Master.pauseAll(false, await s.OracleLess.getAddress()) ++ ++ }) ++ + }) + + diff --git a/oku-custom-order-types/test/triggerV2/happyPath.ts b/oku-custom-order-types/test/triggerV2/happyPath.ts index caeed34..431e807 100644 --- a/oku-custom-order-types/test/triggerV2/happyPath.ts +++ b/oku-custom-order-types/test/triggerV2/happyPath.ts @@ -43,9 +43,9 @@ describe("Automated Trigger Testing on Arbitrum", () => { it("Deploy", async () => { //deploy master - s.Master = await DeployContract(new AutomationMaster__factory(s.Frank), s.Frank) + s.Master = await DeployContract(new AutomationMaster__factory(s.Frank), s.Frank, await s.Frank.getAddress()) //deploy stop loss limit - s.Bracket = await DeployContract(new Bracket__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2) + s.Bracket = await DeployContract(new Bracket__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2, await s.Frank.getAddress()) //deploy stop limit s.StopLimit = await DeployContract( @@ -53,7 +53,8 @@ describe("Automated Trigger Testing on Arbitrum", () => { s.Frank, await s.Master.getAddress(), await s.Bracket.getAddress(), - a.permit2 + a.permit2, + await s.Frank.getAddress() ) @@ -69,6 +70,16 @@ describe("Automated Trigger Testing on Arbitrum", () => { it("Register", async () => { + //whitelist target setters + //now bob can set the target + expect(s.Master.connect(s.Bob).whitelistTargetSetter(await s.Bob.getAddress(), true)).to.be.revertedWith('only owner') + await s.Master.connect(s.Frank).whitelistTargetSetter(await s.Bob.getAddress(), true) + + //whitelist targets + expect(s.Master.connect(s.Frank).whitelistTargets([s.router02])).to.be.revertedWith("!Allowed to set targets") + await s.Master.connect(s.Bob).whitelistTargets([s.router02]) + + //register sup keepers await s.Master.connect(s.Frank).registerSubKeepers( await s.StopLimit.getAddress(), @@ -86,6 +97,9 @@ describe("Automated Trigger Testing on Arbitrum", () => { //set min order size 1000000000n await s.Master.connect(s.Frank).setMinOrderSize(s.minOrderSize) + //set fee + await s.Master.setOrderFee(s.fee) + }) it("Check upkeep", async () => { @@ -136,7 +150,8 @@ describe("Execute Stop-Limit Upkeep", () => { 0,//no swap on fill bips false,//no swap on fill false,//no permit - "0x" + "0x", + { value: s.fee } ) const filter = s.StopLimit.filters.OrderCreated @@ -212,7 +227,7 @@ describe("Execute Stop-Limit Upkeep", () => { expect(balance).to.be.eq(0n, "WETH removed from stopLimit") //pending order removed and length == 0 - expect(await s.StopLimit.pendingOrderIds.length).to.eq(0, "no pending orders left") + expect((await s.StopLimit.getPendingOrders()).length).to.eq(0, "no pending orders left") //stop-limit order filled event const Filter = s.StopLimit.filters.OrderProcessed @@ -243,18 +258,13 @@ describe("Execute Stop-Limit Upkeep", () => { expect(balance).to.eq(s.wethAmount, "WETH received") //cancel limit order for future tests - await s.Bracket.connect(s.Bob).cancelOrder(orderId.toString()) - }) -}) - -describe("Permit Check", () => { - it("Permit Check", async () => { - + //get order index + const orders = await s.Bracket.getPendingOrders() + const orderIndex = orders.findIndex((id: bigint) => id === orderId) + await s.Bracket.connect(s.Bob).cancelOrder(orderIndex) }) }) - - /** * For swap on fill, we expect to receive the same asset we provide * In this case, we provide USDC, swap to WETH when the stop limit is filled, @@ -276,7 +286,7 @@ describe("Execute Stop-Limit with swap on fill", () => { let charlesOrder: BigInt //setup before(async () => { - //steal money for s.Bob + //steal money await stealMoney(s.usdcWhale, await s.Charles.getAddress(), await s.USDC.getAddress(), s.usdcAmount) //reset test oracle price await s.wethOracle.setPrice(s.initialEthPrice) @@ -301,7 +311,8 @@ describe("Execute Stop-Limit with swap on fill", () => { swapBips,//no swap on fill bips true,//swap on fill false,//no permit - "0x" + "0x", + { value: s.fee } ) const filter = s.StopLimit.filters.OrderCreated @@ -380,9 +391,10 @@ describe("Execute Stop-Limit with swap on fill", () => { //stop limit pending order removed expect((await s.StopLimit.getPendingOrders()).length).to.eq(0, "no pending orders left") - //stop loss limit order created + //bracket order created expect((await s.Bracket.getPendingOrders()).length).to.eq(1, "new pending order") - expect(await s.Bracket.pendingOrderIds(0)).to.eq(charlesOrder, "Charles's order is pending") + const pendingOrders = await s.Bracket.getPendingOrders() + expect(pendingOrders[0].orderId).to.eq(charlesOrder, "Charles's order is pending") }) it("Check Upkeep", async () => { @@ -431,20 +443,16 @@ describe("Execute Stop-Limit with swap on fill", () => { it("Verify", async () => { expect((await s.Bracket.getPendingOrders()).length).to.eq(0, "no pending orders") - //USDC received is not perfect as we do not attempt to manipulate the true uni pool price let balance = await s.USDC.balanceOf(await s.Charles.getAddress()) - //expect(Number(ethers.formatUnits(balance, 6))).to.be.closeTo(Number(ethers.formatUnits(s.usdcAmount)), 10, "USDC received") - //console.log("todo") - - - + expect(balance).to.be.closeTo(s.usdcAmount, 10000000, "USDC Received") + expect((await s.Bracket.getPendingOrders()).length).to.eq(0, "no pending orders left on Bracket") }) }) /** - * stop-loss-limit orders create a limit order with an added stop loss + * bracket orders create a limit order with an added stop loss * stop price is the fill price for the stop loss * strike price is the fill price for the limit order * the stop and limit fill each have their own slippage @@ -465,6 +473,7 @@ describe("Execute Bracket Upkeep", () => { before(async () => { //steal money for s.Bob await stealMoney(s.usdcWhale, await s.Bob.getAddress(), await s.USDC.getAddress(), s.usdcAmount) + //reset test oracle price await s.wethOracle.setPrice(s.initialEthPrice) await s.usdcOracle.setPrice(s.initialUsdcPrice) @@ -476,7 +485,7 @@ describe("Execute Bracket Upkeep", () => { }) - it("Create stop-loss-limit order with swap USDC => WETH => USDC", async () => { + it("Create bracket order with swap USDC => WETH => USDC", async () => { const currentPrice = await s.Master.getExchangeRate(await s.WETH.getAddress(), await s.USDC.getAddress()) await s.USDC.connect(s.Bob).approve(await s.Bracket.getAddress(), s.usdcAmount) const swapInData = await generateUniTxData( @@ -509,6 +518,22 @@ describe("Execute Bracket Upkeep", () => { ["tuple(address,uint256,address,uint32,bytes)"], // Struct as a tuple [swapParamsTuple] // Data as a single tuple ); + //check for minOrderSize + expect(s.Bracket.connect(s.Bob).createOrder( + "0x", + currentPrice + strikeDelta, + currentPrice - stopDelta, + 1n,//tiny input amount + await s.WETH.getAddress(), + await s.USDC.getAddress(), + await s.Bob.getAddress(), + 5,//5 bips fee + strikeBips, + stopBips, + false,//no permit + "0x", + { value: s.fee } + )).to.be.revertedWith("order too small") await s.Bracket.connect(s.Bob).createOrder( swapPayload, @@ -522,10 +547,10 @@ describe("Execute Bracket Upkeep", () => { strikeBips, stopBips, false,//no permit - "0x" + "0x", + { value: s.fee } ) - const filter = s.Bracket.filters.OrderCreated const events = await s.Bracket.queryFilter(filter, -1) const event = events[0].args @@ -577,6 +602,18 @@ describe("Execute Bracket Upkeep", () => { expect(result.upkeepNeeded).to.eq(true, "Upkeep is now needed") result = await s.Bracket.checkUpkeep("0x") expect(result.upkeepNeeded).to.eq(true, "Upkeep is now needed") + + //check specific indexes + let start = 0 + let finish = 1 + const abi = new AbiCoder() + const encodedIdxs = abi.encode(["uint96", "uint96"], [start, finish]) + result = await s.Bracket.checkUpkeep(encodedIdxs) + expect(result.upkeepNeeded).to.eq(true, "first idx updeep is needed") + + console.log("Checking from master") + result = await s.Master.checkUpkeep(encodedIdxs) + expect(result.upkeepNeeded).to.eq(true, "first idx updeep is needed") }) it("Perform Upkeep - stop loss", async () => { @@ -608,7 +645,7 @@ describe("Execute Bracket Upkeep", () => { expect(usdcBalance).to.be.gt(0n, "USDC received") //pending order removed and length == 0 - expect(await s.Bracket.pendingOrderIds.length).to.eq(0, "no pending orders left") + expect((await s.Bracket.getPendingOrders()).length).to.eq(0, "no pending orders left") //event const filter = s.Bracket.filters.OrderProcessed @@ -626,6 +663,7 @@ describe("Execute Bracket Upkeep", () => { }) }) + describe("Bracket order with order modification", () => { const stopDelta = ethers.parseUnits("500", 8) @@ -652,7 +690,7 @@ describe("Bracket order with order modification", () => { }) - it("Create stop-loss-limit order with swap USDC => WETH => USDC", async () => { + it("Create bracket order with swap USDC => WETH => USDC", async () => { const currentPrice = await s.Master.getExchangeRate(await s.WETH.getAddress(), await s.USDC.getAddress()) await s.USDC.connect(s.Bob).approve(await s.Bracket.getAddress(), s.usdcAmount) const swapInData = await generateUniTxData( @@ -703,7 +741,8 @@ describe("Bracket order with order modification", () => { strikeBips, stopBips, false, - "0x" + "0x", + { value: s.fee } ) const filter = s.Bracket.filters.OrderCreated @@ -727,6 +766,9 @@ describe("Bracket order with order modification", () => { const ogWethBal = await s.WETH.balanceOf(await s.Bob.getAddress()) + //get pending order IDX + const pendingOrders = await s.Bracket.getPendingOrders() + //increase amount, providing more USDC to add to the position await s.WETH.connect(s.Bob).approve(await s.Bracket.getAddress(), amountInDelta) await s.Bracket.connect(s.Bob).modifyOrder( @@ -738,13 +780,15 @@ describe("Bracket order with order modification", () => { ogOrder.recipient, ogOrder.takeProfitSlippage, ogOrder.stopSlippage, - false, true, + pendingOrders.findIndex((id: bigint) => id === orderId), + false, "0x" ); //verify const increasedOrder = await s.Bracket.orders(ethers.toBigInt(orderId.toString())) + expect(increasedOrder.amountIn).to.eq(ogOrder.amountIn + amountInDelta, "AmountIn correct") let balance = await s.WETH.balanceOf(await s.Bob.getAddress()) @@ -765,6 +809,7 @@ describe("Bracket order with order modification", () => { ogOrder.takeProfitSlippage, ogOrder.stopSlippage, false, + pendingOrders.findIndex((id) => id === orderId), false, "0x" ); @@ -784,7 +829,7 @@ describe("Bracket order with order modification", () => { const currentPrice = await s.Master.getExchangeRate(await s.WETH.getAddress(), await s.USDC.getAddress()) const ogOrder = await s.Bracket.orders(orderId.toString()) - + const pendingOrders = await s.Bracket.getPendingOrders() //set stop above strike price await s.Bracket.connect(s.Bob).modifyOrder( orderId.toString(), @@ -796,6 +841,7 @@ describe("Bracket order with order modification", () => { ogOrder.takeProfitSlippage, ogOrder.stopSlippage, false, + pendingOrders.findIndex((id) => id === orderId), false, "0x" ); @@ -813,6 +859,7 @@ describe("Bracket order with order modification", () => { ogOrder.takeProfitSlippage, ogOrder.stopSlippage, false, + pendingOrders.findIndex((id) => id === orderId), false, "0x" ) @@ -830,6 +877,7 @@ describe("Bracket order with order modification", () => { ogOrder.takeProfitSlippage, ogOrder.stopSlippage, false, + pendingOrders.findIndex((id) => id === orderId), false, "0x" ) @@ -850,6 +898,7 @@ describe("Bracket order with order modification", () => { ogOrder.takeProfitSlippage, ogOrder.stopSlippage, false, + pendingOrders.findIndex((id) => id === orderId), false, "0x" ) @@ -891,6 +940,18 @@ describe("Bracket order with order modification", () => { expect(result.upkeepNeeded).to.eq(true, "Upkeep is now needed") result = await s.Bracket.checkUpkeep("0x") expect(result.upkeepNeeded).to.eq(true, "Upkeep is now needed") + + //check specific indexes + let start = 0 + let finish = 1 + const abi = new AbiCoder() + const encodedIdxs = abi.encode(["uint96", "uint96"], [start, finish]) + result = await s.Bracket.checkUpkeep(encodedIdxs) + expect(result.upkeepNeeded).to.eq(true, "first idx updeep is needed") + + console.log("Checking from master") + result = await s.Master.checkUpkeep(encodedIdxs) + expect(result.upkeepNeeded).to.eq(true, "first idx updeep is needed") }) it("Perform Upkeep - stop loss", async () => { @@ -922,7 +983,7 @@ describe("Bracket order with order modification", () => { expect(usdcBalance).to.be.gt(0n, "USDC received") //pending order removed and length == 0 - expect(await s.Bracket.pendingOrderIds.length).to.eq(0, "no pending orders left") + expect((await s.Bracket.getPendingOrders()).length).to.eq(0, "no pending orders left") //event const filter = s.Bracket.filters.OrderProcessed @@ -955,13 +1016,19 @@ describe("Oracle Less", () => { const expectedAmountOut = 5600885752n const minAmountOut = expectedAmountOut - 50n let orderId: bigint + + let fee = ethers.parseEther("0.0001") + before(async () => { - s.OracleLess = await DeployContract(new OracleLess__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2) + s.OracleLess = await DeployContract(new OracleLess__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2, await s.Frank.getAddress()) await stealMoney(s.wethWhale, await s.Oscar.getAddress(), await s.WETH.getAddress(), s.wethAmount) + + //set fee + await s.OracleLess.setOrderFee(fee) + }) it("Create Order", async () => { - await s.WETH.connect(s.Oscar).approve(await s.OracleLess.getAddress(), s.wethAmount) await s.OracleLess.connect(s.Oscar).createOrder( await s.WETH.getAddress(), @@ -971,7 +1038,8 @@ describe("Oracle Less", () => { await s.Oscar.getAddress(), 25, false, - "0x" + "0x", + { value: fee } ) const filter = s.OracleLess.filters.OrderCreated const events = await s.OracleLess.queryFilter(filter, -1) @@ -984,6 +1052,8 @@ describe("Oracle Less", () => { const delta = 10000000n const initialWeth = await s.WETH.balanceOf(await s.Oscar.getAddress()) + const pendingOrders = await s.OracleLess.getPendingOrders() + //imposter expect(s.OracleLess.connect(s.Bob).modifyOrder( orderId, @@ -992,8 +1062,10 @@ describe("Oracle Less", () => { order.minAmountOut, order.recipient, false, + pendingOrders.findIndex((id) => id.orderId === orderId), false, - "0x" + "0x", + { value: fee } )).to.be.revertedWith("only order owner") //decrease amount @@ -1004,8 +1076,10 @@ describe("Oracle Less", () => { order.minAmountOut, order.recipient, false, + pendingOrders.findIndex((id) => id.orderId === orderId), false, - "0x" + "0x", + { value: fee } ) //check for refund expect(await s.WETH.balanceOf(await s.Oscar.getAddress())).to.eq(initialWeth + delta, "WETH received") @@ -1019,14 +1093,17 @@ describe("Oracle Less", () => { order.minAmountOut, order.recipient, true, + pendingOrders.findIndex((id) => id.orderId === orderId), false, - "0x" + "0x", + { value: fee } ) expect(await s.WETH.balanceOf(await s.Oscar.getAddress())).to.eq(initialWeth, "WETH spent") }) it("Modify Amount Received", async () => { + const pendingOrders = await s.OracleLess.getPendingOrders() const order = await s.OracleLess.orders(orderId) //increase min amount down @@ -1037,8 +1114,10 @@ describe("Oracle Less", () => { expectedAmountOut + 50n, order.recipient, false, + pendingOrders.findIndex((id) => id.orderId === orderId), false, - "0x" + "0x", + { value: fee } ) const txData = await generateUniTxData( @@ -1061,8 +1140,10 @@ describe("Oracle Less", () => { minAmountOut, order.recipient, false, + pendingOrders.findIndex((id) => id.orderId === orderId), false, - "0x" + "0x", + { value: fee } ) }) @@ -1085,4 +1166,30 @@ describe("Oracle Less", () => { }) +describe("Verify Fee Collection", () => { + + it("Sweep ERC20 fees", async () => { + const usdcBalance = await s.USDC.balanceOf(await s.Master.getAddress()) + expect(usdcBalance).to.be.gt(0, "USDC fees accumulated") + + await s.Master.connect(s.Frank).sweep(await s.USDC.getAddress(), await s.Frank.getAddress()) + + expect(await s.USDC.balanceOf(s.Frank)).to.eq(usdcBalance, "Frank received fees") + }) + + it("Sweep native ether fees", async () => { + const balance = await ethers.provider.getBalance(await s.Master.getAddress()) + expect(balance).to.be.gt(0, "ETHER fees accumulated") + + + const initialBalance = await ethers.provider.getBalance(await s.Frank.getAddress()) + + await s.Master.connect(s.Frank).sweepEther(await s.Frank.getAddress()) + + const finalBalance = await ethers.provider.getBalance(await s.Frank.getAddress()) + + expect(Number(ethers.formatEther(finalBalance))).to.be.closeTo(Number(ethers.formatEther(initialBalance + balance)), 0.0001, "Fees swept") + + }) +}) diff --git a/oku-custom-order-types/test/triggerV2/happyPath.ts.rej b/oku-custom-order-types/test/triggerV2/happyPath.ts.rej new file mode 100644 index 0000000..bb4c2f1 --- /dev/null +++ b/oku-custom-order-types/test/triggerV2/happyPath.ts.rej @@ -0,0 +1,242 @@ +diff a/oku-custom-order-types/test/triggerV2/happyPath.ts b/oku-custom-order-types/test/triggerV2/happyPath.ts (rejected hunks) +@@ -31,21 +31,19 @@ describe("Automated Trigger Testing on Arbitrum", () => { + s.Oscar = s.signers[5] + s.Gary = s.signers[6] + +- + s.UniPool = UniswapV3Pool__factory.connect(s.pool, s.Frank) + s.WETH = IERC20__factory.connect(await s.UniPool.token0(), s.Frank) + s.USDC = IERC20__factory.connect(await s.UniPool.token1(), s.Frank) + s.ARB = IERC20__factory.connect("0x912CE59144191C1204E64559FE8253a0e49E6548", s.Frank) + s.UNI = IERC20__factory.connect("0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0", s.Frank) + +- + }) + + it("Deploy", async () => { + //deploy master +- s.Master = await DeployContract(new AutomationMaster__factory(s.Frank), s.Frank) ++ s.Master = await DeployContract(new AutomationMaster__factory(s.Frank), s.Frank, await s.Frank.getAddress()) + //deploy stop loss limit +- s.Bracket = await DeployContract(new Bracket__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2) ++ s.Bracket = await DeployContract(new Bracket__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2, await s.Frank.getAddress()) + + //deploy stop limit + s.StopLimit = await DeployContract( +@@ -53,7 +51,8 @@ describe("Automated Trigger Testing on Arbitrum", () => { + s.Frank, + await s.Master.getAddress(), + await s.Bracket.getAddress(), +- a.permit2 ++ a.permit2, ++ await s.Frank.getAddress() + ) + + +@@ -243,18 +256,10 @@ describe("Execute Stop-Limit Upkeep", () => { + expect(balance).to.eq(s.wethAmount, "WETH received") + + //cancel limit order for future tests +- await s.Bracket.connect(s.Bob).cancelOrder(orderId.toString()) +- }) +-}) +- +-describe("Permit Check", () => { +- it("Permit Check", async () => { +- ++ await s.Bracket.connect(s.Bob).cancelOrder(orderId as bigint) + }) + }) + +- +- + /** + * For swap on fill, we expect to receive the same asset we provide + * In this case, we provide USDC, swap to WETH when the stop limit is filled, +@@ -727,6 +761,9 @@ describe("Bracket order with order modification", () => { + + const ogWethBal = await s.WETH.balanceOf(await s.Bob.getAddress()) + ++ //get pending order IDX ++ const pendingOrders = await s.Bracket.getPendingOrders() ++ + //increase amount, providing more USDC to add to the position + await s.WETH.connect(s.Bob).approve(await s.Bracket.getAddress(), amountInDelta) + await s.Bracket.connect(s.Bob).modifyOrder( +@@ -738,13 +775,15 @@ describe("Bracket order with order modification", () => { + ogOrder.recipient, + ogOrder.takeProfitSlippage, + ogOrder.stopSlippage, +- false, + true, +- "0x" ++ false, ++ "0x", ++ { value: s.fee } + ); + + //verify + const increasedOrder = await s.Bracket.orders(ethers.toBigInt(orderId.toString())) ++ + expect(increasedOrder.amountIn).to.eq(ogOrder.amountIn + amountInDelta, "AmountIn correct") + + let balance = await s.WETH.balanceOf(await s.Bob.getAddress()) +@@ -766,7 +805,8 @@ describe("Bracket order with order modification", () => { + ogOrder.stopSlippage, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ); + + balance = await s.WETH.balanceOf(await s.Bob.getAddress()) +@@ -784,7 +824,7 @@ describe("Bracket order with order modification", () => { + + const currentPrice = await s.Master.getExchangeRate(await s.WETH.getAddress(), await s.USDC.getAddress()) + const ogOrder = await s.Bracket.orders(orderId.toString()) +- ++ const pendingOrders = await s.Bracket.getPendingOrders() + //set stop above strike price + await s.Bracket.connect(s.Bob).modifyOrder( + orderId.toString(), +@@ -797,7 +837,8 @@ describe("Bracket order with order modification", () => { + ogOrder.stopSlippage, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ); + //makes upkeep needed and will fill stop price and slippage + check = await s.Master.checkUpkeep("0x") +@@ -814,7 +855,8 @@ describe("Bracket order with order modification", () => { + ogOrder.stopSlippage, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + check = await s.Master.checkUpkeep("0x") + expect(check.upkeepNeeded).to.eq(false) +@@ -831,13 +873,12 @@ describe("Bracket order with order modification", () => { + ogOrder.stopSlippage, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + //upkeep not needed + check = await s.Master.checkUpkeep("0x") + expect(check.upkeepNeeded).to.eq(false) +- const newOrder = await s.Bracket.orders(orderId.toString()) +- expect(newOrder.direction).to.eq(!ogOrder.direction, "New order has inverted direction") + + //reset back to original for future tests + await s.Bracket.connect(s.Bob).modifyOrder( +@@ -851,7 +892,8 @@ describe("Bracket order with order modification", () => { + ogOrder.stopSlippage, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + check = await s.Master.checkUpkeep("0x") + expect(check.upkeepNeeded).to.eq(false) +@@ -939,29 +981,22 @@ describe("Bracket order with order modification", () => { + expect(check.upkeepNeeded).to.eq(false, "no upkeep is needed anymore") + }) + +- it("Verify fee", async () => { +- +- const usdcBalance = await s.USDC.balanceOf(await s.Master.getAddress()) +- expect(usdcBalance).to.be.gt(0, "USDC fees accumulated") +- +- await s.Master.connect(s.Frank).sweep(await s.USDC.getAddress()) +- +- expect(await s.USDC.balanceOf(s.Frank)).to.eq(usdcBalance, "Frank received fees") + +- }) + }) + + describe("Oracle Less", () => { + const expectedAmountOut = 5600885752n + const minAmountOut = expectedAmountOut - 50n + let orderId: bigint ++ ++ + before(async () => { +- s.OracleLess = await DeployContract(new OracleLess__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2) ++ s.OracleLess = await DeployContract(new OracleLess__factory(s.Frank), s.Frank, await s.Master.getAddress(), a.permit2, await s.Frank.getAddress()) ++ await s.OracleLess.whitelistTokens([await s.WETH.getAddress(), await s.USDC.getAddress()], [true, true]) + await stealMoney(s.wethWhale, await s.Oscar.getAddress(), await s.WETH.getAddress(), s.wethAmount) + }) + + it("Create Order", async () => { +- + await s.WETH.connect(s.Oscar).approve(await s.OracleLess.getAddress(), s.wethAmount) + await s.OracleLess.connect(s.Oscar).createOrder( + await s.WETH.getAddress(), +@@ -971,7 +1006,8 @@ describe("Oracle Less", () => { + await s.Oscar.getAddress(), + 25, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + const filter = s.OracleLess.filters.OrderCreated + const events = await s.OracleLess.queryFilter(filter, -1) +@@ -993,7 +1029,8 @@ describe("Oracle Less", () => { + order.recipient, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + )).to.be.revertedWith("only order owner") + + //decrease amount +@@ -1005,7 +1042,8 @@ describe("Oracle Less", () => { + order.recipient, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + //check for refund + expect(await s.WETH.balanceOf(await s.Oscar.getAddress())).to.eq(initialWeth + delta, "WETH received") +@@ -1020,7 +1058,8 @@ describe("Oracle Less", () => { + order.recipient, + true, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + expect(await s.WETH.balanceOf(await s.Oscar.getAddress())).to.eq(initialWeth, "WETH spent") + +@@ -1038,7 +1077,8 @@ describe("Oracle Less", () => { + order.recipient, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + + const txData = await generateUniTxData( +@@ -1062,7 +1102,8 @@ describe("Oracle Less", () => { + order.recipient, + false, + false, +- "0x" ++ "0x", ++ { value: s.fee } + ) + }) + diff --git a/oku-custom-order-types/test/triggerV2/index.ts b/oku-custom-order-types/test/triggerV2/index.ts index 4d8357c..5c77f2e 100644 --- a/oku-custom-order-types/test/triggerV2/index.ts +++ b/oku-custom-order-types/test/triggerV2/index.ts @@ -1,4 +1,4 @@ export * from "./happyPath" -export * from "./failure_STOP_LOSS_LIMIT" +export * from "./failure_BRACKET" export * from "./failure_STOP_LIMIT" export * from "./failure_ORACLE_LESS" \ No newline at end of file diff --git a/oku-custom-order-types/test/triggerV2/index.ts.rej b/oku-custom-order-types/test/triggerV2/index.ts.rej new file mode 100644 index 0000000..4e70a83 --- /dev/null +++ b/oku-custom-order-types/test/triggerV2/index.ts.rej @@ -0,0 +1,8 @@ +diff a/oku-custom-order-types/test/triggerV2/index.ts b/oku-custom-order-types/test/triggerV2/index.ts (rejected hunks) +@@ -1,4 +1,4 @@ + export * from "./happyPath" +-export * from "./failure_STOP_LOSS_LIMIT" ++export * from "./failure_BRACKET" + export * from "./failure_STOP_LIMIT" + export * from "./failure_ORACLE_LESS" +\ No newline at end of file diff --git a/oku-custom-order-types/test/triggerV2/scope.ts b/oku-custom-order-types/test/triggerV2/scope.ts index 4498b14..f8d7407 100644 --- a/oku-custom-order-types/test/triggerV2/scope.ts +++ b/oku-custom-order-types/test/triggerV2/scope.ts @@ -65,6 +65,7 @@ export class TestScope { maxPendingOrders = 20 minOrderSize = ethers.parseUnits("10", 8) + fee = ethers.parseEther("0.0001") diff --git a/oku-custom-order-types/util/block.ts b/oku-custom-order-types/util/block.ts index 7cbb211..7340fbb 100644 --- a/oku-custom-order-types/util/block.ts +++ b/oku-custom-order-types/util/block.ts @@ -48,6 +48,19 @@ export const nextBlockTime = async (blockTime: number) => { await network.provider.send("evm_setNextBlockTimestamp", [blockTime + 1]) } +export const resetGeneric = async (url: string) => { + await network.provider.request({ + method: 'hardhat_reset', + params: [ + { + forking: { + jsonRpcUrl: url + } + } + ] + }) +} + //reset to a current block on mainnet export const resetCurrent = async () => { await network.provider.request({ @@ -74,7 +87,7 @@ export const resetCurrentOP = async () => { }); } -export const resetCurrentOPblock = async (blockNumber:number) => { +export const resetCurrentOPblock = async (blockNumber: number) => { await network.provider.request({ method: "hardhat_reset", params: [ @@ -113,7 +126,7 @@ export const resetCurrentArb = async () => { ], }); } -export const resetCurrentArbBlock = async (blockNumber:number) => { +export const resetCurrentArbBlock = async (blockNumber: number) => { await network.provider.request({ method: "hardhat_reset", params: [ diff --git a/oku-custom-order-types/util/block.ts.rej b/oku-custom-order-types/util/block.ts.rej new file mode 100644 index 0000000..e02b4e3 --- /dev/null +++ b/oku-custom-order-types/util/block.ts.rej @@ -0,0 +1,39 @@ +diff a/oku-custom-order-types/util/block.ts b/oku-custom-order-types/util/block.ts (rejected hunks) +@@ -48,6 +48,19 @@ export const nextBlockTime = async (blockTime: number) => { + await network.provider.send("evm_setNextBlockTimestamp", [blockTime + 1]) + } + ++export const resetGeneric = async (url: string) => { ++ await network.provider.request({ ++ method: 'hardhat_reset', ++ params: [ ++ { ++ forking: { ++ jsonRpcUrl: url ++ } ++ } ++ ] ++ }) ++} ++ + //reset to a current block on mainnet + export const resetCurrent = async () => { + await network.provider.request({ +@@ -74,7 +87,7 @@ export const resetCurrentOP = async () => { + }); + } + +-export const resetCurrentOPblock = async (blockNumber:number) => { ++export const resetCurrentOPblock = async (blockNumber: number) => { + await network.provider.request({ + method: "hardhat_reset", + params: [ +@@ -113,7 +126,7 @@ export const resetCurrentArb = async () => { + ], + }); + } +-export const resetCurrentArbBlock = async (blockNumber:number) => { ++export const resetCurrentArbBlock = async (blockNumber: number) => { + await network.provider.request({ + method: "hardhat_reset", + params: [ diff --git a/oku-custom-order-types/util/deploymentAddresses.ts b/oku-custom-order-types/util/deploymentAddresses.ts new file mode 100644 index 0000000..090454b --- /dev/null +++ b/oku-custom-order-types/util/deploymentAddresses.ts @@ -0,0 +1,1452 @@ +import { ethers } from "hardhat"; + +export type tokenInfo = { + symbol: string, + token: string, + feed: string, + relay: string +} +export abstract class ChainAddresses { + readonly permit2: string = "" + + readonly allTokens: tokenInfo[] = [ + + ] + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class MainnetAddresses extends ChainAddresses { + + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3" + + readonly allTokens: tokenInfo[] = [ + { symbol: "WETH", token: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", feed: "0x5f4ec3df9cbd43714fe2740f5e3616155c5b8419", relay: "" }, + { symbol: "WSTETH", token: "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", feed: "0x164b276057258d81941e97B0a900D4C7B358bCe0", relay: "" }, + { symbol: "USDC", token: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", feed: "0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6", relay: "" }, + { symbol: "USDT", token: "0xdAC17F958D2ee523a2206206994597C13D831ec7", feed: "0x3E7d1eAB13ad0104d2750B8863b489D65364e32D", relay: "" }, + { symbol: "COMP", token: "0xc00e94cb662c3520282e6f5717214004a7f26888", feed: "0xdbd020caef83efd542f4de03e3cf0c28a4428bd5", relay: "" }, + { symbol: "WBTC", token: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", feed: "0xf4030086522a5beea4988f8ca5b36dbc97bee88c", relay: "" }, + { symbol: "UNI", token: "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", feed: "0x553303d460EE0afB37EdFf9bE42922D8FF63220e", relay: "" }, + { symbol: "ENS", token: "0xc18360217d8f7ab5e7c516566761ea12ce7f9d72", feed: "0x5C00128d4d1c2F4f652C267d7bcdD7aC99C16E16", relay: "" }, + { symbol: "DYDX", token: "0x92d6c1e31e14520e676a687f0a93788b716beff5", feed: "", relay: "" }, + { symbol: "AAVE", token: "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", feed: "0x547a514d5e3769680Ce22B2361c10Ea13619e8a9", relay: "" }, + { symbol: "MKR", token: "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", feed: "0xec1D1B3b0443256cc3860e24a46F108e699484Aa", relay: "" }, + { symbol: "TRIBE", token: "0xc7283b66eb1eb5fb86327f08e1b5816b0720212b", feed: "", relay: "" }, + { symbol: "MATIC", token: "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0", feed: "0x7bAC85A8a13A4BcD8abb3eB7d6b4d632c5a57676", relay: "" }, + { symbol: "LDO", token: "0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32", feed: "", relay: "" }, + { symbol: "BAL", token: "0xba100000625a3754423978a60c9317c58a424e3D", feed: "0xdF2917806E30300537aEB49A7663062F4d1F2b5F", relay: "" }, + { symbol: "RETH", token: "0xae78736Cd615f374D3085123A210448E74Fc6393", feed: "", relay: "" }, + { symbol: "CRV", token: "0xD533A94974073B08e3809D4a66Ca925F7dad7c73", feed: "0xCd627aA160A6fA45Eb793D19Ef54f5062F20f33f", relay: "" }, + //{ symbol: "EIGN", token: "0x5c49c3f6cb584bd298a8040b3219b10cd4654455", feed: "0xf2917e602C2dCa458937fad715bb1E465305A4A1", relay: "" }, + { symbol: "1INCH", token: "0x111111111117dC0aa78b770fA79b7594669C6538", feed: "0x72AFAECF99C9d9C8215fF44C77B94B99C28741e8", relay: "" }, + { symbol: "GRT", token: "0x6c6Bc977E13f9768b1e413c4B689A091D5a89009", feed: "0x86cF33a451dE9dc61a2862FD94FF4ad4Bd65A5d2", relay: "" }, + { symbol: "SNX", token: "0xC011a73ee8578A9d51226C9A79FcF20b17b74B63", feed: "0xDC3EA94CD0AC27d9A86C180091e7f78C683d3699", relay: "" }, + { symbol: "YFI", token: "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", feed: "0xA027702dbb89fbd58938e4324ac03B58d812b0E1", relay: "" }, + + //todo OP, ARB + ]; + + // Core Contract Deployments + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; + +} +export class PolygonAddresses extends ChainAddresses { + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; + + readonly allTokens: tokenInfo[] = [ + { + symbol: "WETH", + token: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", + feed: "0xF9680D99D6C9589e2a93a78A04A279e509205945", + relay: "", + }, + { + symbol: "WSTETH", + token: "0x03b54A6e9a984069379fae1a4fC4dBAE93B3bCCD", + feed: "", + relay: "", + }, + { + symbol: "USDT", + token: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + feed: "0x0A6513e40db6EB1b165753AD52E80663aeA50545", + relay: "", + }, + { + symbol: "USDC", + token: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", + feed: "0xfE4A8cc5b5B2366C1B58Bea3858e81843581b2F7", + relay: "", + }, + { + symbol: "AAVE", + token: "0xD6DF932A45C0f255f85145f286eA0b292B21C90B", + feed: "0x72484B12719E23115761D5DA1646945632979bB6", + relay: "", + }, + { + symbol: "BAL", + token: "0x9a71012B13CA4d3D0Cdc72A177DF3ef03b0E76A3", + feed: "0xD106B538F2A868c28Ca1Ec7E298C3325E0251d66", + relay: "", + }, + { + symbol: "WBTC", + token: "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6", + feed: "0xDE31F8bFBD8c84b5360CFACCa3539B938dd78ae6", + relay: "", + }, + { + symbol: "LINK", + token: "0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39", + feed: "0xd9FFdb71EbE7496cC440152d43986Aae0AB76665", + relay: "", + }, + { + symbol: "CRV", + token: "0x172370d5Cd63279eFa6d502DAB29171933a610AF", + feed: "0x336584C8E6Dc19637A5b36206B1c79923111b405", + relay: "", + }, + { + symbol: "SUSHI", + token: "0x0b3F868E0BE5597D5DB7fEB59E1CADBb0fdDa50a", + feed: "0x49B0c695039243BBfEb8EcD054EB70061fd54aa0", + relay: "", + }, + { + symbol: "MANA", + token: "0xA1c57f48F0Deb89f569dFbE6E2B7f46D33606fD4", + feed: "0xA1CbF3Fe43BC3501e3Fc4b573e822c70e76A7512", + relay: "", + }, + { + symbol: "UNI", + token: "0xb33EaAd8d922B1083446DC23f610c2567fB5180f", + feed: "0xdf0Fb4e4F928d2dCB76f438575fDD8682386e13C", + relay: "", + }, + { + symbol: "WMATIC", + token: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", + feed: "0xAB594600376Ec9fD91F8e885dADF0CE036862dE0", + relay: "", + }, + { + symbol: "1INCH", + token: "0x9c2C5fd7b07E95EE044DDeba0E97a665F142394f", + feed: "0x443C5116CdF663Eb387e72C688D276e702135C87", + relay: "", + }, + { + symbol: "MKR", + token: "0x6f7C932e7684666C9fd1d44527765433e01fF61d", + feed: "0xa070427bF5bA5709f70e98b94Cb2F435a242C46C", + relay: "", + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class ArbAddresses extends ChainAddresses { + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', + feed: '0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612', + relay: '0x384542D720A765aE399CFDDF079CBE515731F044', + }, + { + symbol: 'WSTETH', + token: '0x5979D7b546E38E414F7E9822514be443A4800529', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9', + feed: '0x3f3f5dF88dC9F13eac63DF89EC16ef6e7E25DdE7', + relay: '', + }, + { + symbol: 'USDC', + token: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', + feed: '0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3', + relay: '0x9BDb5575E24EEb2DCA7Ba6CE367d609Bdeb38246', + }, + { + symbol: 'USDC', + token: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8', + feed: '0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3', + relay: '0x9BDb5575E24EEb2DCA7Ba6CE367d609Bdeb38246', + }, + { + symbol: '1INCH', + token: '', + feed: '0x4bC735Ef24bf286983024CAd5D03f0738865Aaef', + relay: '', + }, + { + symbol: 'AAVE', + token: '', + feed: '0xaD1d5344AaDE45F43E596773Bcc4c423EAbdD034', + relay: '', + }, + { + symbol: 'ARB', + token: '', + feed: '0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6', + relay: '', + }, + { + symbol: 'AVAX', + token: '', + feed: '0x8bf61728eeDCE2F32c456454d87B5d6eD6150208', + relay: '', + }, + { + symbol: 'BAL', + token: '', + feed: '0xBE5eA816870D11239c543F84b71439511D70B94f', + relay: '', + }, + { + symbol: 'LINK', + token: '', + feed: '0x86E53CF1B870786351Da77A57575e79CB55812CB', + relay: '', + }, + { + symbol: 'UNI', + token: '', + feed: '0x9C917083fDb403ab5ADbEC26Ee294f6EcAda2720', + relay: '', + }, + { + symbol: 'CRV', + token: '', + feed: '0xaebDA2c976cfd1eE1977Eac079B4382acb849325', + relay: '', + }, + { + symbol: 'LDO', + token: '', + feed: '0xA43A34030088E6510FecCFb77E88ee5e7ed0fE64', + relay: '', + }, + { + symbol: 'SUSHI', + token: '', + feed: '0xb2A8BA74cbca38508BA1632761b56C897060147C', + relay: '', + }, + { + symbol: 'DAI', + token: '', + feed: '0xc5C8E77B397E531B8EC06BFb0048328B30E9eCfB', + relay: '', + }, + { + symbol: 'MKR', + token: '', + feed: '0xdE9f0894670c4EFcacF370426F10C3AD2Cdf147e', + relay: '', + }, + { + symbol: 'GRT', + token: '', + feed: '0x0F38D86FceF4955B705F35c9e41d1A16e0637c73s', + relay: '', + }, + { + symbol: 'XAI', + token: '', + feed: '0x806c532D543352e7C344ba6C7F3F00Bfbd309Af1', + relay: '', + }, + { + symbol: 'COMP', + token: '', + feed: '0xe7C53FFd03Eb6ceF7d208bC4C13446c76d1E5884', + relay: '', + }, + { + symbol: 'LPT', + token: '0x289ba1701C2F088cf0faf8B3705246331cB8A839', + feed: '', + relay: '', + }, + { + symbol: 'TUSD', + token: '0x4D15a3A2286D883AF0AA1B3f21367843FAc63E07', + feed: '0x6fAbee62266Da6686EE2744C6f15bb8352d2f28D', + relay: '', + }, + { + symbol: 'YFI', + token: '0x82e3A8F066a6989666b031d916c43672085b1582', + feed: '0x745Ab5b69E01E2BE1104Ca84937Bb71f96f5fB21', + relay: '', + }, + { + symbol: 'MAGIC', + token: '0x539bdE0d7Dbd336b79148AA742883198BBF60342', + feed: '0x47E55cCec6582838E173f252D08Afd8116c2202d', + relay: '', + }, + { + symbol: 'GMX', + token: '0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a', + feed: '0xDB98056FecFff59D032aB628337A4887110df3dB', + relay: '', + }, + { + symbol: 'RDNT', + token: '0x3082CC23568eA640225c2467653dB90e9250AaA0', + feed: '0x20d0Fcab0ECFD078B036b6CAf1FaC69A6453b352', + relay: '', + }, + { + symbol: 'WOO', + token: '0xcafcd85d8ca7ad1e1c6f82f651fa15e33aefd07b', + feed: '0x5e2b5C5C07cCA3437c4D724225Bb42c7E55d1597', + relay: '', + }, + { + symbol: 'STG', + token: '0x6694340fc020c5e6b96567843da2df01b2ce1eb6', + feed: '0xe74d69E233faB0d8F48921f2D93aDfDe44cEb3B7', + relay: '', + }, + { + symbol: 'FXS', + token: '0x9d2f299715d94d8a7e6f5eaa8e654e8c74a988a7', + feed: '0x36a121448D74Fa81450c992A1a44B9b7377CD3a5', + relay: '', + }, + { + symbol: 'KNC', + token: '0xe4dddfe67e7164b0fe14e218d80dc4c08edc01cb', + feed: '0xbF539d4c2106dd4D9AB6D56aed3d9023529Db145', + relay: '', + }, + { + symbol: 'DODO', + token: '0x69Eb4FA4a2fbd498C257C57Ea8b7655a2559A581', + feed: '0xA33a06c119EC08F92735F9ccA37e07Af08C4f281', + relay: '', + }, + { + symbol: 'JOE', + token: '0x371c7ec6D8039ff7933a2AA28EB827Ffe1F52f07', + feed: '0x04180965a782E487d0632013ABa488A472243542', + relay: '', + }, + { + symbol: 'SPELL', + token: '0x3e6648c5a70a150a88bce65f4ad4d506fe15d2af', + feed: '0x383b3624478124697BEF675F07cA37570b73992f', + relay: '', + }, + { + symbol: 'GNS', + token: '0x18c11FD286C5EC11c3b683Caa813B77f5163A122', + feed: '0xE89E98CE4E19071E59Ed4780E0598b541CE76486', + relay: '', + } + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; + + +} +export class BaseAddresses extends ChainAddresses { + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3"; + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x4200000000000000000000000000000000000006', + feed: '0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70', + relay: '0x45b265c7919D7FD8a0D673D7ACaA8F5A7abb430D', + }, + { + symbol: 'WSTETH', + token: '0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', + feed: '0x7e860098F58bBFC8648a4311b374B1D669a2bc6B', + relay: '0xfA81b396270730dbd276D3Ee002B0B7ff68D86F8', + }, + { + symbol: 'USDT', + token: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2', + feed: '0xf19d560eB8d2ADf07BD6D13ed03e1D11215721F9', + relay: '', + }, + { + symbol: 'VIRTUAL', + token: '0x0b3e328455c4059EEb9e3f84b5543F74E24e7E1b', + feed: '', + relay: '', + }, + { + symbol: 'DEGEN', + token: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed', + feed: '0xE62BcE5D7CB9d16AB8b4D622538bc0A50A5799c2', + relay: '', + }, + { + symbol: 'MORPHO', + token: '0xBAa5CC21fd487B8Fcc2F632f3F4E8D37262a0842', + feed: '', + relay: '', + }, + { + symbol: 'BRETT', + token: '0x532f27101965dd16442e59d40670faf5ebb142e4', + feed: '', + relay: '', + }, + { + symbol: 'CARV', + token: '0xc08Cd26474722cE93F4D0c34D16201461c10AA8C', + feed: '', + relay: '', + }, + { + symbol: 'MOG', + token: '0x2Da56AcB9Ea78330f947bD57C54119Debda7AF71', + feed: '0x4aeb6D15769EaD32D0c5Be2940F40c7CFf53801d', + relay: '', + }, + { + symbol: 'AXL', + token: '0x23ee2343B892b1BB63503a4FAbc840E0e2C6810f', + feed: '0x676C4C6C31D97A5581D3204C04A8125B350E2F9D', + relay: '', + }, + { + symbol: 'BAL', + token: '0x7c6b91D9Be155A6Db01f749217d76fF02A7227F2', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; + + + +} +export class BscAddresses extends ChainAddresses { + + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x2170Ed0880ac9A755fd29B2688956BD959F933F8', + feed: '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e', + relay: '', + }, + { + symbol: 'USDC', + token: '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', + feed: '0x51597f405303C4377E36123cBc172b13269EA163', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0x2Bbbdf97295F73175b12CC087cF446765931e1C3', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x55d398326f99059fF775485246999027B3197955', + feed: '0xB97Ad0E74fa7d920791E90258A6E2085088b4320', + relay: '', + }, + { + symbol: 'INJ', + token: '0xa2b726b1145a4773f68593cf171187d8ebe4d495', + feed: '0x63A9133cd7c611d6049761038C16f238FddA71d7', + relay: '', + }, + { + symbol: 'FDUSD', + token: '0xc5f0f7b66764F6ec8C8Dff7BA683102295E16409', + feed: '0x390180e80058A8499930F0c13963AD3E0d86Bfc9', + relay: '', + }, + { + symbol: 'CAKE', + token: '0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82', + feed: '0xB6064eD41d4f67e353768aA239cA86f4F73665a1', + relay: '', + }, + { + symbol: 'GMT', + token: '0x3019BF2a2eF8040C242C9a4c5c4BD4C81678b2A1', + feed: '0x8b0D36ae4CF8e277773A7ba5F35c09Edb144241b', + relay: '', + }, + { + symbol: 'CAT', + token: '0x6894CDe390a3f51155ea41Ed24a33A4827d3063D', + feed: '', + relay: '', + }, + { + symbol: 'WMTX', + token: '0xDBB5Cf12408a3Ac17d668037Ce289f9eA75439D7', + feed: '', + relay: '', + }, + { + symbol: 'BABYDOGE', + token: '0xc748673057861a797275cd8a068abb95a902e8de', + feed: '', + relay: '', + }, + { + symbol: 'INSURANCE', + token: '0x64E4fea6e4F3637025c7Bcd878E2B238B01f7D4e', + feed: '', + relay: '', + }, + { + symbol: 'LUMIA', + token: '0x7F39BcdCa8E0E581c1d43aaa1cB862AA1c8C2047', + feed: '', + relay: '', + }, + { + symbol: 'CTSI', + token: '0x8da443f84fea710266c8eb6bc34b71702d033ef2', + feed: '', + relay: '', + }, + { + symbol: 'AI',//sleepless AI + token: '0xBDA011D7F8EC00F66C1923B049B94c67d148d8b2', + feed: '', + relay: '', + }, + { + symbol: 'CYBER', + token: '0x14778860e937f509e651192a90589de711fb88a9', + feed: '', + relay: '', + }, + { + symbol: 'MNT', + token: '0x3e81aa8d6813ec9d7e6ddb4e523fb1601a0e86f3', + feed: '', + relay: '', + }, + { + symbol: 'CGPT', + token: '0x9840652DC04fb9db2C43853633f0F62BE6f00f98', + feed: '', + relay: '', + }, + { + symbol: 'HFT', + token: '0x44Ec807ce2F4a6F2737A92e985f318d035883e47', + feed: '', + relay: '', + }, + { + symbol: 'MVL', + token: '0x5f588efaf8eb57e3837486e834fc5a4e07768d98', + feed: '', + relay: '', + }, + { + symbol: 'NMT', + token: '0x03AA6298F1370642642415EDC0db8b957783e8D6', + feed: '', + relay: '', + }, + { + symbol: 'HOOK', + token: '0xa260e12d2b924cb899ae80bb58123ac3fee1e2f0', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + { + symbol: '', + token: '', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; + + +} +export class OptimisimAddresses extends ChainAddresses { + + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3" + + readonly allTokens: tokenInfo[] = [ + { symbol: "WETH", token: "0x4200000000000000000000000000000000000006", feed: "0x13e3ee699d1909e989722e753853ae30b17e08c5", relay: "0x064E3A830f905686a718cb100708ff3D90aB5202" }, + { symbol: "OP", token: "0x4200000000000000000000000000000000000042", feed: "0x0d276fc14719f9292d5c1ea2198673d1f4269246", relay: "0xCBd011dACB8270E5235CB18b3b189Ff7d7fF5f28" }, + { symbol: "DAI", token: "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", feed: "", relay: "" }, + { symbol: "WBTC", token: "0x68f180fcCe6836688e9084f035309E29Bf0A2095", feed: "0xD702DD976Fb76Fffc2D3963D037dfDae5b04E593", relay: "0x210e8Ed0AaaF3A59FD2BD761b081F2B1c246c428" }, + { symbol: "AAVE", token: "0x76FB31fb4af56892A25e32cFC43De717950c9278", feed: "0x338ed6787f463394d24813b297401b9f05a8c9d1", relay: "0x1bfeb157400A05C010C34bfA0Baf89822D14a5e4" }, + { symbol: "UNI", token: "0x6fd9d7AD17242c41f7131d257212c54A0e816691", feed: "0x11429ee838cc01071402f21c219870cbac0a59a0", relay: "0x5B4784247dFCA5d0cB73E8ad46114eA3E65cF237" }, + { symbol: "WSTETH", token: "0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb", feed: "0x698b585cbc4407e2d54aa898b2600b53c68958f7", relay: "0x1792ea57b9DB08A077101999b309E951fe576792" }, + { symbol: "RETH", token: "0x9Bcef72be871e61ED4fBbc7630889beE758eb81D", feed: "", relay: "" }, + { symbol: "SNX", token: "0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4", feed: "0x2fcf37343e916eaed1f1ddaaf84458a359b53877", relay: "0x2DBe413536CBa5f4Eb832f94427Be980dDbAa0aa" }, + { symbol: "USDT", token: "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", feed: "", relay: "" }, + { symbol: "PYTH", token: "0x99C59ACeBFEF3BBFB7129DC90D1a11DB0E91187f", feed: "0x0838cFe6A97C9CE1611a6Ed17252477a3c71eBEb", relay: "0xe4f974b9DB33b9132709F2BadC0cf24954167FD2" }, + { symbol: "WLD", token: "0xdc6ff44d5d932cbd77b52e5612ba0529dc6226f1", feed: "0x4e1C6B168DCFD7758bC2Ab9d2865f1895813D236", relay: "0x588ede0BF90d9E883303b7F6F2f2814B5c129717" }, + { symbol: "LDO", token: "0xfdb794692724153d1488ccdbe0c56c252596735f", feed: "0x221618871470f78D8a3391d35B77dFb3C0fbc383", relay: "0x7AC2e13d63bFE22DB4bf5aa0DaD2bC2C028b362F" }, + { symbol: "PENDLE", token: "0xbc7b1ff1c6989f006a1185318ed4e7b5796e66e1", feed: "0x58F23F80bF389DB1af9e3aA8c59679806749A8a4", relay: "0x17781589c1088038652A4877bB0b170a1a37951F" }, + { symbol: "FRAX", token: "0x2E3D870790dC77A83DD1d18184Acc7439A53f475", feed: "0xc7D132BeCAbE7Dcc4204841F33bae45841e41D9C", relay: "0xb1A9A0A5D4426A5Ce322639C9f4E8F27193e32A1" }, + { symbol: "RPL", token: "0xC81D1F0EB955B0c020E5d5b264E1FF72c14d1401", feed: "0xADE082c91A6AeCC86fC11704a830e933e1b382eA", relay: "0xFB92D97223FEB34A0e33A1A4a439bAa1789D683D" }, + { symbol: "YFI", token: "0x9046d36440290ffde54fe0dd84db8b1cfee9107b", feed: "0x5cdC797acCBf57EE2363Fed9701262Abc87a232e", relay: "0x5aBB6d9735e7131f39F06A4AA7c789EBfC295241" }, + { symbol: "FXS", token: "0x67CCEA5bb16181E7b4109c9c2143c24a1c2205Be", feed: "0xB9B16330671067B1b062B9aC2eFd2dB75F03436E", relay: "0x0c0337e0283d8547b54E15b0A5C5B2248Ff5FCE5" }, + { symbol: "BAL", token: "0xfe8b128ba8c78aabc59d4c64cee7ff28e9379921", feed: "0x30D9d31C1ac29Bc2c2c312c1bCa9F8b3D60e2376", relay: "0xe6daa90Bae9cAB1c171eefA561fF9b381ee5C19A" }, + { symbol: "KNC", token: "0xa00e3a3511aac35ca78530c85007afcd31753819", feed: "0xCB24d22aF35986aC1feb8874AdBbDF68f6dC2e96", relay: "0x73F77640f5428348c99041D9806e5dDAf3eAA32A" }, + { symbol: "VELO", token: "0x9560e827aF36c94D2Ac33a39bCE1Fe78631088Db", feed: "0x0f2Ed59657e391746C1a097BDa98F2aBb94b1120", relay: "0x23cFAE143Fa7cc5b9AA32c3857d3D1aE1193061E" }, + { symbol: "USDC", token: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", feed: "0x16a9FA2FDa030272Ce99B29CF780dFA30361E0f3", relay: "0x8B5AbFbdC5Ec4B88A4e94afBf9f22b81F71a25a9" }, + { symbol: "LINK", token: "0x350a791bfc2c21f9ed5d10980dad2e2638ffa7f6", feed: "0xCc232dcFAAE6354cE191Bd574108c1aD03f86450", relay: "0x0f39bf4De2F2Ee7f1fbc9084E6F5e2E87CD6738d" }, + { symbol: "CRV", token: "0x0994206dfE8De6Ec6920FF4D779B0d950605Fb53", feed: "0xbD92C6c284271c227a1e0bF1786F468b539f51D9", relay: "0x40680A87E630d7d1E05cA1413448e0Dee1C3702c" }, + { symbol: "STG", token: "0x296F55F8Fb28E498B858d0BcDA06D955B2Cb3f97", feed: "", relay: "" }, + { symbol: "CBETH", token: "0xadDb6A0412DE1BA0F936DCaeb8Aaa24578dcF3B2", feed: "", relay: "" }, + { symbol: "PEPE", token: "0x12ff4a259e14D4DCd239C447D23C9b00F7781d8F", feed: "0x64Ecf089a6594Be781908D5a26FC8fA6CB08A2C7", relay: "0xfdf6D84f6dfFE2D439c43EDAC0d617eD91756db0" } + ] + + /** + master: "0x940De081B76AbDa22F7E1Dfcfcf666354665c0Ae", + bracket: "0x908E2b7C9C5559834776eebe101947e38b66b2CA", + stopLimit: "0x7627EDD2357e4F49a1E3D9ae1f353a00DBd67dFA", + oracleLess: "0xB2c42eBC823877e23128DDcadD562402d84ca95d", + + readonly coreDeployments = { + master: '0xa3EB0e5B79cFa0bee52c5Bfaf2B46B20a3E46Ba5', + bracket: '0x29C6B745D21FF53140B11d4B5999564E1057F6F1', + stopLimit: '0xDd10e34AB58aF00693f2bFAc483139C8EEe2D5Ab', + oracleLess: '0x8c8D62eBFE417c9eA8c51583A516a5476388a5D9' + }; + */ + + + //testing deploys + readonly coreDeployments = { + master: '0x7d7B52AB13cbC0aBD7FEAE84799a22d22a186079', + bracket: '0x1EB68eBA2471D4d72a20b55369F1BdBcF10155bc', + stopLimit: '0xF9fFbA0fE174bf7a099B10D1142379322CD1Bf46', + oracleLess: '0x7B0Dee8e9d7B22b6c4DddbB76008A7bf7C5937a1' + }; +} +export class ZkSyncAddresses extends ChainAddresses { + readonly permit2: string = "0x0000000000225e31d15943971f47ad3022f714fa" + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0xf00DAD97284D0c6F06dc4Db3c32454D4292c6813', + feed: '0x6D41d1dc818112880b40e26BD6FD347E41008eDA', + relay: '', + }, + { + symbol: 'USDC', + token: '0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4', + feed: '0x1824D297C6d6D311A204495277B63e943C2D376E', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0xCafB42a2654C20cb3739F04243E925aa47302bec', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x493257fD37EDB34451f62EDf8D2a0C418852bA4C', + feed: '0xB615075979AE1836B476F651f1eB79f0Cd3956a9', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class ScrollAddresses extends ChainAddresses { + readonly permit2: string = "0xFcf5986450E4A014fFE7ad4Ae24921B589D039b5" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x5300000000000000000000000000000000000004', + feed: '0x6bF14CB0A831078629D993FDeBcB182b21A8774C', + relay: '', + }, + { + symbol: 'USDC', + token: '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4', + feed: '0x43d12Fb3AfCAd5347fA764EeAB105478337b7200', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df', + feed: '0xf376A91Ae078927eb3686D6010a6f1482424954E', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class FilecoinAddresses extends ChainAddresses { + readonly permit2: string = "0xb81363578d377F8DA3902e9e705FD60198a9cEc2" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: 'f410fkivwc5k3l74bo2zjghnhx4nf7fau5nyqep3rtta', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: 'f410fiiuetm2vaon4ldzhqdgeqvert7e47l4upp6ugly', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class MoonbeamAddresses extends ChainAddresses { + readonly permit2: string = "0xe96e30e92e01dc8a880f701b2d2160f93da18df7" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x30D2a9F5FDf90ACe8c17952cbb4eE48a55D916A7', + feed: '0x9ce2388a1696e22F870341C3FC1E89710C7569B5', + relay: '', + }, + { + symbol: 'USDC', + token: '0x8f552a71EFE5eeFc207Bf75485b356A0b3f01eC9', + feed: '0xA122591F60115D63421f66F752EF9f6e0bc73abC', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0xeFAeeE334F0Fd1712f9a8cc375f427D9Cdd40d73', + feed: '0xD925C5BF88Bd0ca09312625d429240F811b437c6', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; + +} +export class PolygonZkEvmAddresses extends ChainAddresses { + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9', + feed: '0x97d9F9A00dEE0004BE8ca0A8fa374d486567eE2D', + relay: '', + }, + { + symbol: 'USDC', + token: '0xA8CE8aee21bC2A48a5EF670afCc9274C7bbbC035', + feed: '0x0167D934CB7240e65c35e347F00Ca5b12567523a', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0x5D8cfF95D7A57c0BF50B30b43c7CC0D52825D4a9', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x1E4a5963aBFD975d8c9021ce480b42188849D41d', + feed: '0x8499f6E7D6Ac56C83f66206035D33bD1908a8b5D', + relay: '', + }, + { + symbol: 'WBTC', + token: '0xEA034fb02eB1808C2cc3adbC15f447B93CbE08e1', + feed: '0xAE243804e1903BdbE26ae5f35bc6E4794Be21574', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class BlastAddresses extends ChainAddresses { + readonly permit2: string = "0x000000000022d473030f116ddee9f6b43ac78ba3" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x4300000000000000000000000000000000000004', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0xCdB5835bdb75c5B3671633d12d7E0DB6be5873A5', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x0be9A0e280962213bF85C4F8669359291b2E404A', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class RootstockAddresses extends ChainAddresses { + readonly permit2: string = "0xFcf5986450E4A014fFE7ad4Ae24921B589D039b5" + + //https://rootstock.blockscout.com/tokens?sort=holder_count&order=desc + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '', + feed: '', + relay: '', + } + /** + + , + { + symbol: 'RIF', + token: '0x2aCc95758f8b5F583470bA265Eb685a8f45fC9D5', + feed: '', + relay: '', + }, + { + symbol: 'SOV', + token: '0xEfC78FC7D48B64958315949279bA181C2114abbD', + feed: '', + relay: '', + }, + { + symbol: 'RDOC', + token: '0x2d919f19D4892381d58EdEbEcA66D5642ceF1A1F', + feed: '', + relay: '', + }, + { + symbol: 'USDRIF', + token: '0x3A15461d8AE0f0Fb5fA2629e9dA7D66A794a6E37', + feed: '', + relay: '', + }, + { + symbol: 'RUSDT', + token: '0xEf213441a85DF4d7acBdAe0Cf78004E1e486BB96', + feed: '', + relay: '', + },*/ + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class MantaPacificAddresses extends ChainAddresses { + readonly permit2: string = "0x83986Ff655A54ee061F6B7F476B92f4Fed111B93" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x0Dc808adcE2099A9F62AA87D9670745AbA741746', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0xb73603C5d87fA094B7314C74ACE2e64D165016fb', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0x2FE3AD97a60EB7c79A976FC18Bb5fFD07Dd94BA5', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0xf417F5A458eC102B90352F697D6e2Ac3A3d2851f', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class BobaAddresses extends ChainAddresses { + readonly permit2: string = ""//no permit 2 + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0xdeaddeaddeaddeaddeaddeaddeaddeaddead0000', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0x66a2A913e447d6b4BF33EFbec43aAeF87890FBbc', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x5DE1677344D3Cb0D7D465c10b72A8f60699C062d', + feed: '', + relay: '', + }, + { + symbol: 'BOBA', + token: '0xa18bF3994C0Cc6E3b63ac420308E5383f53120D7', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; + + ; +} +export class LineaAddresses extends ChainAddresses { + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f', + feed: '0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA', + relay: '', + }, + { + symbol: 'USDC', + token: '0x176211869cA2b568f2A7D4EE941E073a821EE1ff', + feed: '0xAADAa473C1bDF7317ec07c915680Af29DeBfdCb5', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0xB5beDd42000b71FddE22D3eE8a79Bd49A568fC8F', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0xA219439258ca9da29E9Cc4cE5596924745e12B93', + feed: '0xefCA2bbe0EdD0E22b2e0d2F8248E99F4bEf4A7dB', + relay: '', + }, + { + symbol: 'WBTC', + token: '0x3aAB2285ddcDdaD8edf438C1bAB47e1a9D05a9b4', + feed: '0x7A99092816C8BD5ec8ba229e3a6E6Da1E628E1F9', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class TaikoAddresses extends ChainAddresses { + readonly permit2: string = "0x1b35fbA9357fD9bda7ed0429C8BbAbe1e8CC88fc" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0xA51894664A773981C6C112C43ce576f315d5b1B6', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0x07d83526730c7438048D55A4fc0b850e2aaB6f0b', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x2DEF195713CF4a606B49D07E520e22C17899a736', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class SeiAddresses extends ChainAddresses { + readonly permit2: string = "0xB952578f3520EE8Ea45b7914994dcf4702cEe578" + + readonly allTokens: tokenInfo[] = [ + + ] + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class GnosisAddresses extends ChainAddresses { + readonly permit2: string = "0x000000000022D473030F116dDEE9F6B43aC78BA3" + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1', + feed: '0xa767f745331D267c7751297D982b050c93985627', + relay: '', + }, + { + symbol: 'USDC', + token: '0x2a22f9c3b484c3629090FeED35F17Ff8F88f76F0', + feed: '0x26C31ac71010aF62E6B486D1132E266D6298857D', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0x6C76971f98945AE98dD7d4DFcA8711ebea946eA6', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x4ECaBa5870353805a9F068101A40E0f32ed605C6', + feed: '0x68811D7DF835B1c33e6EEae8E7C141eF48d48cc7', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + };; +} +export class BobAddresses extends ChainAddresses { + readonly permit2: string = ""//no permit 2 + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x4200000000000000000000000000000000000006', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0xe75D0fB2C24A55cA1e3F96781a2bCC7bdba058F0', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '0x85008aE6198BC91aC0735CB5497CF125ddAAc528', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x05D032ac25d322df992303dCa074EE7392C117b9', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class XLayerAddresses extends ChainAddresses { + readonly permit2: string = ""//no permit 2 + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x5a77f1443d16ee5761d310e38b62f77f726bc71c', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0x74b7f16337b8972027f6196a17a631ac6de26d22', + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '0x1e4a5963abfd975d8c9021ce480b42188849d41d', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} +export class Metall2Addresses extends ChainAddresses { + readonly permit2: string = ""//no permit 2 + + readonly allTokens: tokenInfo[] = [ + { + symbol: 'WETH', + token: '0x4200000000000000000000000000000000000006', + feed: '', + relay: '', + }, + { + symbol: 'USDC', + token: '0xb91CFCcA485C6E40E3bC622f9BFA02a8ACdEeBab', // native USDC + feed: '', + relay: '', + }, + { + symbol: 'USDC.e', + token: '0x51E85d70944256710cb141847F1a04f568C1Db0e', // bridged USDC + feed: '', + relay: '', + }, + { + symbol: 'WSTETH', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'USDT', + token: '', + feed: '', + relay: '', + }, + { + symbol: 'METAL', + token: '0xBCFc435d8F276585f6431Fc1b9EE9A850B5C00A9', + feed: '', + relay: '', + }, + ]; + + readonly coreDeployments = { + master: "", + bracket: "", + stopLimit: "", + oracleLess: "", + }; +} + +// Function to retrieve the addresses by chain ID +export function getAddressesByChainId(chainId: number) { + const addresses = chainIdToAddresses[chainId]; + if (!addresses) { + throw new Error(`Addresses not available for chain ID ${chainId}`); + } + return addresses; +} + +export function getFeeByChainId(chainId: number) { + const fee = chainIdFeeAmount[chainId] + if (!fee) { + throw new Error(`Fee not available for chain ID ${chainId}`); + } + return fee +} + +//targeting a ~$0.5 fee in the native gas token +const chainIdFeeAmount: Record = { + 1: ethers.parseEther("0.0001"), + 42161: ethers.parseEther("0.0001"), + 137: ethers.parseEther("1"),//MATIC + 10: ethers.parseEther("0.0001"), + 8453: ethers.parseEther("0.0001"), + 56: ethers.parseEther("0.0007"),//BNB + 324: ethers.parseEther("0.0001"), + 534353: ethers.parseEther("0.0001"), + 314: ethers.parseEther("0.08"), //FIL + 1284: ethers.parseEther("1.75"), //GLMR + 1101: ethers.parseEther("0.0001"), + 81457: ethers.parseEther("0.0001"), + 30: ethers.parseUnits("0.00000475", 8), //RBTC + 169: ethers.parseEther("0.5"), //MANTA + 288: ethers.parseEther("2"), //BOBA + 59144: ethers.parseEther("0.0001"), + 167000: ethers.parseEther("0.0001"), + 15000: ethers.parseUnits("1", 8), //SEI + 100: ethers.parseEther("0.5"), //xDAI + 1294: ethers.parseEther("0.0001"), + 2025: ethers.parseEther("0.01"), //OKB + 1750: ethers.parseUnits("0.4", 8) //MTL +}; + +const chainIdToAddresses: Record = { + 1: new MainnetAddresses(), + 42161: new ArbAddresses(), + 137: new PolygonAddresses(),//MATIC + 10: new OptimisimAddresses(), + 8453: new BaseAddresses(), + 56: new BscAddresses(),//BNB + 324: new ZkSyncAddresses(), + 534353: new ScrollAddresses(), + 314: new FilecoinAddresses(), //FIL + 1284: new MoonbeamAddresses(), //GLMR + 1101: new PolygonZkEvmAddresses(), + 81457: new BlastAddresses(), + 30: new RootstockAddresses(), //RBTC + 169: new MantaPacificAddresses(), //MANTA + 288: new BobaAddresses(), //BOBA + 59144: new LineaAddresses(), + 167000: new TaikoAddresses(), + 15000: new SeiAddresses(), //SEI + 100: new GnosisAddresses(), //xDAI + 1294: new BobAddresses(), + 2025: new XLayerAddresses(), //OKB + 1750: new Metall2Addresses() //MTL +}; diff --git a/oku-custom-order-types/util/msc.ts b/oku-custom-order-types/util/msc.ts index 8262efe..d699ab7 100644 --- a/oku-custom-order-types/util/msc.ts +++ b/oku-custom-order-types/util/msc.ts @@ -24,6 +24,11 @@ type PermitSingle = { sigDeadline: string } +export interface Permit2Payload { + permitSingle: PermitSingle; + signature: string; +} + export type ExactInputSingleParams = { tokenIn: AddressLike, tokenOut: AddressLike, @@ -169,7 +174,7 @@ export const permitSingle = async ( signer: Signer, chainId: number, token: string, - amount: BigInt, + amount: bigint, spender: string, permit2: string, nonce: number = 0, @@ -178,14 +183,23 @@ export const permitSingle = async ( if (expiration == undefined) { expiration = Math.floor(Date.now() / 1000) + 60 * 60 // 1 hour from now } - + const networkName = hre.network.name - if(networkName == "hardhat"|| networkName== "localhost"){ + if (networkName == "hardhat" || networkName == "localhost") { console.log("IMPERSONATING", await signer.getAddress()) signer = await ethers.getSigner(await signer.getAddress()) await impersonateAccount(await signer.getAddress()) } + //verify token allowance + const tokenContract = IERC20__factory.connect(token, signer) + const tokenAllowance = await tokenContract.allowance(await signer.getAddress(), permit2) + if(tokenAllowance < amount){ + console.log("No permit2 approval, approving max now...") + const MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + await tokenContract.connect(signer).approve(permit2, MAX_UINT256) + } + const PERMIT = IPermit2__factory.connect(permit2, signer) const allowance = await PERMIT.allowance( @@ -220,6 +234,48 @@ export const permitSingle = async ( } +export function encodePermit2Payload(permit: Permit2Payload): string { + const abiCoder = new ethers.AbiCoder(); + const encodedData = abiCoder.encode( + [ + "((" + + "(address,uint160,uint48,uint48)," + + "address,uint256)," + + "bytes)", + ], + [ + [ + [ + [ + permit.permitSingle.details.token, + permit.permitSingle.details.amount, + permit.permitSingle.details.expiration, + permit.permitSingle.details.nonce, + ], + permit.permitSingle.spender, + permit.permitSingle.sigDeadline, + ], + permit.signature, + ], + ] + ); + return encodedData +} + +export const encodePermitSingle = async (signer: Signer, + chainId: number, + token: string, + amount: BigInt, + spender: string, + permit2: string, + nonce: number = 0, + expiration?: number) => { + + const permit: Permit2Payload = await permitSingle(signer, chainId, token, amount, spender, permit2, nonce, expiration) + return encodePermit2Payload(permit) + +} + /** diff --git a/oku-custom-order-types/util/msc.ts.rej b/oku-custom-order-types/util/msc.ts.rej new file mode 100644 index 0000000..47e2836 --- /dev/null +++ b/oku-custom-order-types/util/msc.ts.rej @@ -0,0 +1,97 @@ +diff a/oku-custom-order-types/util/msc.ts b/oku-custom-order-types/util/msc.ts (rejected hunks) +@@ -24,6 +24,11 @@ type PermitSingle = { + sigDeadline: string + } + ++export interface Permit2Payload { ++ permitSingle: PermitSingle; ++ signature: string; ++} ++ + export type ExactInputSingleParams = { + tokenIn: AddressLike, + tokenOut: AddressLike, +@@ -169,7 +174,7 @@ export const permitSingle = async ( + signer: Signer, + chainId: number, + token: string, +- amount: BigInt, ++ amount: bigint, + spender: string, + permit2: string, + nonce: number = 0, +@@ -178,14 +183,23 @@ export const permitSingle = async ( + if (expiration == undefined) { + expiration = Math.floor(Date.now() / 1000) + 60 * 60 // 1 hour from now + } +- ++ + const networkName = hre.network.name +- if(networkName == "hardhat"|| networkName== "localhost"){ ++ if (networkName == "hardhat" || networkName == "localhost") { + console.log("IMPERSONATING", await signer.getAddress()) + signer = await ethers.getSigner(await signer.getAddress()) + await impersonateAccount(await signer.getAddress()) + } + ++ //verify token allowance ++ const tokenContract = IERC20__factory.connect(token, signer) ++ const tokenAllowance = await tokenContract.allowance(await signer.getAddress(), permit2) ++ if(tokenAllowance < amount){ ++ console.log("No permit2 approval, approving max now...") ++ const MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); ++ await tokenContract.connect(signer).approve(permit2, MAX_UINT256) ++ } ++ + const PERMIT = IPermit2__factory.connect(permit2, signer) + + const allowance = await PERMIT.allowance( +@@ -220,6 +234,48 @@ export const permitSingle = async ( + + + } ++export function encodePermit2Payload(permit: Permit2Payload): string { ++ const abiCoder = new ethers.AbiCoder(); ++ const encodedData = abiCoder.encode( ++ [ ++ "((" + ++ "(address,uint160,uint48,uint48)," + ++ "address,uint256)," + ++ "bytes)", ++ ], ++ [ ++ [ ++ [ ++ [ ++ permit.permitSingle.details.token, ++ permit.permitSingle.details.amount, ++ permit.permitSingle.details.expiration, ++ permit.permitSingle.details.nonce, ++ ], ++ permit.permitSingle.spender, ++ permit.permitSingle.sigDeadline, ++ ], ++ permit.signature, ++ ], ++ ] ++ ); ++ return encodedData ++} ++ ++export const encodePermitSingle = async (signer: Signer, ++ chainId: number, ++ token: string, ++ amount: BigInt, ++ spender: string, ++ permit2: string, ++ nonce: number = 0, ++ expiration?: number) => { ++ ++ const permit: Permit2Payload = await permitSingle(signer, chainId, token, amount, spender, permit2, nonce, expiration) ++ return encodePermit2Payload(permit) ++ ++} ++ + + + /**