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.

Relaterte artikler