Приложение дважды вызывает метамаску, когда я хочу, чтобы она вызывалась один раз

У меня есть две функции,

Тот, который возвращает web.eth.sendTransaction, который запускает метамаску в первый раз,

И тот, который возвращает contractInstance.function, который обновляет массив в моем контракте. Что также запускает метамаску.

Оба находятся в одной и той же большой функции в моем app.js,

Я хотел бы получить тот же результат, что и получение платежа, а затем обновить книгу в контракте, вызвав метамаску только один раз.

Какова наилучшая практика?

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

  });
    }
};

Ответы (1)

Если вы не хотите сделать эту функцию массива обновления платной и объединить код, вы, по сути, запрашиваете 2 действия, которые должны быть выполнены, для чего потребуются 2 триггера.

В качестве альтернативы вы можете безопасно подключить среднюю учетную запись на серверной части, чтобы подключиться и инициировать второй вызов через… К сожалению, вы также понесете расходы на газ.

Лучше всего попытаться переосмыслить то, как запрограммирован контракт, и попытаться сделать больше с меньшим количеством вызовов функций.

Как тот факт, что я выполняю оплачиваемую функцию, приведет к тому, что у меня будет только один вызов? Я не против платной функции. Я думал о среднем счете, я не против того, чтобы нести расходы на газ. Если у вас есть еще зацепки по этому поводу? Я имею в виду, что с удовольствием изучил бы оба варианта.
@Ilan Действительно ли ваша sendTransaction отправляет данные через необязательный dataпараметр? Я рекомендую вам показать нам код самой транзакции.
Могу ли я показать это в частном порядке?
@Ilan Я бы просто поместил это здесь, чтобы вы могли получить максимальный ответ. Если вы не делаете что-то революционное, вполне безопасно размещать код, с которым вам нужна помощь, здесь.
Я добавил код, на самом деле это не революционно, это просто адаптированный код из учебника.
Привет, есть какие-нибудь идеи о том, как реализовать ваши советы?