|
|
|
[![npm version](https://img.shields.io/npm/v/@harmony-js/core.svg?style=flat-square)](https://www.npmjs.com/package/@harmony-js/core)
|
|
|
|
[![Build Status](https://travis-ci.com/FireStack-Lab/Harmony-sdk-core.svg?branch=master)](https://travis-ci.com/FireStack-Lab/Harmony-sdk-core)
|
|
|
|
|
|
|
|
|
|
|
|
1. [About this SDK](#about-this-sdk)
|
|
|
|
2. [How to Install](#how-to-install)
|
|
|
|
1. [Enviorment requirement](#enviorment-requirement)
|
|
|
|
2. [Install from npm/yarn](#install-from-npmyarn)
|
|
|
|
3. [Quick start](#quick-start)
|
|
|
|
3. [Build from source files](#build-from-source-files)
|
|
|
|
1. [Install `lerna` and `typescript` globally](#install-lerna-and-typescript-globally)
|
|
|
|
2. [Bootstrap and build](#bootstrap-and-build)
|
|
|
|
3. [Bundle](#bundle)
|
|
|
|
4. [Tests](#tests)
|
|
|
|
1. [Unit tests](#unit-tests)
|
|
|
|
2. [e2e tests](#e2e-tests)
|
|
|
|
5. [More examples](#more-examples)
|
|
|
|
|
|
|
|
# About this SDK
|
|
|
|
|
|
|
|
A Harmony's blockchain javascript library, which provides an easier way to interact with Harmony's blockchain.
|
|
|
|
|
|
|
|
This libraries contains a few packages.
|
|
|
|
|
|
|
|
1. [@harmony-js/core](https://github.com/harmony-one/sdk/tree/master/packages/harmony-core)
|
|
|
|
2. [@harmony-js/account](https://github.com/harmony-one/sdk/tree/master/packages/harmony-account)
|
|
|
|
3. [@harmony-js/crypto](https://github.com/harmony-one/sdk/tree/master/packages/harmony-crypto)
|
|
|
|
4. [@harmony-js/network](https://github.com/harmony-one/sdk/tree/master/packages/harmony-network)
|
|
|
|
5. [@harmony-js/utils](https://github.com/harmony-one/sdk/tree/master/packages/harmony-utils)
|
|
|
|
6. [@harmony-js/transaction](https://github.com/harmony-one/sdk/tree/master/packages/harmony-transaction)
|
|
|
|
7. [@harmony-js/contract](https://github.com/harmony-one/sdk/tree/master/packages/harmony-contract)
|
|
|
|
8. [@harmony-js/staking](https://github.com/harmony-one/sdk/tree/master/packages/harmony-contract)
|
|
|
|
|
|
|
|
|
|
|
|
# How to Install
|
|
|
|
|
|
|
|
This library works on both nodejs and browser. Please use it according to your use case.
|
|
|
|
|
|
|
|
## Enviorment requirement
|
|
|
|
|
|
|
|
* Nodejs: 10.0+
|
|
|
|
* Browser: Latest Chrome and Firefox
|
|
|
|
|
|
|
|
## Install from npm/yarn
|
|
|
|
|
|
|
|
**Note: we added a @next tag to npm package, please use the following command to install with npm/yarn**
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
|
|
# npm
|
|
|
|
npm install @harmony-js/core@next
|
|
|
|
|
|
|
|
# yarn
|
|
|
|
yarn add @harmony-js/core@next
|
|
|
|
|
|
|
|
# tslib is required, we'd better install it as well
|
|
|
|
npm install tslib
|
|
|
|
yarn add tslib
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
## Quick start
|
|
|
|
|
|
|
|
1. You need Harmony local testnet running.
|
|
|
|
instruction here:[harmony-one/harmony](https://github.com/harmony-one/harmony)
|
|
|
|
2. Run this example under nodejs enviorment.
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
// import or require Harmony class
|
|
|
|
const { Harmony } = require('@harmony-js/core');
|
|
|
|
|
|
|
|
// import or require settings
|
|
|
|
const { ChainID, ChainType } = require('@harmony-js/utils');
|
|
|
|
|
|
|
|
// 1. initialize the Harmony instance
|
|
|
|
|
|
|
|
const harmony = new Harmony(
|
|
|
|
// rpc url
|
|
|
|
'http://localhost:9500',
|
|
|
|
{
|
|
|
|
// chainType set to Harmony
|
|
|
|
chainType: ChainType.Harmony,
|
|
|
|
// chainType set to HmyLocal
|
|
|
|
chainId: ChainID.HmyLocal,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
|
|
|
|
// 2. get wallet ready
|
|
|
|
// specify the privateKey
|
|
|
|
const privateKey = '45e497bd45a9049bcb649016594489ac67b9f052a6cdf5cb74ee2427a60bf25e';
|
|
|
|
// add privateKey to wallet
|
|
|
|
const sender = harmony.wallet.addByPrivateKey(privateKey);
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
|
|
|
|
// 4. get transaction payload ready
|
|
|
|
|
|
|
|
async function transfer() {
|
|
|
|
// run set sharding first, if you want to make a cross-shard transaction
|
|
|
|
await setSharding();
|
|
|
|
|
|
|
|
const txn = harmony.transactions.newTx({
|
|
|
|
// token send to
|
|
|
|
to: 'one166axnkjmghkf3df7xfvd0hn4dft8kemrza4cd2',
|
|
|
|
// amount to send
|
|
|
|
value: '10000',
|
|
|
|
// gas limit, you can use string
|
|
|
|
gasLimit: '210000',
|
|
|
|
// send token from shardID
|
|
|
|
shardID: 0,
|
|
|
|
// send token to toShardID
|
|
|
|
toShardID: 0,
|
|
|
|
// gas Price, you can use Unit class, and use Gwei, then remember to use toWei(), which will be transformed to BN
|
|
|
|
gasPrice: new harmony.utils.Unit('100').asGwei().toWei(),
|
|
|
|
});
|
|
|
|
|
|
|
|
// sign the transaction use wallet;
|
|
|
|
|
|
|
|
const signedTxn = await harmony.wallet.signTransaction(txn);
|
|
|
|
|
|
|
|
// Now you can use `Transaction.observed()` to listen events
|
|
|
|
|
|
|
|
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('');
|
|
|
|
});
|
|
|
|
|
|
|
|
// send the txn, get [Transaction, transactionHash] as result
|
|
|
|
|
|
|
|
const [sentTxn, txnHash] = await signedTxn.sendTransaction();
|
|
|
|
|
|
|
|
// to confirm the result if it is already there
|
|
|
|
|
|
|
|
const confiremdTxn = await sentTxn.confirm(txnHash);
|
|
|
|
|
|
|
|
// if the transactino is cross-shard transaction
|
|
|
|
if (!confiremdTxn.isCrossShard()) {
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
transfer();
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Build from source files
|
|
|
|
|
|
|
|
## Install `lerna` and `typescript` globally
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn global add lerna && yarn global add typescript
|
|
|
|
```
|
|
|
|
## Bootstrap and build
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn bootstrap
|
|
|
|
```
|
|
|
|
|
|
|
|
## Bundle
|
|
|
|
|
|
|
|
build `umd` and `esm` version javascript for each sub-packages, which can be accessed by `import` or `require`
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn dist
|
|
|
|
```
|
|
|
|
All files are exported in `packages/dist` folder, use `**.esm.js` or `**.umd.js` format
|
|
|
|
|
|
|
|
|
|
|
|
# Tests
|
|
|
|
## Unit tests
|
|
|
|
```bash
|
|
|
|
yarn test:src
|
|
|
|
```
|
|
|
|
## e2e tests
|
|
|
|
**Contantly updating now, please get back later**
|
|
|
|
|
|
|
|
1. edit `.env` file if you have custom setting
|
|
|
|
|
|
|
|
2. run harmony node locally, follow this instruction : https://github.com/harmony-one/harmony)
|
|
|
|
|
|
|
|
3. wait for 1-2 mins, and run this:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
yarn build && yarn test:e2e
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# More examples
|
|
|
|
|
|
|
|
* [dapp-examples](https://github.com/harmony-one/dapp-examples)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|