import { Keypair, PublicKey } from '@solana/web3.js'; import { Convergence } from '../Convergence'; import { token } from '../types/Amount'; import { Program } from '../types'; import { TransactionBuilder } from '../utils/TransactionBuilder'; import { collateralMintCache } from '@/plugins/collateralModule/cache'; import { createTokenBuilder } from '@/plugins/tokenModule/operations/createToken'; export const getOrCreateATA = async ( convergence: Convergence, mint: PublicKey, owner: PublicKey, programs?: Program[] ): Promise => { const pda = convergence.tokens().pdas().associatedTokenAccount({ mint, owner, programs, }); const account = await convergence.rpc().getAccount(pda); const ata = account.exists ? pda : ( await convergence.tokens().createToken({ mint, owner, }) ).token.address; return ata; }; export interface GetOrCreateATAtxBuilderReturnType { ataPubKey: PublicKey; txBuilder?: TransactionBuilder; } export const getOrCreateATAtxBuilder = async ( convergence: Convergence, mint: PublicKey, owner: PublicKey, programs?: Program[] ): Promise => { const pda = convergence.tokens().pdas().associatedTokenAccount({ mint, owner, programs, }); const account = await convergence.rpc().getAccount(pda); if (!account.exists) { const txBuilder = await createTokenBuilder(convergence, { mint, owner, }); return { ataPubKey: pda, txBuilder }; } return { ataPubKey: pda }; }; export const devnetAirdrops = async ( cvg: Convergence, user: PublicKey, mintAuthority?: Keypair ): Promise<{ collateralWallet: any; registeredMintWallets: any[] }> => { mintAuthority = mintAuthority ?? Keypair.fromSecretKey( new Uint8Array([ 195, 171, 187, 206, 150, 223, 15, 222, 66, 189, 14, 34, 241, 1, 26, 95, 251, 154, 99, 221, 244, 134, 82, 234, 114, 163, 221, 151, 53, 171, 209, 189, 41, 58, 183, 52, 123, 23, 211, 220, 156, 60, 205, 23, 9, 11, 51, 252, 184, 116, 167, 109, 174, 140, 100, 91, 157, 252, 202, 152, 61, 246, 84, 87, ]) ); const collateralMint = await collateralMintCache.get(cvg); let collateralWallet; try { const { token: wallet } = await cvg .tokens() .createToken({ mint: collateralMint.address, owner: user }); collateralWallet = wallet; } catch { const address = cvg .tokens() .pdas() .associatedTokenAccount({ mint: collateralMint.address, owner: user }); collateralWallet = await cvg.tokens().findTokenByAddress({ address }); } await cvg.tokens().mint({ mintAddress: collateralMint.address, amount: token(1_000_000, collateralMint.decimals), toToken: collateralWallet.address, mintAuthority, }); const registeredMintWallets = []; const registeredMints = await cvg.protocol().getRegisteredMints(); for (const index in registeredMints) { const registeredMint = registeredMints[index]; let registeredMintWallet; try { const { token: wallet } = await cvg .tokens() .createToken({ mint: registeredMint.mintAddress, owner: user }); registeredMintWallet = wallet; } catch { const address = cvg.tokens().pdas().associatedTokenAccount({ mint: registeredMint.mintAddress, owner: user, }); registeredMintWallet = await cvg.tokens().findTokenByAddress({ address }); } registeredMintWallets.push(registeredMintWallet); await cvg.tokens().mint({ mintAddress: registeredMint.mintAddress, amount: token(1_000_000, registeredMint.decimals), toToken: registeredMintWallet.address, mintAuthority, }); } return { collateralWallet, registeredMintWallets, }; };