¿Cómo reemplazar una matriz en un mapeo?

Estoy aprendiendo sobre solidez en este momento y creando una dApp donde a los usuarios se les paga por realizar acciones. Las acciones se pagan en base a ciertos criterios.

Como no puedo programar un trabajo cron en ethereum, solo puedo pagar a los usuarios cuando el usuario activa alguna función.

Por lo tanto, cuando el usuario activa esta función de 'reclamación de pago', podría tener, por ejemplo, una matriz de 10 acciones no pagadas, de las cuales cualquier número entre 0 y 10 es pagadero. Para nuestros propósitos, digamos que 4 son pagaderos.

Me pregunto cuál es la forma más eficiente de reemplazar la matriz anterior de 10 acciones no pagadas con la nueva matriz de 6 acciones no pagadas.

¿Es más eficiente crear 6 acciones no pagadas en la memoria y reemplazar la variable anterior? ¿O es mejor eliminar en índices específicos y luego mover todo lo que queda?

Tenga en cuenta que por eficiente me refiero a la forma en que costará menos gasolina

Ejemplo de la opción 1:

mapping(address => UnpaidAction[]) unpaidActions;

function claimPayment() public returns (bool){
        uint arrayLength = unpaidActions[msg.sender].length;
        if (arrayLength != 0) {

            UnpaidAction[] memory stillUnpaid;
            uint offset = 0;
            for (uint i = 0; i < arrayLength; i++) {

                if (/*some criteria is met then we pay user*/) {
                    ...
                } else {
                    // criteria not met add it to our temporary array
                    stillUnpaid[offset] = unpaidActions[msg.sender][i];
                    offset += 1;
                }
            }

            // done everything let's replace our storage variable
            unpaidActions[msg.sender] = stillUnpaid
        }

        return true;
    }

Ejemplo de la opción 2

function claimPayment() public returns (bool){
        uint arrayLength = unpaidActions[msg.sender].length;
        if (arrayLength != 0) {

            for (uint i = 0; i < arrayLength; i++) {

                if (/*some criteria is met we pay user and delete index*/) {

                    balances[msg.sender] += 100 

                    // delete
                    delete unpaidActions[msg.sender][i]

                } 
            }

            // now run a second for loop and move everything left

            uint offset = 0;
            for (uint i = 0; i < arrayLength; i++) {
                if (offset > 0) {
                    unpaidActions[msg.sender][i - offset] = unpaidActions[msg.sender][i]
                }

                // check if this element has been deleted
                if (unpaidActions[msg.sender][i].someIntVar == 0) {
                    offset +=1;
                } 
            }
            unpaidActions[msg.sender][i].length -= offset
        }

        return true;
    }

Editar

enum ActionType { /* many action types here*/ }
struct UnpaidAction {
    ActionType actionType;
    string description;
    uint createdAt;
}
publicar la clase UnpaidAction
agregó @KaranKurbur. Es solamente unstruct

Respuestas (1)

La opción 1 generará un error:

UnimplementedFeatureError: la copia de la estructura de tipo Test.stillUnpaid memory[] de la memoria en el almacenamiento aún no es compatible.

Así que supongo que tendrás que ceñirte a la opción 2.