UNPKG

@reef-defi/evm-provider

Version:
164 lines 7.27 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveAddress = exports.resolveEvmAddress = exports.isMainnet = exports.isSubstrateAddress = exports.dataToString = exports.toBN = exports.handleTxResponse = exports.decodeMessage = exports.createClaimEvmSignature = exports.MAINNET_GENESIS_HASH = exports.U64MAX = exports.U32MAX = void 0; /* eslint-disable prefer-promise-reject-errors */ const bignumber_1 = require("@ethersproject/bignumber"); const util_1 = require("@polkadot/util"); const bn_js_1 = __importDefault(require("bn.js")); const util_crypto_1 = require("@polkadot/util-crypto"); const strings_1 = require("@ethersproject/strings"); exports.U32MAX = bignumber_1.BigNumber.from('0xffffffff'); exports.U64MAX = bignumber_1.BigNumber.from('0xffffffffffffffff'); exports.MAINNET_GENESIS_HASH = '0x7834781d38e4798d548e34ec947d19deea29df148a7bf32484b7b24dacf8d4b7'; function createClaimEvmSignature(substrateAddress) { const publicKeySubstrate = (0, util_crypto_1.decodeAddress)(substrateAddress); let message = 'reef evm:' + Buffer.from(publicKeySubstrate).toString('hex'); if (typeof message === 'string') { message = (0, strings_1.toUtf8Bytes)(message); } return message; } exports.createClaimEvmSignature = createClaimEvmSignature; // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types function decodeMessage(reason, code) { const reasonString = JSON.stringify(reason).toLowerCase(); let codeString = `0x${code.substr(138)}`.replace(/0+$/, ''); // If the codeString is an odd number of characters, add a trailing 0 if (codeString.length % 2 === 1) { codeString += '0'; } return `${reasonString} ${(0, util_1.hexToString)(codeString)}`; } exports.decodeMessage = decodeMessage; function handleTxResponse(result, api) { return new Promise((resolve, reject) => { if (result.status.isFinalized || result.status.isInBlock) { const createdFailed = result.findRecord('evm', 'CreatedFailed'); const executedFailed = result.findRecord('evm', 'ExecutedFailed'); result.events .filter(({ event: { section } }) => section === 'system') .forEach((event) => { const { event: { data, method } } = event; if (method === 'ExtrinsicFailed') { // eslint-disable-next-line @typescript-eslint/no-explicit-any const [dispatchError] = data; let message = dispatchError.type; if (dispatchError.isModule) { try { const mod = dispatchError.asModule; const error = api.registry.findMetaError(new Uint8Array([mod.index.toNumber(), mod.error.toNumber()])); message = `${error.section}.${error.name}`; } catch (error) { // swallow } } reject({ message, result }); } else if (method === 'ExtrinsicSuccess') { const failed = createdFailed || executedFailed; if (failed) { reject({ message: decodeMessage(failed.event.data[1].toJSON(), failed.event.data[2].toJSON()), result }); } resolve({ result }); } }); } else if (result.isError) { reject({ result }); } }); } exports.handleTxResponse = handleTxResponse; function toBN(bigNumberis = 0) { if ((0, util_1.isU8a)(bigNumberis)) { return (0, util_1.u8aToBn)(bigNumberis); } if ((0, util_1.isHex)(bigNumberis)) { return (0, util_1.hexToBn)(bigNumberis); } if (bignumber_1.BigNumber.isBigNumber(bigNumberis)) { const hex = bigNumberis.toHexString(); if (hex[0] === '-') { return new bn_js_1.default('-' + hex.substring(3), 16); } return new bn_js_1.default(hex.substring(2), 16); } // eslint-disable-next-line @typescript-eslint/no-explicit-any return new bn_js_1.default(bigNumberis); } exports.toBN = toBN; function dataToString(bytes) { if ((0, util_1.isBuffer)(bytes)) { return (0, util_1.u8aToHex)((0, util_1.bufferToU8a)(bytes)); } if ((0, util_1.isU8a)(bytes)) { return (0, util_1.u8aToHex)(bytes); } if (Array.isArray(bytes)) { return (0, util_1.u8aToHex)(Buffer.from(bytes)); } return bytes; } exports.dataToString = dataToString; function isSubstrateAddress(address) { if (!address) { return false; } try { (0, util_crypto_1.encodeAddress)((0, util_1.isHex)(address) ? (0, util_1.hexToU8a)(address) : (0, util_crypto_1.decodeAddress)(address)); } catch (error) { return false; } return true; } exports.isSubstrateAddress = isSubstrateAddress; function isMainnet(providerOrSigner) { var _a; const provider = providerOrSigner.provider ? providerOrSigner.provider : providerOrSigner; return ((_a = provider === null || provider === void 0 ? void 0 : provider.api) === null || _a === void 0 ? void 0 : _a.genesisHash.toString()) === exports.MAINNET_GENESIS_HASH; } exports.isMainnet = isMainnet; // returns evm address function resolveEvmAddress(provider, nativeAddressOrName) { return __awaiter(this, void 0, void 0, function* () { const resolved = yield nativeAddressOrName; if (resolved.length === 42) { return resolved; } const result = yield provider.api.query.evmAccounts.evmAddresses(resolved); return result.toString(); }); } exports.resolveEvmAddress = resolveEvmAddress; // returns Reef native address function resolveAddress(provider, evmAddressOrName) { return __awaiter(this, void 0, void 0, function* () { const resolved = yield evmAddressOrName; if (isSubstrateAddress(resolved)) { return resolved; } const result = yield provider.api.query.evmAccounts.accounts(resolved); return result.toString(); }); } exports.resolveAddress = resolveAddress; //# sourceMappingURL=utils.js.map