UNPKG

@onekeyfe/blockchain-libs

Version:
133 lines 6.23 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Provider = void 0; /* eslint-disable @typescript-eslint/no-non-null-assertion */ const bignumber_js_1 = __importDefault(require("bignumber.js")); const precondtion_1 = require("../../../basic/precondtion"); const abc_1 = require("../../abc"); const address_1 = require("./sdk/address"); const hash_1 = require("./sdk/hash"); const signing_1 = require("./sdk/signing"); const tendermint_1 = require("./tendermint"); const DEFAULT_GAS_LIMIT = new bignumber_js_1.default(80000); class Provider extends abc_1.BaseProvider { get addressPrefix() { var _a; return (0, precondtion_1.checkIsDefined)((_a = this.chainInfo.implOptions) === null || _a === void 0 ? void 0 : _a.addressPrefix, "Please config 'addressPrefix' in 'implOptions'"); } get tendermint() { return this.clientSelector((i) => i instanceof tendermint_1.Tendermint); } async pubkeyToAddress(verifier, encoding) { const pubkey = await verifier.getPubkey(true); return (0, address_1.pubkeyToAddress)(this.chainInfo.curve, this.addressPrefix, pubkey); } async verifyAddress(address) { const isValid = (0, address_1.isValidAddress)(address, this.addressPrefix); return { displayAddress: isValid ? address : undefined, normalizedAddress: isValid ? address : undefined, isValid, }; } async verifyTokenAddress(address) { const validation = await this.verifyAddress(address); if (validation.isValid) { return { ...validation, encoding: 'CW20', }; } const isValid = address.length >= 3 && address.length <= 128; return { displayAddress: isValid ? address : undefined, normalizedAddress: isValid ? address : undefined, isValid, encoding: isValid ? 'NativeToken' : undefined, }; } async buildUnsignedTx(unsignedTx) { var _a, _b; const feeLimit = unsignedTx.feeLimit || ((_b = (_a = this.chainInfo.implOptions) === null || _a === void 0 ? void 0 : _a.gasLimits) === null || _b === void 0 ? void 0 : _b[unsignedTx.type || 'transfer']) || DEFAULT_GAS_LIMIT; const feePricePerUnit = bignumber_js_1.default.isBigNumber(unsignedTx.feePricePerUnit) && unsignedTx.feePricePerUnit.isFinite() && unsignedTx.feePricePerUnit.gte(0) ? unsignedTx.feePricePerUnit : await this.tendermint .then((i) => i.getFeePricePerUnit()) .then((i) => i.normal.price); const payload = unsignedTx.payload || {}; const [input] = unsignedTx.inputs || []; let accountNumber = payload.accountNumber; let nonce = unsignedTx.nonce; if (input && (!Number.isFinite(accountNumber) || !Number.isFinite(nonce) || accountNumber < 0 || nonce < 0)) { const accountInfo = await this.tendermint.then((i) => i.getAddress(input.address)); nonce = accountInfo.nonce; accountNumber = accountInfo.accountNumber; } return Object.assign({}, unsignedTx, { feeLimit: new bignumber_js_1.default(feeLimit), feePricePerUnit: new bignumber_js_1.default(feePricePerUnit), nonce: Number.isFinite(nonce) && nonce >= 0 ? nonce : undefined, payload: { accountNumber: Number.isFinite(accountNumber) && accountNumber >= 0 ? accountNumber : undefined, }, }); } async signTransaction(unsignedTx, signers) { const signer = signers[unsignedTx.inputs[0].address]; const pubkey = await signer.getPubkey(true); const signDoc = Provider.packUnsignedTx(unsignedTx, pubkey, this.chainInfo.implOptions.mainCoinDenom, this.chainInfo.implOptions.chainId); const signBytes = (0, signing_1.makeSignBytes)(signDoc); const [signature] = await signer.sign(Buffer.from((0, hash_1.sha256)(signBytes))); const rawTx = (0, signing_1.makeTxRawBytes)(signDoc.bodyBytes, signDoc.authInfoBytes, [ signature, ]); const txid = (0, hash_1.sha256)(rawTx); return { txid: Buffer.from(txid).toString('hex').toUpperCase(), rawTx: Buffer.from(rawTx).toString('base64'), }; } static packUnsignedTx(unsignedTx, pubkey, mainCoinDenom, chainId) { const { feeLimit, feePricePerUnit, nonce, payload } = unsignedTx; const { memo, accountNumber } = payload; const msg = Provider.packMsgObj(unsignedTx); const feeAmount = feePricePerUnit.lte(0) ? new bignumber_js_1.default(0) : feePricePerUnit.gte(tendermint_1.GAS_STEP_MULTIPLIER) ? feeLimit : feePricePerUnit.multipliedBy(feeLimit).div(tendermint_1.GAS_STEP_MULTIPLIER); return (0, signing_1.fastMakeSignDoc)([msg], memo, feeLimit.integerValue().toString(), feeAmount.integerValue().toString(), pubkey, mainCoinDenom, chainId, accountNumber, nonce); } static packMsgObj(unsignedTx) { const { inputs, outputs, type } = unsignedTx; const [input] = inputs; const [output] = outputs; if (type === undefined || type === 'transfer') { return (0, signing_1.makeMsgSend)(input.address, output.address, output.value.integerValue().toString(), output.tokenAddress); } else if (type === 'cw20_transfer') { return (0, signing_1.makeMsgExecuteContract)(input.address, output.tokenAddress, { transfer: { amount: output.value.integerValue().toString(), recipient: output.address, }, }); } throw new Error(`Invalid type: ${type} on unsignedTx`); } } exports.Provider = Provider; //# sourceMappingURL=provider.js.map