ElvToken.js

Back
const { ElvClient } = require("@eluvio/elv-client-js");
const fs = require("fs");
const path = require("path");
const Ethers = require("ethers");

class ElvToken {

  /**
   * Instantiate the ElvToken SDK
   *
   * @namedParams
   * @param {string} configUrl - The Content Fabric configuration URL
   */
  constructor({ configUrl }) {
    this.configUrl = configUrl || ElvClient.main;

    this.debug = false;
  }

  async Init() {
    this.client = await ElvClient.FromConfigurationUrl({
      configUrl: this.configUrl,
    });
    let wallet = this.client.GenerateWallet();
    let signer = wallet.AddAccount({
      privateKey: process.env.PRIVATE_KEY,
    });
    this.client.SetSigner({ signer });
    this.client.ToggleLogging(false);
  }

  /**
   * Deploy ElvToken contract (src/token/elv_token.sol)
   * @param {string} name: elv_token name
   * @param {string} symbol: elv_token symbol
   * @param {number} decimals: elv_token decimals
   * @param {number} amount : elv_token premint amount
   */
  async ElvTokenDeploy({
    name,
    symbol,
    decimals,
    amount ,
  }){

    const abistr = fs.readFileSync(
      path.resolve(__dirname, "../contracts/v4/ElvToken.abi")
    );
    const bytecode = fs.readFileSync(
      path.resolve(__dirname, "../contracts/v4/ElvToken.bin")
    );

    var c = await this.client.DeployContract({
      abi: JSON.parse(abistr),
      bytecode: bytecode.toString("utf8").replace("\n", ""),
      constructorArgs: [
        name,
        symbol,
        decimals,
        amount
      ],
    });
    console.log("ElvToken contract address:", c.contractAddress);

    var res = await this.client.CallContractMethod({
      contractAddress: c.contractAddress,
      abi: JSON.parse(abistr),
      methodName: "name",
      methodArgs: [],
      formatArguments: true,
    });
    var n = res.toString();

    res = await this.client.CallContractMethod({
      contractAddress: c.contractAddress,
      abi: JSON.parse(abistr),
      methodName: "symbol",
      methodArgs: [],
      formatArguments: true,
    });
    var s = res.toString();

    res = await this.client.CallContractMethod({
      contractAddress: c.contractAddress,
      abi: JSON.parse(abistr),
      methodName: "decimals",
      methodArgs: [],
      formatArguments: true,
    });
    var d = res.toString();

    return {
      contract_address: c.contractAddress,
      name: n,
      symbol: s,
      decimals: d,
    };
  }

  /**
   * Transfer the token to the given address
   *
   * @namedParams
   * @param {string} tokenAddr - Token address
   * @param {string} toAddr - To address
   * @param {integer} amount - Token amount
   * @return {Promise<Object>} - Token Transfer Info JSON
   */
  async ElvTokenTransfer({ tokenAddr, toAddr, amount }) {
    const abi = fs.readFileSync(
      path.resolve(__dirname, "../contracts/v4/IERC20.abi")
    );

    return await this.client.CallContractMethodAndWait({
      contractAddress: tokenAddr,
      abi: JSON.parse(abi),
      methodName: "transfer",
      methodArgs: [toAddr, amount],
      formatArguments: true,
    });
  }

  /**
   * Get the Token balance for a given user address
   *
   * @namedParams
   * @param {string} tokenAddr - Token address
   * @param {string} userAddr - Token address
   * @return {integer} - Token balance
   */
  async ElvTokenBalance({ tokenAddr, userAddr }) {
    const abi = fs.readFileSync(
      path.resolve(__dirname, "../contracts/v4/IERC20.abi")
    );

    let res = await this.client.CallContractMethod({
      contractAddress: tokenAddr,
      abi: JSON.parse(abi),
      methodName: "balanceOf",
      methodArgs: [userAddr],
      formatArguments: true,
    });
    return Ethers.BigNumber.from(res).toNumber();
  }

}

exports.ElvToken = ElvToken;