@metaplex-foundation/umi-web3js-adapters
Version:
A helper package to transform web3.js types to and from umi types
71 lines (64 loc) • 2.12 kB
text/typescript
import { base58, Transaction } from '@metaplex-foundation/umi';
import {
SIGNATURE_LENGTH_IN_BYTES,
Transaction as Web3JsLegacyTransaction,
Message as Web3JsMessage,
VersionedTransaction as Web3JsTransaction,
} from '@solana/web3.js';
import { fromWeb3JsMessage, toWeb3JsMessage } from './TransactionMessage';
export function fromWeb3JsTransaction(
web3JsTransaction: Web3JsTransaction
): Transaction {
return {
message: fromWeb3JsMessage(web3JsTransaction.message),
serializedMessage: web3JsTransaction.message.serialize(),
signatures: web3JsTransaction.signatures,
};
}
export function toWeb3JsTransaction(
transaction: Transaction
): Web3JsTransaction {
return new Web3JsTransaction(
toWeb3JsMessage(transaction.message),
transaction.signatures
);
}
export function fromWeb3JsLegacyTransaction(
web3JsLegacyTransaction: Web3JsLegacyTransaction
): Transaction {
const web3JsMessage = web3JsLegacyTransaction.compileMessage();
const web3JsLegacySignatures = web3JsLegacyTransaction.signatures.reduce(
(all, one) => {
all[one.publicKey.toBase58()] = one.signature
? new Uint8Array(one.signature)
: null;
return all;
},
{} as Record<string, Uint8Array | null>
);
const signatures = [];
for (let i = 0; i < web3JsMessage.header.numRequiredSignatures; i += 1) {
const pubkey = web3JsMessage.accountKeys[i].toBase58();
const signature = web3JsLegacySignatures[pubkey] ?? null;
signatures.push(signature ?? new Uint8Array(SIGNATURE_LENGTH_IN_BYTES));
}
return {
message: fromWeb3JsMessage(web3JsMessage),
serializedMessage: web3JsMessage.serialize(),
signatures,
};
}
export function toWeb3JsLegacyTransaction(
transaction: Transaction
): Web3JsLegacyTransaction {
const web3JsTransaction = toWeb3JsTransaction({
...transaction,
message: { ...transaction.message, version: 'legacy' },
});
return Web3JsLegacyTransaction.populate(
web3JsTransaction.message as Web3JsMessage,
web3JsTransaction.signatures.map(
(signature) => base58.deserialize(signature)[0]
)
);
}