text: "use strict";
  var __importDefault = (this && this.__importDefault) || function (mod) {
      return (mod && mod.__esModule) ? mod : { "default": mod };
  };
  Object.defineProperty(exports, "__esModule", { value: true });
  exports.Near = void 0;
  /**
   * This module contains the main class developers will use to interact with NEAR.
   * The {@link Near} class is used to interact with {@link Account | Accounts} through the {@link JsonRpcProvider.JsonRpcProvider | JsonRpcProvider}.
   * It is configured via the {@link NearConfig}.
   *
   * @example {@link https://docs.near.org/docs/develop/front-end/naj-quick-reference#account}
   *
   * @module near
   */
  const bn_js_1 = __importDefault(require("bn.js"));
  const account_1 = require("./account");
  const connection_1 = require("./connection");
  const contract_1 = require("./contract");
  const account_creator_1 = require("./account_creator");
  /**
   * This is the main class developers should use to interact with NEAR.
   * @example
   * ```js
   * const near = new Near(config);
   * ```
   */
  class Near {
      constructor(config) {
          this.config = config;
          this.connection = connection_1.Connection.fromConfig({
              networkId: config.networkId,
              provider: { type: 'JsonRpcProvider', args: { url: config.nodeUrl, headers: config.headers } },
              signer: config.signer || { type: 'InMemorySigner', keyStore: config.keyStore || config.deps.keyStore }
          });
          if (config.masterAccount) {
              // TODO: figure out better way of specifiying initial balance.
              // Hardcoded number below must be enough to pay the gas cost to dev-deploy with near-shell for multiple times
              const initialBalance = config.initialBalance ? new bn_js_1.default(config.initialBalance) : new bn_js_1.default('500000000000000000000000000');
              this.accountCreator = new account_creator_1.LocalAccountCreator(new account_1.Account(this.connection, config.masterAccount), initialBalance);
          }
          else if (config.helperUrl) {
              this.accountCreator = new account_creator_1.UrlAccountCreator(this.connection, config.helperUrl);
          }
          else {
              this.accountCreator = null;
          }
      }
      /**
       * @param accountId near accountId used to interact with the network.
       */
      async account(accountId) {
          const account = new account_1.Account(this.connection, accountId);
          return account;
      }
      /**
       * Create an account using the {@link AccountCreator}. Either:
       * * using a masterAccount with {@link LocalAccountCreator}
       * * using the helperUrl with {@link UrlAccountCreator}
       * @see {@link NearConfig.masterAccount} and {@link NearConfig.helperUrl}-
       *
       * @param accountId
       * @param publicKey
       */
      async createAccount(accountId, publicKey) {
          if (!this.accountCreator) {
              throw new Error('Must specify account creator, either via masterAccount or helperUrl configuration settings.');
          }
          await this.accountCreator.createAccount(accountId, publicKey);
          return new account_1.Account(this.connection, accountId);
      }
      /**
       * @deprecated Use {@link Contract} instead.
       * @param contractId
       * @param options
       */
      async loadContract(contractId, options) {
          const account = new account_1.Account(this.connection, options.sender);
          return new contract_1.Contract(account, contractId, options);
      }
      /**
       * @deprecated Use {@link Account.sendMoney} instead.
       * @param amount
       * @param originator
       * @param receiver
       */
      async sendTokens(amount, originator, receiver) {
          console.warn('near.sendTokens is deprecated. Use `yourAccount.sendMoney` instead.');
          const account = new account_1.Account(this.connection, originator);
          const result = await account.sendMoney(receiver, amount);
          return result.transaction_outcome.id;
      }
  }
  exports.Near = Near;
  