typescript - Solana/web3.js : få web3.Signer fra lommebok
Jeg vil sende en token fra en lommebok til en annen ved å bruke web3.js og spl-token. For å sende den må jeg lage et objekt kalt Token, en av parameterne til konstruktøren til Token() er payer: web3.Signer.
const mintPublicKey = new web3.PublicKey(this.props.nft.data.mint);
const mintToken = new Token(
this.props.connection,
mintPublicKey,
TOKEN_PROGRAM_ID,
//payer: web3.Signer,
);
Jeg får informasjonen fra brukerens lommebok ved å bruke @solana/wallet-adapter-wallets. Jeg vet at web3.Signer opprettes fra en privat nøkkel, som ikke kan hentes fra en lommebok av sikkerhetsmessige årsaker.
Jeg vet faktisk ikke hvordan jeg skal håndtere lommeboken for å få gjennomført transaksjonen.
Tusen takk for hjelpen, her er hele koden min:
import * as web3 from "@solana/web3.js";
import { getPhantomWallet } from "@solana/wallet-adapter-wallets";
import { Token, TOKEN_PROGRAM_ID } from "@solana/spl-token";
async sendNFT() {
const wallet = getPhantomWallet();
const adapter = wallet.adapter();
await adapter.connect();
if (adapter.connected && adapter.publicKey != null)
{
const mintPublicKey = new web3.PublicKey(this.props.nft.data.mint);
const mintToken = new Token(
this.props.connection,
mintPublicKey,
TOKEN_PROGRAM_ID,
//payer: web3.Signer
);
const fromTokenAccount = await mintToken.getOrCreateAssociatedAccountInfo(
adapter.publicKey
);
const destPublicKey = new web3.PublicKey("example");
const associatedDestinationTokenAddr = await Token.getAssociatedTokenAddress(
mintToken.associatedProgramId,
mintToken.programId,
mintPublicKey,
destPublicKey
);
const receiverAccount = await this.props.connection.getAccountInfo(associatedDestinationTokenAddr);
const instructions: web3.TransactionInstruction[] = [];
if (receiverAccount === null) {
instructions.push(
Token.createAssociatedTokenAccountInstruction(
mintToken.associatedProgramId,
mintToken.programId,
mintPublicKey,
associatedDestinationTokenAddr,
destPublicKey,
adapter.publicKey
)
)
}
instructions.push(
Token.createTransferInstruction(
TOKEN_PROGRAM_ID,
fromTokenAccount.address,
associatedDestinationTokenAddr,
adapter.publicKey,
[],
1000000
)
);
const transaction = new web3.Transaction().add(...instructions);
transaction.feePayer = adapter.publicKey;
transaction.recentBlockhash = (await this.props.connection.getRecentBlockhash()).blockhash;
const transactionSignature = await this.props.connection.sendRawTransaction(
transaction.serialize(),
{ skipPreflight: true }
);
await this.props.connection.confirmTransaction(transactionSignature);
}
}
Svar #1
Jeg tror den enkleste måten å gjøre dette på er å lage en leverandør og få signeren derfra.
provider = new anchor.Provider(connection, wallet, anchor.Provider.defaultOptions());
og deretter kan du sende transaksjoner ved å kalle provider.send(tx), som også vil signere med lommeboken din hvis det krever signering.
