UNPKG

@radixdlt/account

Version:

A JavaScript client library for interacting with the Radix Distributed Ledger.

96 lines 4.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AccountAddress = exports.isAccountAddressOrUnsafeInput = exports.isAccountAddress = void 0; const neverthrow_1 = require("neverthrow"); const crypto_1 = require("@radixdlt/crypto"); const bech32_1 = require("../bech32"); const abstractAddress_1 = require("./abstractAddress"); const util_1 = require("@radixdlt/util"); const _types_1 = require("./_types"); const primitives_1 = require("@radixdlt/primitives"); const isAccountAddress = (something) => { if (!(0, abstractAddress_1.isAbstractAddress)(something)) return false; return something.addressType === _types_1.AddressTypeT.ACCOUNT; }; exports.isAccountAddress = isAccountAddress; const maxLength = 300; // arbitrarily chosen const versionByte = Buffer.from([0x04]); const encoding = bech32_1.Encoding.BECH32; const hrpFromNetwork = (network) => primitives_1.HRP[network].account; const networkFromHRP = hrp => hrp === primitives_1.HRP.mainnet.account ? (0, neverthrow_1.ok)(primitives_1.Network.MAINNET) : hrp === primitives_1.HRP.stokenet.account ? (0, neverthrow_1.ok)(primitives_1.Network.STOKENET) : hrp === primitives_1.HRP.localnet.account ? (0, neverthrow_1.ok)(primitives_1.Network.LOCALNET) : hrp === primitives_1.HRP.releasenet.account ? (0, neverthrow_1.ok)(primitives_1.Network.RELEASENET) : hrp === primitives_1.HRP.rcnet.account ? (0, neverthrow_1.ok)(primitives_1.Network.RCNET) : hrp === primitives_1.HRP.milestonenet.account ? (0, neverthrow_1.ok)(primitives_1.Network.MILESTONENET) : hrp === primitives_1.HRP.testnet6.account ? (0, neverthrow_1.ok)(primitives_1.Network.TESTNET6) : hrp === primitives_1.HRP.sandpitnet.account ? (0, neverthrow_1.ok)(primitives_1.Network.SANDPITNET) : (0, neverthrow_1.err)(Error(`Failed to parse network from HRP ${hrp} for AccountAddress.`)); const formatDataToBech32Convert = data => Buffer.concat([versionByte, data]); const validateDataAndExtractPubKeyBytes = (data) => { const receivedVersionByte = data.slice(0, 1); if (!(0, util_1.buffersEquals)(versionByte, receivedVersionByte)) { const errMsg = `Wrong version byte, expected '${versionByte.toString('hex')}', but got: '${receivedVersionByte.toString('hex')}'`; console.error(errMsg); return (0, neverthrow_1.err)(new Error(errMsg)); } return (0, neverthrow_1.ok)(data.slice(1, data.length)); }; const fromPublicKeyAndNetwork = (input) => abstractAddress_1.AbstractAddress.byFormattingPublicKeyDataAndBech32ConvertingIt(Object.assign(Object.assign({}, input), { network: input.network, hrpFromNetwork, addressType: _types_1.AddressTypeT.ACCOUNT, typeguard: exports.isAccountAddress, formatDataToBech32Convert, encoding, maxLength })) .orElse(e => { throw new Error(`Expected to always be able to create AccountAddress from publicKey and network, but got error: ${e.message}`); }) ._unsafeUnwrap({ withStackTrace: true }); const fromString = (bechString) => abstractAddress_1.AbstractAddress.fromString({ bechString, addressType: _types_1.AddressTypeT.ACCOUNT, networkFromHRP, typeguard: exports.isAccountAddress, validateDataAndExtractPubKeyBytes, encoding, maxLength, }); const fromBuffer = (buffer) => { const fromBuf = (buf) => crypto_1.PublicKey.fromBuffer(buf).map(publicKey => fromPublicKeyAndNetwork({ publicKey, network: primitives_1.Network.MAINNET, // yikes! })); if (buffer.length === 34 && buffer[0] === 0x04) { const sliced = buffer.slice(1); if (sliced.length !== 33) { return (0, neverthrow_1.err)(new Error('Failed to slice buffer.')); } return fromBuf(sliced); } else if (buffer.length === 33) { return fromBuf(buffer); } else { return (0, neverthrow_1.err)(new Error(`Bad length of buffer, got #${buffer.length} bytes, but expected 33.`)); } }; const isAccountAddressUnsafeInput = (something) => typeof something === 'string' || Buffer.isBuffer(something); const isAccountAddressOrUnsafeInput = (something) => (0, exports.isAccountAddress)(something) || isAccountAddressUnsafeInput(something); exports.isAccountAddressOrUnsafeInput = isAccountAddressOrUnsafeInput; const fromUnsafe = (input) => (0, exports.isAccountAddress)(input) ? (0, neverthrow_1.ok)(input) : typeof input === 'string' ? fromString(input) : fromBuffer(input); exports.AccountAddress = { isAccountAddress: exports.isAccountAddress, fromUnsafe, fromPublicKeyAndNetwork, }; //# sourceMappingURL=accountAddress.js.map