UNPKG

@metaplex-foundation/umi-transaction-factory-web3js

Version:

A transaction factory implementation relying on Solana's web3.js

105 lines (100 loc) 4.66 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var umi = require('@metaplex-foundation/umi'); var serializers = require('@metaplex-foundation/umi/serializers'); var umiWeb3jsAdapters = require('@metaplex-foundation/umi-web3js-adapters'); var web3_js = require('@solana/web3.js'); /* eslint-disable no-bitwise */ const TRANSACTION_VERSION_FLAG = 0x80; const TRANSACTION_VERSION_MASK = 0x7f; function createWeb3JsTransactionFactory() { const create = input => { const web3JsMessage = umiWeb3jsAdapters.toWeb3JsMessageFromInput(input); const message = umiWeb3jsAdapters.fromWeb3JsMessage(web3JsMessage); const web3JsTransaction = new web3_js.VersionedTransaction(web3JsMessage, input.signatures); return { message, serializedMessage: serializeMessage(message), signatures: web3JsTransaction.signatures }; }; const serialize = transaction => getTransactionSerializer().serialize(transaction); const deserialize = serializedTransaction => getTransactionSerializer().deserialize(serializedTransaction)[0]; const serializeMessage = message => getTransactionMessageSerializer().serialize(message); const deserializeMessage = serializedMessage => getTransactionMessageSerializer().deserialize(serializedMessage)[0]; const getTransactionSerializer = () => ({ ...serializers.mapSerializer(serializers.struct([['signatures', serializers.array(serializers.bytes({ size: 64 }), { size: serializers.shortU16() })], ['serializedMessage', serializers.bytes()]]), value => value, value => ({ ...value, message: deserializeMessage(value.serializedMessage) })), description: 'Transaction' }); const getTransactionMessageSerializer = () => ({ description: 'TransactionMessage', fixedSize: null, maxSize: null, serialize: value => { const serializer = getTransactionMessageSerializerForVersion(value.version); return serializer.serialize(value); }, deserialize: (bytes, offset = 0) => { const [version] = getTransactionVersionSerializer().deserialize(bytes, offset); const serializer = getTransactionMessageSerializerForVersion(version); return serializer.deserialize(bytes, offset); } }); const getTransactionMessageSerializerForVersion = version => serializers.struct([['version', getTransactionVersionSerializer()], ['header', getTransactionMessageHeaderSerializer()], ['accounts', serializers.array(serializers.publicKey(), { size: serializers.shortU16() })], ['blockhash', serializers.string({ encoding: serializers.base58, size: 32 })], ['instructions', serializers.array(getCompiledInstructionSerializer(), { size: serializers.shortU16() })], ['addressLookupTables', serializers.array(getCompiledAddressLookupTableSerializer(), { size: version === 'legacy' ? 0 : serializers.shortU16() })]]); const getTransactionVersionSerializer = () => ({ description: 'TransactionVersion', fixedSize: null, maxSize: 1, serialize: value => { if (value === 'legacy') return new Uint8Array([]); return new Uint8Array([TRANSACTION_VERSION_FLAG | value]); }, deserialize: (bytes, offset = 0) => { const slice = bytes.slice(offset); if (slice.length === 0 || (slice[0] & TRANSACTION_VERSION_FLAG) === 0) { return ['legacy', offset]; } const version = slice[0] & TRANSACTION_VERSION_MASK; if (version > 0) { throw new umi.SdkError(`Unsupported transaction version: ${version}.`); } return [version, offset + 1]; } }); const getTransactionMessageHeaderSerializer = () => serializers.struct([['numRequiredSignatures', serializers.u8()], ['numReadonlySignedAccounts', serializers.u8()], ['numReadonlyUnsignedAccounts', serializers.u8()]]); const getCompiledInstructionSerializer = () => serializers.struct([['programIndex', serializers.u8()], ['accountIndexes', serializers.array(serializers.u8(), { size: serializers.shortU16() })], ['data', serializers.bytes({ size: serializers.shortU16() })]]); const getCompiledAddressLookupTableSerializer = () => serializers.struct([['publicKey', serializers.publicKey()], ['writableIndexes', serializers.array(serializers.u8(), { size: serializers.shortU16() })], ['readonlyIndexes', serializers.array(serializers.u8(), { size: serializers.shortU16() })]]); return { create, serialize, deserialize, serializeMessage, deserializeMessage }; } exports.createWeb3JsTransactionFactory = createWeb3JsTransactionFactory; //# sourceMappingURL=createWeb3JsTransactionFactory.cjs.map