wormhole/sdk/js/src/solana/tokenBridge/instructions/attestToken.ts

98 lines
2.4 KiB
TypeScript

import {
PublicKey,
PublicKeyInitData,
TransactionInstruction,
} from "@solana/web3.js";
import { createReadOnlyTokenBridgeProgramInterface } from "../program";
import { getPostMessageAccounts } from "../../wormhole";
import {
deriveSplTokenMetadataKey,
deriveTokenBridgeConfigKey,
deriveWrappedMetaKey,
} from "../accounts";
export function createAttestTokenInstruction(
tokenBridgeProgramId: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData,
payer: PublicKeyInitData,
mint: PublicKeyInitData,
message: PublicKeyInitData,
nonce: number
): TransactionInstruction {
const methods =
createReadOnlyTokenBridgeProgramInterface(
tokenBridgeProgramId
).methods.attestToken(nonce);
// @ts-ignore
return methods._ixFn(...methods._args, {
accounts: getAttestTokenAccounts(
tokenBridgeProgramId,
wormholeProgramId,
payer,
mint,
message
) as any,
signers: undefined,
remainingAccounts: undefined,
preInstructions: undefined,
postInstructions: undefined,
});
}
export interface AttestTokenAccounts {
payer: PublicKey;
config: PublicKey;
mint: PublicKey;
wrappedMeta: PublicKey;
splMetadata: PublicKey;
wormholeBridge: PublicKey;
wormholeMessage: PublicKey;
wormholeEmitter: PublicKey;
wormholeSequence: PublicKey;
wormholeFeeCollector: PublicKey;
clock: PublicKey;
rent: PublicKey;
systemProgram: PublicKey;
wormholeProgram: PublicKey;
}
export function getAttestTokenAccounts(
tokenBridgeProgramId: PublicKeyInitData,
wormholeProgramId: PublicKeyInitData,
payer: PublicKeyInitData,
mint: PublicKeyInitData,
message: PublicKeyInitData
): AttestTokenAccounts {
const {
bridge: wormholeBridge,
emitter: wormholeEmitter,
sequence: wormholeSequence,
feeCollector: wormholeFeeCollector,
clock,
rent,
systemProgram,
} = getPostMessageAccounts(
wormholeProgramId,
payer,
tokenBridgeProgramId,
message
);
return {
payer: new PublicKey(payer),
config: deriveTokenBridgeConfigKey(tokenBridgeProgramId),
mint: new PublicKey(mint),
wrappedMeta: deriveWrappedMetaKey(tokenBridgeProgramId, mint),
splMetadata: deriveSplTokenMetadataKey(mint),
wormholeBridge,
wormholeMessage: new PublicKey(message),
wormholeEmitter,
wormholeSequence,
wormholeFeeCollector,
clock,
rent,
systemProgram,
wormholeProgram: new PublicKey(wormholeProgramId),
};
}