text: const { Harmony } = require('@harmony-js/core');
  const { ChainID, ChainType } = require('@harmony-js/utils');
  const { Undelegate, StakingTransaction, StakingFactory } = require('@harmony-js/staking'); //../packages/harmony-staking
  const { TxStatus } = require('@harmony-js/transaction');
  
  const LOCALNET = `http://localhost:9500`;
  
  // 1. initialize the Harmony instance
  
  const harmony = new Harmony(
    // rpc url
    LOCALNET,
    {
      // chainType set to Harmony
      chainType: ChainType.Harmony,
      // chainType set to HmyLocal
      chainId: ChainID.HmyLocal,
    },
  );
  
  // 2. get wallet ready
  
  // one1a2rhuaqjcvfu69met9sque2l3w5v9z6qcdcz65
  // surge welcome lion goose gate consider taste injury health march debris kick
  
  // add privateKey to wallet
  const private = '63e35b761e9df0d50ddcdaa8e33c235b60c991bfed22925a12768b0c08ef822f';
  const sender = harmony.wallet.addByPrivateKey(private);
  // const phrase =
  //     'genius cable radar memory high catch blossom correct middle wish gentle
  //     fiscal';
  
  // one1a2rhuaqjcvfu69met9sque2l3w5v9z6qcdcz65
  // surge welcome lion goose gate consider taste injury health march debris kick
  
  // add privateKey to wallet
  // const sender = harmony.wallet.addByMnemonic(phrase);
  // let r =
  //   '0xf8f180f8a4940b585f8daefbc68a311fbd4cb20d9174ad174016f83885416c69636585616c69636591616c6963652e6861726d6f6e792e6f6e6583426f6295446f6e2774206d6573732077697468206d65212121ddc988016345785d8a0000c9880c7d713b49da0000c887b1a2bc2ec500000a820bb8f1b0b9486167ab9087ab818dc4ce026edb5bf216863364c32e42df2af03c5ced1ad181e7d12f0e6dd5307a73b6224760861164008080830927c028a064b1b835f5b70a72228920db24e44c0a57d954c1d3dcac3b33c79d9593f96191a05577fd05064a37043a33ff7febb67ab126a8e1f0b67c92b7cab793a87ddf2c82';
  
  // const undelegateMsg = new Undelegate(
  //   'one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp', // signed should match this
  //   'one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy',
  //   '0x16345785d8a0000',
  // );
  
  // const stakingTxn = new StakingTransaction(
  //   '0x3',
  //   undelegateMsg,
  //   '0x2',
  //   '0x',
  //   '0x0927c0',
  //   ChainID.HmyLocal,
  // );
  
  const stakingTxn = harmony.stakings
    .undelegate({
      delegatorAddress: 'one1pf75h0t4am90z8uv3y0dgunfqp4lj8wr3t5rsp',
      validatorAddress: 'one1pdv9lrdwl0rg5vglh4xtyrv3wjk3wsqket7zxy',
      amount: '0x16345785d8a0000',
    })
    .setTxParams({
      nonce: '0x2',
      gasPrice: '0x',
      gasLimit: '0x0927c0',
      chainId: ChainID.HmyLocal,
    })
    .build();
  
  // 3. get sharding info
  async function setSharding() {
    // Harmony is a sharded blockchain, each endpoint have sharding structure,
    // However sharding structure is different between mainnet, testnet and local
    // testnet We need to get sharding info before doing cross-shard transaction
    const res = await harmony.blockchain.getShardingStructure();
    harmony.shardingStructures(res.result);
  }
  
  async function execute() {
    await setSharding();
  
    const signedTxn = await harmony.wallet.signStaking(stakingTxn);
    signedTxn
      .observed()
      .on('transactionHash', (txnHash) => {
        console.log('');
        console.log('--- hash ---');
        console.log('');
        console.log(txnHash);
        console.log('');
      })
      .on('receipt', (receipt) => {
        console.log('');
        console.log('--- receipt ---');
        console.log('');
        console.log(receipt);
        console.log('');
      })
      .on('cxReceipt', (receipt) => {
        console.log('');
        console.log('--- cxReceipt ---');
        console.log('');
        console.log(receipt);
        console.log('');
      })
      .on('error', (error) => {
        console.log('');
        console.log('--- error ---');
        console.log('');
        console.log(error);
        console.log('');
      });
  
    // console.log(signedTxn);
  
    const [sentTxn, txnHash] = await signedTxn.sendTransaction();
    // signedTxn.sendTransaction()
    //     .then(res => {
    //       console.log(res);
    //     })
    //     .catch(err => {
    //       console.log(err);
    //     });
  
    // to confirm the result if it is already there
    // console.log(txnHash);
    console.log(sentTxn);
  
    const confiremdTxn = await sentTxn.confirm(txnHash);
  
    // if the transactino is cross-shard transaction
    if (confiremdTxn.isConfirmed()) {
      console.log('--- Result ---');
      console.log('');
      console.log('Normal transaction');
      console.log(`${txnHash} is confirmed`);
      console.log('');
      process.exit();
    }
    // if (confiremdTxn.isConfirmed() && confiremdTxn.isCxConfirmed()) {
    //   console.log('--- Result ---');
    //   console.log('');
    //   console.log('Cross-Shard transaction');
    //   console.log(`${txnHash} is confirmed`);
    //   console.log('');
    //   process.exit();
    // }
  }
  execute();
  //   const delegateMsg = Delegate({
  //     delegatorAddress: 'one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9',
  //     validatorAddress: 'one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9',
  //     amount: '0xa',
  //   });
  
  //   const stakingTxn = StakingTransaction({
  //     directive: '0x2',
  //     stakeMsg: delegateMsg,
  //     nonce: '0x2',
  //     gasPrice: '0x',
  //     gasLimit: '0x64',
  //     chainId: 0,
  //     from: 'one1a0x3d6xpmr6f8wsyaxd9v36pytvp48zckswvv9',
  //   });
  
  //   stakingTxn
  //     .sendTransaction()
  //     .then((stakingTxn, res) => {
  //       console.log(res);
  //     })
  //     .catch((err) => {
  //       console.log(err);
  //     });
  