'How can I delete an element from a nested mapping

I have a nested mapping that goes from address to planId to struct(subscription)

mapping(address => mapping(uint => subscription)) public subscriptions

I have a function to cancel a specific plan that has been created but when I trigger the function I got an error that says

The transaction ran out of gas. Please increase the Gas Limit.

When I debugged the error the debugger points the error inside the cancel function at the code line below

function cancel(uint planId) external {
    Subscription storage subscription = subscriptions[msg.sender][planId];
    require(
        subscription.subscriber != address(0), 
        'this subscription does not exist'
    );
    delete subscriptions[msg.sender][planId]; // this one 
    emit SubscriptionCancelled(msg.sender, planId, block.timestamp);
  }

How can I fix that error?

Thanks



Solution 1:[1]

I am facing a similar problem. Here's what I did, I realized that it's not possible to assign a default value to a nested mapping once you change it. In your example, you can try assigning a struct with different values(which you can consider as a replacement for default) and then it wont throw error.

Following is my example:

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract test{
    mapping(address=> mapping(uint => uint)) public address_id_liked;

    function register(uint id) external{ 
        address_id_liked[msg.sender][id] = 1;
    }

    function test_(uint index) external view returns(uint) {
        uint out = address_id_liked[msg.sender][index];
        return(out);
    }

    function ops(uint id, uint num) external {
        address_id_liked[msg.sender][id] = num;
    }
}

In the ops function, I wanted my mapping to have a default value but it's not happening. So I tried inputting the value which I want to assign to nested mapping. And it's taking all uint values except 0(the default)

P.S- I was using mapping(address=> mapping(uint => bool)) public address_id_liked previously. But I am unable to delete/assign false, hence I tried with uint.

Hope this helps!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Rushank Savant