@solana/compat
Version:
Helpers for converting from legacy web3js classes
73 lines (71 loc) • 2.73 kB
JavaScript
import { AccountRole } from '@solana/instructions';
import { createKeyPairFromBytes } from '@solana/keys';
import { SolanaError, SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH } from '@solana/errors';
// src/address.ts
function fromLegacyPublicKey(publicKey) {
return publicKey.toBase58();
}
function fromLegacyTransactionInstruction(legacyInstruction) {
const data = legacyInstruction.data?.byteLength > 0 ? Uint8Array.from(legacyInstruction.data) : void 0;
const accounts = legacyInstruction.keys.map(
(accountMeta) => Object.freeze({
address: fromLegacyPublicKey(accountMeta.pubkey),
role: determineRole(accountMeta.isSigner, accountMeta.isWritable)
})
);
const programAddress = fromLegacyPublicKey(legacyInstruction.programId);
return Object.freeze({
...accounts.length ? { accounts: Object.freeze(accounts) } : null,
...data ? { data } : null,
programAddress
});
}
function determineRole(isSigner, isWritable) {
if (isSigner && isWritable) return AccountRole.WRITABLE_SIGNER;
if (isSigner) return AccountRole.READONLY_SIGNER;
if (isWritable) return AccountRole.WRITABLE;
return AccountRole.READONLY;
}
async function fromLegacyKeypair(keypair, extractable) {
const bytes = new Uint8Array(64);
bytes.set(keypair.secretKey);
bytes.set(
keypair.publicKey.toBytes(),
/* offset */
32
);
return await createKeyPairFromBytes(bytes, extractable);
}
function convertSignatures(transaction, staticAccountKeys) {
return Object.fromEntries(
transaction.signatures.map((sig, index) => {
const address = staticAccountKeys[index];
if (sig.every((b) => b === 0)) {
return [address, null];
} else {
return [address, sig];
}
})
);
}
function fromVersionedTransaction(transaction) {
const { message } = transaction;
const { staticAccountKeys } = message.getAccountKeys();
const { numRequiredSignatures } = message.header;
if (numRequiredSignatures !== transaction.signatures.length) {
throw new SolanaError(SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH, {
numRequiredSignatures: transaction.message.header.numRequiredSignatures,
signaturesLength: transaction.signatures.length,
signerAddresses: staticAccountKeys.slice(0, numRequiredSignatures).map((p) => p.toBase58())
});
}
const messageBytes = message.serialize();
const signatures = convertSignatures(transaction, staticAccountKeys);
return {
messageBytes,
signatures: Object.freeze(signatures)
};
}
export { fromLegacyKeypair, fromLegacyPublicKey, fromLegacyTransactionInstruction, fromVersionedTransaction };
//# sourceMappingURL=index.node.mjs.map
//# sourceMappingURL=index.node.mjs.map