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