La aplicación llama a metamask dos veces, cuando quiero que se llame una vez

tengo dos funciones

Uno que devuelve web.eth.sendTransaction, que activa metamask por primera vez,

Y uno que devuelve contractInstance.function que actualiza una matriz en mi contrato. Lo que también activa la metamáscara.

Ambos están en la misma gran función en mi app.js,

Me gustaría obtener el mismo resultado, que es recibir un pago y luego actualizar el libro en el contrato, llamando solo una vez a metamask.

cual es la mejor practica?

markAdopted: function(adopters, account) {
    var adoptionInstance;

    App.contracts.Adoption.deployed().then(function(instance) {
      adoptionInstance = instance;

      return adoptionInstance.getAdopters.call();
    }).then(function(adopters) {
      for (i = 0; i < adopters.length; i++) {
        console.log(adopters[i]);
        if (adopters[i] !== '0x0000000000000000000000000000000000000000') {
          $('.panel-pet').eq(i).find('button').text('Coped').attr('disabled', true);
        }
      }
    }).catch(function(err) {
      console.log(err.message);
    });
  },

  handleAdopt: function(event) {
    event.preventDefault();

    var petId = parseInt($(event.target).data('id'));
    var adoptionInstance;
    var account;
    var transactionStatus;

    web3.eth.getAccounts(function(error, accounts) {
      if (error) {
        console.log(error);
      }

      account = accounts[0];

    });

    web3.eth.sendTransaction({
      from: account,
      to: '0xC5fdf4076b8F3A5357c5E395ab970B5B54098Fef',
      value: '1000000000000000000'
    }, function(error, result){
    if(!error) {
        console.log(result);
        transactionStatus = true;
        if (transactionStatus) {
        App.contracts.Adoption.deployed().then(function(instance) {

        adoptionInstance = instance;

        return adoptionInstance.adopt(petId, {from: account});

      }).then(function(result) {

        return App.markAdopted();
      }).catch(function(err) {

        console.log(err.message);
      });
      } 
    }

    else {
        console.error(error);
        transactionStatus = false;
    }

  });
    }
};

Respuestas (1)

A menos que esté dispuesto a pagar esa función de matriz de actualización y fusionar el código, esencialmente está solicitando que se completen 2 acciones que requerirán 2 activadores.

Una alternativa es conectar una cuenta mediana, de forma segura en el backend, para conectarse y activar la segunda llamada a través... Desafortunadamente, también incurrirá en el costo de la gasolina.

La mejor apuesta es tratar de repensar cómo se programa el contrato y tratar de hacer más con menos llamadas a funciones.

¿Cómo el hecho de que haga una función de pago me llevará a tener una sola llamada? No me importa tener una función de pago. Pensé en la cuenta mediana, no me importa asumir el costo del gas. ¿Tienes más pistas sobre esto? Quiero decir que con mucho gusto exploraría ambas opciones.
@Ilan ¿Su sendTransaction está enviando datos de forma precisa a través del dataparámetro opcional? Te recomiendo que nos muestres el código de la transacción en sí.
¿Puedo mostrarlo en privado?
@Ilan, simplemente lo pondría aquí para que pueda obtener la máxima respuesta. A menos que esté haciendo algo revolucionario, es bastante seguro poner el código con el que necesita ayuda aquí.
Agregué el código, de hecho no es revolucionario es solo un código adaptado de un tutorial
Oye, ¿alguna pista sobre cómo implementar tus consejos?