@onekeyfe/blockchain-libs
Version:
OneKey Blockchain Libs
133 lines • 6.23 kB
JavaScript
;
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