GOOGLE ADS

miércoles, 27 de abril de 2022

¿Cómo puedo eliminar un elemento de un mapeo anidado?

Tengo una asignación anidada que va de la dirección al planId a la estructura (suscripción)

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

Tengo una función para cancelar un plan específico que se ha creado, pero cuando activé la función, recibí un error que dice

La transacción se quedó sin gasolina. Aumente el límite de gas.

Cuando depuré el error, el depurador señala el error dentro de la función de cancelación en la línea de código a continuación

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);
}

¿Cómo puedo solucionar ese error?

Gracias


Solución del problema

Estoy enfrentando un problema similar. Esto es lo que hice, me di cuenta de que no es posible asignar un valor predeterminado a un mapeo anidado una vez que lo cambia. En su ejemplo, puede intentar asignar una estructura con diferentes valores (que puede considerar como un reemplazo por defecto) y luego no arrojará un error.

El siguiente es mi ejemplo:

// 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;
}
}

En la opsfunción, quería que mi mapeo tuviera un valor predeterminado, pero no está sucediendo. Así que intenté ingresar el valor que quiero asignar al mapeo anidado. Y está tomando todos los valores uint excepto 0 (el valor predeterminado)

PD: estaba usando mapping(address=> mapping(uint => bool)) public address_id_likedanteriormente. Pero no puedo eliminar/asignar falso, por lo que probé con uint.

¡Espero que esto ayude!

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...