incognito-js
v1.4.0
Published
Incognito Javascript library
Downloads
20
Readme
Table of Contents
[TOC]
Get Started
Install
$ yarn add incognito-js
Please use branch #develop. We are building sdk-v2. Follow example at https://github.com/incognitochain/sdk-v2/blob/master/sample/test-node.js
Usage
Nodejs
Copy wasm binary to your root project:
cp node_modules/incognito-js/privacy.wasm .
const incognitoJs = require('incognito-js');
// Load WebAssembly:
await incognitoJs.goServices.implementGoMethodUseWasm();
Follow this step to [implement storage.](#Implement storage)
Browser
Copy wasm binary to your root project:
cp node_modules/incognito-js/privacy.wasm .
Module
import * as incognitoJs from 'incognito-js';
// Load WebAssembly:
await incognitoJs.goServices.implementGoMethodUseWasm();
Or import Javascript file to html (incognitoJs
object is attached to your browser window object.)
<script src="...incognito-js/build/web/browser/index.js"></script>
<script>
// Load WebAssembly:
await incognitoJs.goServices.implementGoMethodUseWasm();
</script>
Follow this step to [implement storage.](#Implement storage)
React Native
Please use react-native-incognito-js for React Native and follow this step to [implement storage.](#Implement storage)
Implement storage
incognitoJs
need to cache some data into storage to work correctly like coin infomation, tx history,... So please implement incognitoJs storage service:
incognitoJs.storageService.implement({
// namespace: 'YOUR-STORAGE-NAMESPACE',
setMethod: (key: string, value: string) {
return new Promise((resolve, reject) => {
// store data to storage device, for example:
// localStorage on Browser
// AsyncStorage on React Native
resolve();
if (error) {
reject(error);
}
});
},
getMethod: (key: string) {
return new Promise(() => {
// get data from device storage
});
},
removeMethod: (key: string) {
return new Promise(() => {
// remove data from device storage
});
},
});
API
Config
setConfig
Usage:
setConfig (
logMethod: (message: string) => void (pass null to disable log)
chainURL: string //
apiURL: string
mainnet: boolean // update this property will change apiURL & chainURL if they are not defined
wasmPath: string // path to the binary file, the SDK will find the wasm in where it was executed
) => void
Example:
const { setConfig } = incognitoJs;
// config incognito JS use testnet
setConfig({ mainnet: false });
// config incognito JS use log
setConfig({ logMethod: function(logMessage) {
console.log(`LOG: ${logMessage}`);
} });
getConfig
Get current config.
History services
getTxHistoryByPublicKey
Get histories belong to an account (use account's publicKeySerialized
as a key).
Usage:
getTxHistoryByPublicKey(
publicKeySerialized: string,
tokenId?: string
) => Promise<TxHistoryModel[]>
Example:
const { historyServices } = incognitoJs;
// load all tx histories for native token
const histories = await historyServices.getTxHistoryByPublicKey(
account.key.keySet.publicKeySerialized, // publicKeySerialized of the account
null // token id or use null for native token
);
checkCachedHistories
Get update for all cached tx histories (tx histories are send/init/burn/trade/contribute transactions).
Usage:
checkCachedHistories() => Promise
Example:
const { historyServices } = incognitoJs;
await historyServices.checkCachedHistories(); // all tx histories were up to date
// load all tx histories for native token
const updatedHistories = await account.nativeToken.getTxHistories();
Go Services
incognitoJs
uses some methods implemented by Go to improve performance. Go will be built to WASM (Web Assembly) for Nodejs/browser enviroments and Gomobile for React Native.
implementGoMethodUseWasm
Used on Nodejs/browser enviroments.
Usage:
implementGoMethodUseWasm() => Promise
Example:
const { goServices } = incognitoJs;
await goServices.implementGoMethodUseWasm();
console.log('Go methods were implemented!')
implementGoMethodManually
Implement go methods manually (for React Native).
Please use react-native-incognito-js, it is a incognitoJs
library wrapper, all Go methods have been implemented already.
Usage:
// define Go methods
const implementData = {
deriveSerialNumber: (data: string) => string;
initPrivacyTx: (data: string) => string;
randomScalars: (data: string) => string;
staking: (data: string) => string;
stopAutoStaking: (data: string) => string;,
initPrivacyTokenTx: (data: string) => string;
withdrawDexTx: (data: string) => string;
initPTokenTradeTx: (data: string) => string;
initPRVTradeTx: (data: string) => string;
initPTokenContributionTx: (data: string) => string;
initPRVContributionTx: (data: string) => string;
initWithdrawRewardTx: (data: string) => string;
initBurningRequestTx: (data: string) => string;
generateKeyFromSeed: (data: string) => string;
scalarMultBase: (data: string) => string;
hybridEncryptionASM: (data: string) => string;
hybridDecryptionASM: (data: string) => string;
generateBLSKeyPairFromSeed: (data: string) => string;
};
// implement
implementGoMethodManually(implementData) => Promise
Example:
const { goServices } = incognitoJs;
await goServices.implementGoMethodManually({ ... });
console.log('Go methods were implemented!')
Go method name
List of Go method names.
Example:
const { goServices } = incognitoJs;
console.log(goServices.GO_METHOD_NAMES)
Wallet services
setPrivacyUtilRandomBytesFunc
Implement random bytes function.
Usage:
setPrivacyUtilRandomBytesFunc(Function) => void
Example:
import myRandomByteFunction from '..';
const { walletServices } = incognitoJs;
walletServices.setPrivacyUtilRandomBytesFunc(myRandomByteFunction);
Storage Services
implement
Implement storage.
Usage:
// implement data
const data = {
setMethod(key: string, data: string) : Promise;
getMethod(key: string) : Promise;
removeMethod(key: string) : Promise
namespace: string; (optional)
};
// implement
implement(data) => void
Example:
const { storageService } = incognitoJs;
storageService.implement({ ... });
Bridge Services
removeBridgeHistory
Cancel/remove a deposit/withrawal history.
Usage:
removeBridgeHistory({
historyId: number,
currencyType: number,
isDecentralized: boolean
}) => Promise
Example:
const { bridgeServices } = incognitoJs;
bridgeServices.removeBridgeHistory({ ... });
Constant
All of constants used in the library.
Example:
const { CONSTANT } = incognitoJs;
console.log('Incognito JS constants:', CONSTANT);
WalletInstance
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |seed|Uint8Array||| |entropy|number[ ]||| |mnemonic|string||| |masterAccount|MasterAccount||The main account in wallet| |name|string||Wallet name|
init
Init a new wallet.
Usage:
init(passPhrase: string, name?: string) => Promise<WalletInstance>
Example:
const { WalletInstance } = incognitoJs;
const wallet = new WalletInstance();
await wallet.init('my-passphrase', 'TEST-WALLET');
console.log('New wallet', wallet);
backup
Backup wallet with password.
Usage:
backup(password: string) => string
Example:
const backupWalletString = wallet.backup('backup-password');
console.log('Backed up wallet string', backupWalletString);
restore
Restore a wallet from backup.
Usage:
restore(encryptedWallet: string, password: string) => Promise<WalletInstance>
Example:
const { WalletInstance } = incognitoJs;
const wallet = await WalletInstance.restore(backupWalletString, 'backup-password');
console.log('Restored wallet', wallet);
MasterAccount
MasterAccount is a special account, the Incognito wallet is only have one MasterAccount, this account can contain many Accounts (or AccountInstance)
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |child|array|[ ]|Array of chilren account| |key|KeyWalletModel||Key wallet|
getAccounts
Get all child accounts.
Usage:
getAccounts() => <AccountInstance>[ ]
Example:
const accounts = wallet.masterAccount.getAccounts();
console.log('Account list', accounts);
addAccount
Create a child account, shardId
will be randomly selected if not provided
Usage:
addAccount(name: string, shardId?: number) => Promise<AccountInstance>
Example:
// create an account with shard ID 3
const account1 = await wallet.masterAccount.addAccount('Account 1', 3);
console.log('Account with shard ID 3', account1);
// create an account with random shardID
const account2 = await wallet.masterAccount.addAccount('Account 2');
console.log('Account with random shard ID', account2);
removeAccount
Remove an account by name.
Usage:
removeAccount(name: string) => void
Example:
// remove account name "Account 1"
wallet.masterAccount.removeAccount('Account 1');
console.log('Remaining accounts', wallet.masterAccount.getAccounts());
importAccount
Import account from its private key.
Usage:
importAccount(name: string, privateKey: string) => Promise<AccountInstance>
Example:
// import account with private key "ABCDEF"
const importedAccount = await wallet.masterAccount.importAccount('Imported account', 'ABCDEF');
console.log('Imported account', importedAccount);
getBackupData
Return backup object for the account.
Usage:
getBackupData() => string
Example:
const backupObject = wallet.masterAccount.getBackupData();
console.log('Account backup', backupObject);
restoreFromBackupData
Restore from backup object for the account.
Usage:
restoreFromBackupData(backupObject) => MasterAccount
Example:
const { MasterAccount } = incognitoJs;
const masterAccount = MasterAccount.restoreFromBackupData(backupObject);
console.log('Restored master account', masterAccount);
AccountInstance
AccountInstance is child account belong to MasterAccount
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |name|string||Account name| |isImport|boolean|false|Is this account was imported or not| |key|KeyWalletModel||Key wallet| |nativeToken|NativeTokenInstance||Native token is PRV| |privacyTokenIds|string[]||List of following PrivacyTokenInstance id|
getBLSPublicKeyB58CheckEncode
Get BLS public key.
Usage:
getBLSPublicKeyB58CheckEncode() => Promise<string>
Example:
const blsPublicKey = await account.getBLSPublicKeyB58CheckEncode();
console.log('BLS Public Key', blsPublicKey);
followTokenById
Add a token id to following list of the account.
Usage:
followTokenById(tokenId: string) => void
Example:
// follow pBTC
account.followTokenById("b832e5d3b1f01a4f0623f7fe91d6673461e1f5d37d91fe78c5c2e6183ff39696");
const followingTokens = await account.getFollowingPrivacyToken();
console.log('Following tokens', followingTokens);
console.log('Following token ids', account.privacyTokenIds);
unfollowTokenById
Remove a token id from following list.
Usage:
unfollowTokenById(tokenId: string) => void
Example:
// unfollow pBTC
account.unfollowTokenById("b832e5d3b1f01a4f0623f7fe91d6673461e1f5d37d91fe78c5c2e6183ff39696");
const followingTokens = await account.getFollowingPrivacyToken();
console.log('Following tokens', followingTokens);
console.log('Following token ids', account.privacyTokenIds);
issuePrivacyToken
Issue new Incognito token.
Usage:
issuePrivacyToken({
tokenName: string,
tokenSymbol: string,
supplyAmount: number,
nativeTokenFee: number
}) => Promise<TxHistoryModel>
Example:
const history = await account.issuePrivacyToken({
tokenName: 'test token',
tokenSymbol: 'test',
supplyAmount: 100000,
nativeTokenFee: 20 // fee in nano PRV
});
console.log('Issued new token with history', history);
getFollowingPrivacyToken
Get following token(s), if tokenId
is not provided, all tokens will be returned.
Usage:
getFollowingPrivacyToken(tokenId?: string)
=> Promise<PrivacyTokenInstance | PrivacyTokenInstance[]>
Example:
// Get all following tokens
const tokens = await account.getFollowingPrivacyToken();
console.log('All following tokens', tokens);
// Get follow token info with ID
const token = await account.getFollowingPrivacyToken('token-id');
console.log('Token info', token);
getNodeRewards
For Node only - Get rewards.
Usage:
getNodeRewards() => Promise<object>
Example:
const rewards = await account.getNodeRewards();
console.log('All rewards', rewards);
getNodeStatus
For Node only - Get node status.
Usage:
getNodeStatus() => Promise<object>
Example:
const status = await account.getNodeStatus();
console.log('Node status', status);
NativeTokenInstance
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |isNativeToken|boolean|true|Is native token| |name|string||Token name| |tokenId|string||Token ID| |symbol|string||Token symbol| |accountKeySet|AccountKeySetModel||Account Key set|
getTotalBalance
Get total balance (including pending coins).
Usage:
getTotalBalance() => Promise<BigNumber>
Example:
const balanceBN = await account.nativeToken.getTotalBalance();
console.log('Native token total balance', balanceBN.toNumber());
getAvaiableBalance
Get available balance.
Usage:
getAvaiableBalance() => Promise<BigNumber>
Example:
const balanceBN = await account.nativeToken.getAvaiableBalance();
console.log('Native token available balance', balanceBN.toNumber());
getTxHistories
Get all transaction histories (cached on local).
Usage:
getTxHistories() => Promise<TxHistoryModel[]>
Example:
const histories = await account.nativeToken.getTxHistories();
console.log('Native token tx histories', histories);
transfer
Send native token in Incognito chain.
Usage:
transfer(paymentInfoList: PaymentInfoModel[], nativeFee: number)
=> Promise<TxHistoryModel>
Example:
const history = await account.nativeToken.transfer(
[
{
paymentAddressStr: otherAccount.key.keySet.paymentAddressKeySerialized,
amount: 10,
message: ''
}
],
20 // fee in nano PRV
);
console.log('Native token sent with history', history);
requestStaking
[Node] Send staking request.
Usage:
requestStaking(rewardReceiverPaymentAddress: string, nativeFee: number)
=> Promise<TxHistoryModel>
Example:
const history = await account.nativeToken.requestStaking(
receiverAccount.key.keySet.paymentAddressKeySerialized,
20 // fee in nano PRV
);
console.log('Native token sent stake request with history', history);
pdeContribution
[pDEX] Send PDE contribution.
Usage:
pdeContribution(
pdeContributionPairID: string,
contributedAmount: number,
nativeFee: number
) => Promise<TxHistoryModel>
requestTrade
Send trade request
Usage:
requestTrade (
tokenIdBuy: string,
sellAmount: number,
minimumAcceptableAmount: number,
nativeFee: number,
tradingFee: number
) => Promise<TxHistoryModel>
withdrawNodeReward
[Node] Withdraw reward from node.
Usage:
withdrawNodeReward() => Promise<TxHistoryModel>
PrivacyTokenInstance
|Public Property|Type|Default value|Description|
|----------|:-------------:|------:|------:|
|isPrivacyToken|boolean|true|Is privacy token|
|name|string||Token name|
|tokenId|string||Token ID|
|symbol|string||Token symbol in Incognito chain|
|accountKeySet|AccountKeySetModel||Account Key set|
|totalSupply|number||Total supply amount was issued|
|bridgeInfo|object||External infomations from other chain for this token (only tokens have the bridgeInfo
can deposit/withdraw)|
bridgeInfo
- symbol: string; // symbol in other chain
- pSymbol: string; // bridge token symbol
- name: string; // bridge token name
- decimals: number; // decimals in other chain
- pDecimals: number; // decimals in Incognito chain
- contractID: string;
- verified: boolean; // verified by Incognito
- type: number; defined in TOKEN_INFO_CONSTANT.BRIDGE_PRIVACY_TOKEN.TYPE
- currencyType: number; defined in TOKEN_INFO_CONSTANT.BRIDGE_PRIVACY_TOKEN.CURRENCY_TYPE
- status: number;
getTotalBalance
Get total balance (including pending coins).
Usage:
getTotalBalance() => Promise<BigNumber>
Example:
const token = await account.getFollowingPrivacyToken('token-id');
const balanceBN = await token.getTotalBalance();
console.log('Token total balance', balanceBN.toNumber());
getAvaiableBalance
Get available balance.
Usage:
getAvaiableBalance() => Promise<BigNumber>
Example:
const token = await account.getFollowingPrivacyToken('token-id');
const balanceBN = await token.getAvaiableBalance();
console.log('Token available balance', balanceBN.toNumber());
getTxHistories
Get all transaction histories (cached on local).
Usage:
getTxHistories() => Promise<TxHistoryModel[]>
Example:
const token = await account.getFollowingPrivacyToken('token-id');
const histories = await token.getTxHistories();
console.log('Token tx histories', histories);
hasExchangeRate
Is the token has valuable, if true, the token can be used for fee.
Usage:
hasExchangeRate() => Promise<boolean>
Example:
const token = await account.getFollowingPrivacyToken('token-id');
const isHasRate = await token.hasExchangeRate();
console.log(`This token ${isHasRate === true ? 'has' : 'not has'} rate`);
transfer
Send privacy token in Incognito chain.
Usage:
transfer(
paymentInfoList: PaymentInfoModel[],
nativeFee: number,
privacyFee: number
) => Promise<TxHistoryModel>
Example:
const token = await account.getFollowingPrivacyToken('token-id');
const history = await token.transfer(
[
{
paymentAddressStr: otherAccount.key.keySet.paymentAddressKeySerialized,
amount: 10,
message: ''
}
],
20, // fee in nano PRV
0 // the privacy token must has exchange rate to be fee
);
console.log('Privacy token sent with history', history);
burning
Burn the token.
Usage:
transfer(
outchainAddress: string,
burningAmount: number,
nativeFee: number,
privacyFee: number
) => Promise<TxHistoryModel>
Example:
// burning ETH
const token = await account.getFollowingPrivacyToken('peth-token-id');
const history = await token.burning(
'ETH wallet address',
2000, // burning amount,
20, // fee in nano PRV
0 // the privacy token must has exchange rate to be fee
);
console.log('Privacy token burned with history', history);
pdeContribution
[pDEX] Send PDE contribution.
Usage:
pdeContribution(
pdeContributionPairID: string,
contributedAmount: number,
nativeFee: number,
privacyFee: number
) => Promise<TxHistoryModel>
requestTrade
Send trade request.
Usage:
requestTrade (
tokenIdBuy: string,
sellAmount: number,
minimumAcceptableAmount: number,
nativeFee: number,
privacyFee: number,
tradingFee: number
) => Promise<TxHistoryModel>
withdrawNodeReward
[Node] Withdraw reward from node.
Usage:
withdrawNodeReward() => Promise<TxHistoryModel>
bridgeGenerateDepositAddress
Get a temporary deposit address (expired after 60 minutes).
Usage:
bridgeGenerateDepositAddress() => Promise<string>
Example:
// deposit ETH
const token = await account.getFollowingPrivacyToken('peth-token-id');
const ethDepositAddress = await token.bridgeGenerateDepositAddress();
console.log('ETH deposit address', ethDepositAddress);
bridgeWithdraw
Withdraw bridged coins (Convert privacy token to origin, your privacy token will be burned and the origin will be returned). Please notice: withdrawal uses the fee (nativeFee or privacyFee) for burning coins.
Usage:
bridgeWithdraw(
outchainAddress: string,
decimalAmount: number,
nativeFee: number = 0,
privacyFee: number = 0,
memo?: string
) => Promise
Example:
// withdraw 0.5 pETH to Ethereum wallet address "ETH-wallett-address'
const token = await account.getFollowingPrivacyToken('peth-token-id');
await token.bridgeWithdraw(
'ETH-wallett-address',
0.5,
20,
0
);
console.log('ETH withdrew');
bridgeGetHistory
Get deposit/withdrawal history.
Usage:
bridgeGetHistory() => Promise<BridgeHistoryModel[]>
KeyWalletModel
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |keySet|AccountKeySetModel||Account Key set|
AccountKeySetModel
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |privateKeySerialized|string||Private key| |paymentAddressKeySerialized|string||Payment address| |viewingKeySerialized|string||Viewing key| |publicKeySerialized|string||Public key| |privateKey|PrivateKeyModel ||Private key byte| |paymentAddress|PaymentAddressKeyModel ||Payment address key byte| |viewingKey|ViewingKeyModel ||Viewing key byte| |publicKeyCheckEncode|string||| |miningSeedKey|string||| |validatorKey|string|||
TxHistoryModel
Tx histories include all transaction histories, not deposit and withdraw and stored in client storage.
|Public Property|Type|Default value|Description|
|----------|:-------------:|------:|------:|
|txId|string|||
|txType|string||Define in CONSTANT.TX_CONSTANT.TX_TYPE|
|lockTime|number|||
|status|number||Define in CONSTANT.TX_CONSTANT.TX_STATUS. Call historyServices.checkCachedHistories()
to update status.|
|nativeTokenInfo|object||Include native token info (fee, amount, coins, payment info)|
|privacyTokenInfo|object||Include privacy token info (fee, amount, coins, payment info)|
|meta|any|||
|accountPublicKeySerialized|string|||
|historyType|number||Define in CONSTANT.TX_CONSTANT.HISTORY_TYPE|
PaymentInfoModel
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |paymentAddressStr|string||| |amount|number|||| |message|string|||
BridgeHistoryModel
Bridge histories include deposit and withdraw transactions and stored in backend.
|Public Property|Type|Default value|Description| |----------|:-------------:|------:|------:| |id|number||| |userID|number|||| |address|string||| |expiredAt|string||| |addressType|number||defined in TOKEN_INFO_CONSTANT.BRIDGE_PRIVACY_TOKEN.ADDRESS_TYPE| |status|number||defined in TOKEN_INFO_CONSTANT.BRIDGE_PRIVACY_TOKEN.HISTORY_STATUS| |currencyType|number||defined in TOKEN_INFO_CONSTANT.BRIDGE_PRIVACY_TOKEN.CURRENCY_TYPE| |walletAddress|string||| |userPaymentAddress|string||| |requestedAmount|string||| |receivedAmount|string||| |incognitoAmount|string||| |ethereumTx|string||| |incognitoTx|string||| |erc20TokenTx|string||| |privacyTokenAddress|string||| |erc20TokenAddress|string||| |createdAt|string||| |updatedAt|string||| |decentralized|number||0 is centralized, 1 is decentralized| |outChainTx|string||| |inChainTx|string|||
Examples
NodeJS
Source file: sample/test-node.js
Command:
yarn test:node
Browser
Source file: sample/index.html
Command:
yarn test:browser
React Native
See the Incognito Wallet Template