@harmony-js/core
Version:
harmony core package
227 lines • 9.46 kB
JavaScript
"use strict";
/**
* @packageDocumentation
* @module harmony-core
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.HarmonyExtension = exports.ExtensionType = void 0;
var tslib_1 = require("tslib");
var network_1 = require("@harmony-js/network");
var crypto = tslib_1.__importStar(require("@harmony-js/crypto"));
var utils = tslib_1.__importStar(require("@harmony-js/utils"));
var transaction_1 = require("@harmony-js/transaction");
var blockchain_1 = require("./blockchain");
var contract_1 = require("@harmony-js/contract");
/** @hidden */
var ExtensionType;
(function (ExtensionType) {
ExtensionType["MathWallet"] = "MathWallet";
ExtensionType["OneWallet"] = "OneWallet";
})(ExtensionType = exports.ExtensionType || (exports.ExtensionType = {}));
var HarmonyExtension = /** @class */ (function () {
/**
* Create an blockchain instance support wallet injection
*
* @param wallet could be MathWallet or OneWallet instance
* @param config (optional), using default `Chain_Id` and `Chain_Type`
*
* @example
* ```javascript
* // Using Mathwallet instance
* export const initEx = async() => {
* hmyEx = new HarmonyExtension(window.harmony);
* }
* // Using OneWallet instance
* export const initEx = async() => {
* hmyEx = new HarmonyExtension(window.onewallet);
* }
* ```
*/
function HarmonyExtension(wallet, config) {
if (config === void 0) { config = {
chainId: utils.defaultConfig.Default.Chain_ID,
chainType: utils.defaultConfig.Default.Chain_Type,
}; }
this.extensionType = null;
this.wallet = wallet;
// check if it is mathwallet or onewallet
this.isExtension(this.wallet);
if (wallet.messenger) {
this.provider = wallet.messenger.provider;
this.messenger = wallet.messenger;
}
else {
this.provider = new network_1.Provider(config.chainUrl || wallet.network.chain_url).provider;
this.messenger = new network_1.Messenger(this.provider, config.chainType, config.chainId);
}
this.wallet.messenger = this.messenger;
this.blockchain = new blockchain_1.Blockchain(this.messenger);
this.transactions = new transaction_1.TransactionFactory(this.messenger);
this.contracts = new contract_1.ContractFactory(this.wallet);
this.crypto = crypto;
this.utils = utils;
}
/**
* Will change the provider for its module.
*
* @param provider a valid provider, you can replace it with your own working node
*
* @example
* ```javascript
* const tmp = hmyEx.setProvider('http://localhost:9500');
* ```
*/
HarmonyExtension.prototype.setProvider = function (provider) {
this.provider = new network_1.Provider(provider).provider;
this.messenger.setProvider(this.provider);
this.setMessenger(this.messenger);
};
/**
* Change the Shard ID
*
* @example
* ```
* hmyEx.setShardID(2);
* ```
*/
HarmonyExtension.prototype.setShardID = function (shardID) {
this.defaultShardID = shardID;
this.messenger.setDefaultShardID(this.defaultShardID);
this.setMessenger(this.messenger);
};
HarmonyExtension.prototype.isExtension = function (wallet) {
var _this = this;
var isExtension = false;
this.extensionType = null;
if (wallet.isMathWallet || wallet.isOneWallet) {
isExtension = true;
if (wallet.isMathWallet)
this.extensionType = ExtensionType.MathWallet;
else
this.extensionType = ExtensionType.OneWallet;
// remake signTransaction of MathWallet or OneWallet
var signTransaction_1 = this.wallet.signTransaction;
this.wallet.signTransaction = function (transaction, updateNonce, encodeMode, blockNumber) {
if (updateNonce === void 0) { updateNonce = true; }
if (encodeMode === void 0) { encodeMode = 'rlp'; }
if (blockNumber === void 0) { blockNumber = 'latest'; }
return tslib_1.__awaiter(_this, void 0, void 0, function () {
var extensionAccount, nonce;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.wallet.getAccount()];
case 1:
extensionAccount = _a.sent();
if (!updateNonce) return [3 /*break*/, 3];
return [4 /*yield*/, this.messenger.send(network_1.RPCMethod.GetAccountNonce, [crypto.getAddress(extensionAccount.address).checksum, blockNumber], this.messenger.chainPrefix, typeof transaction.txParams.shardID === 'string'
? Number.parseInt(transaction.txParams.shardID, 10)
: transaction.txParams.shardID)];
case 2:
nonce = _a.sent();
transaction.setParams(tslib_1.__assign(tslib_1.__assign({}, transaction.txParams), { from: crypto.getAddress(extensionAccount.address).bech32, nonce: Number.parseInt(utils.isHex(nonce.result.toString()) ? utils.hexToNumber(nonce.result.toString()) : nonce.result.toString(), 10) }));
return [3 /*break*/, 4];
case 3:
transaction.setParams(tslib_1.__assign(tslib_1.__assign({}, transaction.txParams), { from: crypto.getAddress(extensionAccount.address).bech32 }));
_a.label = 4;
case 4: return [2 /*return*/, signTransaction_1(transaction, false, encodeMode, blockNumber)];
}
});
});
};
}
if (!isExtension) {
throw new Error('Extension is not found');
}
return;
};
/**
* Get the wallet account
*
* @example
* ```javascript
* const account = hmyEx.login();
* console.log(account);
* ```
*/
HarmonyExtension.prototype.login = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var account;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.wallet.getAccount()];
case 1:
account = _a.sent();
// Use address
return [2 /*return*/, account];
}
});
});
};
/**
* Log out the wallet account
*
* @example
* ```javascript
* hmyEx.logout();
* ```
*/
HarmonyExtension.prototype.logout = function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.wallet.forgetIdentity()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
/**
* Set the sharding Structure
*
* @param shardingStructures The array of information of sharding structures
*
* @example
* ```javascript
* hmyEx.shardingStructures([
* {"current":true,"http":"http://127.0.0.1:9500",
* "shardID":0,"ws":"ws://127.0.0.1:9800"},
* {"current":false,"http":"http://127.0.0.1:9501",
* "shardID":1,"ws":"ws://127.0.0.1:9801"}
* ]);
* ```
*/
HarmonyExtension.prototype.shardingStructures = function (shardingStructures) {
var e_1, _a;
try {
for (var shardingStructures_1 = tslib_1.__values(shardingStructures), shardingStructures_1_1 = shardingStructures_1.next(); !shardingStructures_1_1.done; shardingStructures_1_1 = shardingStructures_1.next()) {
var shard = shardingStructures_1_1.value;
var shardID = typeof shard.shardID === 'string' ? Number.parseInt(shard.shardID, 10) : shard.shardID;
this.messenger.shardProviders.set(shardID, {
current: shard.current !== undefined ? shard.current : false,
shardID: shardID,
http: shard.http,
ws: shard.ws,
});
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (shardingStructures_1_1 && !shardingStructures_1_1.done && (_a = shardingStructures_1.return)) _a.call(shardingStructures_1);
}
finally { if (e_1) throw e_1.error; }
}
this.setMessenger(this.messenger);
};
/**@ignore*/
HarmonyExtension.prototype.setMessenger = function (messenger) {
this.blockchain.setMessenger(messenger);
this.wallet.messenger = messenger;
this.transactions.setMessenger(messenger);
};
return HarmonyExtension;
}());
exports.HarmonyExtension = HarmonyExtension;
//# sourceMappingURL=harmonyExtension.js.map