ParserError: Expresión primaria esperada - dirección a pagar - a pagar()

Estoy tratando de familiarizarme con ethereum. Así que estaba revisando un repositorio e intenté descifrar el código:

function transferFundOnResolve(uint cid) private {
        // Could also be used: complainMap[cid]._status == Status.Resolved && 
        if(complainMap[cid]._reward > 0) {
            if(policeAccounts[complainSolver[cid]] != true) {
                complainSolver[cid].transfer( complainMap[cid]._reward );
                complainMap[cid]._reward = 0;
            }
            else {
                for(uint i=0; i<complainMap[cid]._contributors.length; i++) {
                    complainMap[cid]._contributors[i].transfer( complainMap[cid]._contAmount[i] );
                }
                complainMap[cid]._reward = 0;

            }
        }
    }

Como dice TypeError: "enviar" y "transferir" solo están disponibles para objetos de tipo "dirección a pagar", no "dirección".

Así que modifiqué y agregué payable() como:

function transferFundOnResolve(uint cid) private {
        // Could also be used: complainMap[cid]._status == Status.Resolved && 
        if(complainMap[cid]._reward > 0) {
            if(policeAccounts[complainSolver[cid]] != true) {
                complainSolver[cid].transfer( payable(complainMap[cid]._reward) );
                complainMap[cid]._reward = 0;
            }
            else {
                for(uint i=0; i<complainMap[cid]._contributors.length; i++) {
                    complainMap[cid]._contributors[i].transfer( payable(complainMap[cid]._contAmount[i]) );
                }
                complainMap[cid]._reward = 0;

            }
        }
    }

Ahora dice: ParserError: expresión primaria esperada.

¿Cómo debo resolver esto?

tengo pragma solidez ^0.5.16;

Agregue el código donde declaró las variables. (Como quejaMap y colaboradores)

Respuestas (2)

La razón por la que recibió ese error es porque no hay un nombre de función pagadero que tome un valor entero y devuelva una dirección pagadera. El analizador no lo reconoce y le da un error como ese.

No conozco su estructura de mapa de quejas, pero puedo suponer que contiene una variable de contribuyente y su tipo es la dirección. En la versión de solidity superior a 0.5.0, agregan una dirección de pago (puede ver más aquí: ¿ Cuál es la diferencia entre 'dirección' y 'dirección de pago'? ). La función de transferencia solo se puede usar en la dirección de pago, no en la dirección, por lo que la solución es cambiar el tipo variable de contribuyente de la dirección a la dirección de pago o convertirla en la dirección de pago.

¿Puede decirme cómo enviar de la dirección a la dirección pagadera? Y actualizando la pregunta con mi estructura pronto.
Encontré aquí: ethereum.stackexchange.com/a/64109/61100 , que puedo usar de pago como este
@Maifee UI Asad Para convertir de dirección a dirección de pago, necesita una función de pago que solo se puede usar en solidity 0.6.0 y superior. Pero está utilizando la solidez 0.5.18, lo que significa que es imposible convertir de dirección a dirección pagadera. Entonces, la única forma es cambiar la dirección variable a la dirección pagadera
hola @haxerl, ¿puedes mostrar un código de ejemplo sobre cómo funcionó para ti la conversión a la dirección pagable? Intenté transmitir a la dirección pagadera y sigo obteniendo el mismo error. Para reproducir el error: haz una prueba de trufa en github.com/iansamz/Simple-Bank-Solidity.git

Agregue esto en su truffle-config.js

Solc versión: 0.6.0 y superior admitirá pagos (dirección)

module.exports = {
  // See <http://truffleframework.com/docs/advanced/configuration>
  // to customize your Truffle configuration!
  networks: {
    development: {
      host: "localhost",
      port: 7545,
      network_id: "5777",
      gas: 4600000
    }
  },
  compilers: {
    solc: {
      version: "0.6.0",    // Fetch exact version from solc-bin (default: truffle's version)
    }
  },
};

En tu contrato .sol utiliza:pragma solidity ^0.6.0;