async transferWAudio (recipientSolanaAddress, amount) {
    // Check if the solana address is a token account
    let tokenAccountInfo = await this.getAssociatedTokenAccountInfo(recipientSolanaAddress)
    if (!tokenAccountInfo) {
      console.info('Provided recipient solana address was not a token account')
      // If not, check to see if it already has an associated token account.
      const associatedTokenAccount = await this.findAssociatedTokenAddress(recipientSolanaAddress)
      tokenAccountInfo = await this.getAssociatedTokenAccountInfo(associatedTokenAccount.toString())

      // If it's not a valid token account, we need to make one first
      if (!tokenAccountInfo) {
        console.info('Provided recipient solana address has no associated token account, creating')
        await this.createAssociatedTokenAccount(recipientSolanaAddress)
      }
      recipientSolanaAddress = associatedTokenAccount.toString()
    }

    console.info(`Transfering ${amount.toString()} wei $AUDIO to ${recipientSolanaAddress}`)

    const wAudioAmount = wAudioFromWeiAudio(amount)

    const ethAddress = this.web3Manager.getWalletAddress()
    const senderSolanaAddress = await getBankAccountAddress(
      ethAddress,
      this.claimableTokenPDAKey,
      this.solanaTokenKey
    )
    await transferWAudioBalance({
      amount: wAudioAmount,
      senderEthAddress: ethAddress,
      senderEthPrivateKey: this.web3Manager.getOwnerWalletPrivateKey(),
      senderSolanaAddress,
      recipientSolanaAddress,
      claimableTokenPDA: this.claimableTokenPDAKey,
      solanaTokenProgramKey: this.solanaTokenKey,
      claimableTokenProgramKey: this.claimableTokenProgramKey,
      connection: this.connection,
      identityService: this.identityService
    })
  }
/**
   * Transfers audio from the web3 provider's eth address
   * @param {string} recipientSolanaAddress
   *  Recipient solana address which is either a user bank, wAudio token account,
   *  or a solana account. In the last case, an associated token account is created
   *  if one does not already exist for the solana account
   * @param {BN} amount the amount of $AUDIO to send in wei units of $AUDIO.
   * **IMPORTANT NOTE**
   * wAudio (Solana) does not support 10^-18 (wei) units of $AUDIO. The smallest
   * demarcation on that side is 10^-9, so the $AUDIO amount must be >= 10^9 and have no
   * remainder after a division with 10^9 or this method will throw.
   *
   * Generally speaking, callers into the solanaWeb3Manager should use BN.js representation
   * of wei $AUDIO for all method calls
   */
Transfers audio from the web3 provider's eth address
@param {string} recipientSolanaAddress
Recipient solana address which is either a user bank, wAudio token account,
or a solana account. In the last case, an associated token account is created
if one does not already exist for the solana account
@param {BN} amount the amount of $AUDIO to send in wei units of $AUDIO.
IMPORTANT NOTE
wAudio (Solana) does not support 10^-18 (wei) units of $AUDIO. The smallest
demarcation on that side is 10^-9, so the $AUDIO amount must be >= 10^9 and have no
remainder after a division with 10^9 or this method will throw.

Generally speaking, callers into the solanaWeb3Manager should use BN.js representation
of wei $AUDIO for all method calls
Transfers audio from the web3 provider ' s eth address @param { string } recipientSolanaAddress Recipient solana address which is either a user bank wAudio token account or a solana account . In the last case an associated token account is created if one does not already exist for the solana account @param { BN } amount the amount of $AUDIO to send in wei units of $AUDIO . IMPORTANT NOTE wAudio ( Solana ) does not support 10^ - 18 ( wei ) units of $AUDIO . The smallest demarcation on that side is 10^ - 9 so the $AUDIO amount must be > = 10^9 and have no remainder after a division with 10^9 or this method will throw . Generally speaking callers into the solanaWeb3Manager should use BN . js representation of wei $AUDIO for all method calls
async transferWAudio (recipientSolanaAddress, amount) {
    let tokenAccountInfo = await this.getAssociatedTokenAccountInfo(recipientSolanaAddress)
    if (!tokenAccountInfo) {
      console.info('Provided recipient solana address was not a token account')
      const associatedTokenAccount = await this.findAssociatedTokenAddress(recipientSolanaAddress)
      tokenAccountInfo = await this.getAssociatedTokenAccountInfo(associatedTokenAccount.toString())
      if (!tokenAccountInfo) {
        console.info('Provided recipient solana address has no associated token account, creating')
        await this.createAssociatedTokenAccount(recipientSolanaAddress)
      }
      recipientSolanaAddress = associatedTokenAccount.toString()
    }
    console.info(`Transfering ${amount.toString()} wei $AUDIO to ${recipientSolanaAddress}`)
    const wAudioAmount = wAudioFromWeiAudio(amount)
    const ethAddress = this.web3Manager.getWalletAddress()
    const senderSolanaAddress = await getBankAccountAddress(
      ethAddress,
      this.claimableTokenPDAKey,
      this.solanaTokenKey
    )
    await transferWAudioBalance({
      amount: wAudioAmount,
      senderEthAddress: ethAddress,
      senderEthPrivateKey: this.web3Manager.getOwnerWalletPrivateKey(),
      senderSolanaAddress,
      recipientSolanaAddress,
      claimableTokenPDA: this.claimableTokenPDAKey,
      solanaTokenProgramKey: this.solanaTokenKey,
      claimableTokenProgramKey: this.claimableTokenProgramKey,
      connection: this.connection,
      identityService: this.identityService
    })
  }
async transferWAudio ( recipientSolanaAddress , amount ) { let tokenAccountInfo = await this . getAssociatedTokenAccountInfo ( recipientSolanaAddress ) if ( ! tokenAccountInfo ) { console . info ( 'Provided recipient solana address was not a token account' ) const associatedTokenAccount = await this . findAssociatedTokenAddress ( recipientSolanaAddress ) tokenAccountInfo = await this . getAssociatedTokenAccountInfo ( associatedTokenAccount . toString ( ) ) if ( ! tokenAccountInfo ) { console . info ( 'Provided recipient solana address has no associated token account, creating' ) await this . createAssociatedTokenAccount ( recipientSolanaAddress ) } recipientSolanaAddress = associatedTokenAccount . toString ( ) } console . info ( ` ${ amount . toString ( ) } ${ recipientSolanaAddress } ` ) const wAudioAmount = wAudioFromWeiAudio ( amount ) const ethAddress = this . web3Manager . getWalletAddress ( ) const senderSolanaAddress = await getBankAccountAddress ( ethAddress , this . claimableTokenPDAKey , this . solanaTokenKey ) await transferWAudioBalance ( { amount : wAudioAmount , senderEthAddress : ethAddress , senderEthPrivateKey : this . web3Manager . getOwnerWalletPrivateKey ( ) , senderSolanaAddress , recipientSolanaAddress , claimableTokenPDA : this . claimableTokenPDAKey , solanaTokenProgramKey : this . solanaTokenKey , claimableTokenProgramKey : this . claimableTokenProgramKey , connection : this . connection , identityService : this . identityService } ) }
Transfers audio from the web3 provider's eth address
 @param {string} recipientSolanaAddress
  Recipient solana address which is either a user bank, wAudio token account,
  or a solana account.
Transfers audio from the web3 provider ' s eth address @param { string } recipientSolanaAddress Recipient solana address which is either a user bank wAudio token account or a solana account .
// Check if the solana address is a token account // If not, check to see if it already has an associated token account. // If it's not a valid token account, we need to make one first