@metaplex-foundation/umi-web3js-adapters
Version:
A helper package to transform web3.js types to and from umi types
98 lines (92 loc) • 3.31 kB
text/typescript
import {
base58,
TransactionInput,
TransactionMessage,
} from '@metaplex-foundation/umi';
import {
AddressLookupTableAccount as Web3JsAddressLookupTableAccount,
Message as Web3JsMessageLegacy,
MessageV0 as Web3JsMessageV0,
} from '@solana/web3.js';
import { toWeb3JsInstruction } from './Instruction';
import { fromWeb3JsPublicKey, toWeb3JsPublicKey } from './PublicKey';
export function fromWeb3JsMessage(
message: Web3JsMessageLegacy | Web3JsMessageV0
): TransactionMessage {
return {
version: message.version,
header: message.header,
accounts: message.staticAccountKeys.map(fromWeb3JsPublicKey),
blockhash: message.recentBlockhash,
instructions: message.compiledInstructions.map((instruction) => ({
programIndex: instruction.programIdIndex,
accountIndexes: instruction.accountKeyIndexes,
data: new Uint8Array(instruction.data),
})),
addressLookupTables: message.addressTableLookups.map((lookup) => ({
publicKey: fromWeb3JsPublicKey(lookup.accountKey),
writableIndexes: lookup.writableIndexes,
readonlyIndexes: lookup.readonlyIndexes,
})),
};
}
export function toWeb3JsMessage(
message: TransactionMessage
): Web3JsMessageLegacy | Web3JsMessageV0 {
if (message.version === 'legacy') {
return new Web3JsMessageLegacy({
header: message.header,
accountKeys: message.accounts.map(toWeb3JsPublicKey),
recentBlockhash: message.blockhash,
instructions: message.instructions.map((instruction) => ({
programIdIndex: instruction.programIndex,
accounts: instruction.accountIndexes,
data: base58.deserialize(instruction.data)[0],
})),
});
}
return new Web3JsMessageV0({
header: message.header,
staticAccountKeys: message.accounts.map(toWeb3JsPublicKey),
recentBlockhash: message.blockhash,
compiledInstructions: message.instructions.map((instruction) => ({
programIdIndex: instruction.programIndex,
accountKeyIndexes: instruction.accountIndexes,
data: instruction.data,
})),
addressTableLookups: message.addressLookupTables.map((lookup) => ({
accountKey: toWeb3JsPublicKey(lookup.publicKey),
writableIndexes: lookup.writableIndexes,
readonlyIndexes: lookup.readonlyIndexes,
})),
});
}
export function toWeb3JsMessageFromInput(
input: TransactionInput
): Web3JsMessageLegacy | Web3JsMessageV0 {
if (input.version === 'legacy') {
return Web3JsMessageLegacy.compile({
payerKey: toWeb3JsPublicKey(input.payer),
instructions: input.instructions.map(toWeb3JsInstruction),
recentBlockhash: input.blockhash,
});
}
return Web3JsMessageV0.compile({
payerKey: toWeb3JsPublicKey(input.payer),
instructions: input.instructions.map(toWeb3JsInstruction),
recentBlockhash: input.blockhash,
addressLookupTableAccounts: input.addressLookupTables?.map(
(account) =>
new Web3JsAddressLookupTableAccount({
key: toWeb3JsPublicKey(account.publicKey),
state: {
addresses: account.addresses.map(toWeb3JsPublicKey),
authority: undefined,
deactivationSlot: BigInt(`0x${'ff'.repeat(8)}`),
lastExtendedSlot: 0,
lastExtendedSlotStartIndex: 0,
},
})
),
});
}