If possible please some help !
I create a contract in Solidity. Because its size is too big i try a way to move some functions to a second contract to free some space.So i have this :
The main contract
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "./EscrowHandler.sol";
import "./SharedStructs.sol";
the library SharedStructs.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
library SharedStructs {
enum AssetType { MyCoin }
enum PaymentMethod { Ether, USDT }
struct Order {
uint256 orderID;
address buyer;
address payable owner;
uint256 price;
uint256 amount;
uint256 fulfilledAmount;
AssetType assetType;
PaymentMethod priceCurrency;
}
}
and the escrow handler (some other functions maybe will go here too)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "./SharedStructs.sol";
import "./i_MyCoin.sol";
contract EscrowHandler {
// State variables and mappings related to escrows
mapping(address => mapping(SharedStructs.AssetType => uint256)) assetBalances;
mapping(address => mapping(SharedStructs.PaymentMethod => uint256)) escrowBalances;
// Buy orders separate queues for Ether and USDT
SharedStructs.Order[] buyOrdersEther;
SharedStructs.Order[] buyOrdersUSDT;
// Sell orders separate queues for Ether and USDT
SharedStructs.Order[] sellOrdersEther;
SharedStructs.Order[] sellOrdersUSDT;
so on escrow handler i have this function
function removeOrder(SharedStructs.Order[] storage orders, uint index) internal {
require(index < orders.length, "Index out of bounds");
for (uint i = index; i < orders.length - 1; i++) {
orders[i] = orders[i + 1];
}
orders.pop();
}
so i want to call it also from other contracts for example from myCoin.sol .
Because is internal , i create a public function which will call it :
function removeOrderExternal(SharedStructs.Order[] storage orders, uint index) public {
removeOrder(orders, index);
}
normally should edit the storage orders.So i set “storage orders” but then i receive error
TypeError: Data location must be "memory" or "calldata" for parameter in function, but "storage" was given.
--> contracts/EscrowHandler.sol:68:30:
|
68 | function removeOrderExternal(SharedStructs.Order[] storage orders, uint index) public {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
and of course if i set it to memory like this ,
function removeOrderExternal(SharedStructs.Order[] memory orders, uint index) public {
removeOrder(orders, index);
}
i receive this :
TypeError: Invalid type for argument in function call. Invalid implicit conversion from struct SharedStructs.Order[] memory to struct SharedStructs.Order[] storage pointer requested.
--> contracts/EscrowHandler.sol:69:17:
|
69 | removeOrder(orders, index);
| ^^^^^^
because the orders are in storage and not in memory.
So is it possible somehow with public function to edit the storage arrays ? I can not find solution to this. I think solidity not allowing public function to edit storage. But then how i should do it ?
Happy is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.