/*
    This file is part of TON Blockchain Library.
    TON Blockchain Library is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 2 of the License, or
    (at your option) any later version.
    TON Blockchain Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
    You should have received a copy of the GNU Lesser General Public License
    along with TON Blockchain Library.  If not, see .
    Copyright 2017-2020 Telegram Systems LLP
*/
#include "TestGiver.h"
#include "GenericAccount.h"
#include "td/utils/base64.h"
namespace ton {
const block::StdAddress& TestGiver::address() noexcept {
  static block::StdAddress res =
      block::StdAddress::parse("kf_8uRo6OBbQ97jCx2EIuKm8Wmt6Vb15-KsQHFLbKSMiYIny").move_as_ok();
  //static block::StdAddress res =
  //block::StdAddress::parse("kf9tswzQaryeJ4aAYLy_phLhx4afF1aEvpUVak-2BuA0CmZi").move_as_ok();
  return res;
}
vm::CellHash TestGiver::get_init_code_hash() noexcept {
  return vm::CellHash::from_slice(td::base64_decode("wDkZp0yR4xo+9+BnuAPfGVjBzK6FPzqdv2DwRq3z3KE=").move_as_ok());
  //return vm::CellHash::from_slice(td::base64_decode("YV/IANhoI22HVeatFh6S5LbCHp+5OilARfzW+VQPZgQ=").move_as_ok());
}
td::Ref TestGiver::make_a_gift_message_static(td::uint32 seqno, td::Span gifts) noexcept {
  CHECK(gifts.size() <= max_gifts_size);
  vm::CellBuilder cb;
  cb.store_long(seqno, 32);
  for (auto& gift : gifts) {
    td::int32 send_mode = 1;
    cb.store_long(send_mode, 8).store_ref(create_int_message(gift));
  }
  return cb.finalize();
}
td::Result TestGiver::get_seqno() const {
  return TRY_VM(get_seqno_or_throw());
}
td::Result TestGiver::get_seqno_or_throw() const {
  if (state_.data.is_null()) {
    return 0;
  }
  auto seqno = vm::load_cell_slice(state_.data).fetch_ulong(32);
  if (seqno == vm::CellSlice::fetch_ulong_eof) {
    return td::Status::Error("Failed to parse seq_no");
  }
  return static_cast(seqno);
}
}  // namespace ton