Does creating a token account on Solana make it rent free automatically? - solana

I have create a token on the devote and have created token account which I can transfer my token to successfully. I notice that a Solana fee is taken when I do this.
I also understand that I have to deposit enough Solana into an account to pay for rent or have 2 years worth of Solana to make it exempt.
When I create the account (using the code below) is it automatically making the accounts rent exempt or do I have to transfer additional Solana to do so.
How can I do this?
Code:
const tokenAccount = await getOrCreateAssociatedTokenAccount(
connection,
payer,
mint,
payer.publicKey
)

All new accounts now require to be rent exempt cf https://docs.solana.com/developing/programming-model/accounts#rent
So any accounts initialised successfully will be rent exempt. You don't have to worry about anything

Yes, an associated token account created by this call will be rent exempt. You can see it in the associated-token-program source code.

Related

Instant sale feature in Metaplex NFTs?

I have an NFT listed in my Metaplex (instant sale). However I want to sell them in my e-commerce site and just take all the necessary information for me to display and proceed the sale there instead in metaplex. I notice in the solana explorer of my NFT, the owner now is not my wallet(which is the 2nd row) and (I think the current owner wallet is generated by metaplex once you listed it via instant sale? I am not sure please let me know). Now I want to create a sendtransaction and basing all info to this wallet address and with that I need its keypair to sign it off. Basically I want to transfer an NFT from my wallet to other wallet. My question is where do I get the keypair of this metaplex generated wallet(assuming it is from them) so I can proceed with the send transaction or do I miss something in order for the sendtransaction to work?
I assume you are using the storefront auction manager mechanism.
Auction manager takes over the ownership of the mint when listing.
It is not possible to get the KeyPair of the auction manager as this is discarded after the creation of the account.
However, your wallet will be the authority on the auction manager, which means that you can end the auction early and reclaim your NFT.
You can do that via your storefront!
Once you have the NFT back, you then send it to your other wallet and then relist from there.
PS. The upcoming Auction House (v2) framework is escrowless, meaning that in the future you will be able to list NFTs while they stay in your wallet. However for now (and if you are using the current v1 Storefront), you temporarily lose ownership of the NFTs while they are in auction.

How to transfer (using Program instructions) custom SPL token from my own account to another user's wallet?

This is my situation:
I have created a wallet
solana-keygen new
I have created my own custom SPL Token
spl-token create-token
Then I created an Account for this SPL Token
spl-token create-account
The SPL token is now in my wallet A
In the Solana Program, I would like to programmatically transfer the custom SPL token from Wallet A to Alice(user) wallet when certain conditions are met (for example, when Alice answered a quiz correctly, she will be awarded some custom SPL token).
How do I authorise the Solana Program to deduct from Wallet A (which I had created) and transfer the tokens to Alice wallet?
Please advise me how to go about doing this. Really appreciate this.
To transfer an SPL token within a program, your best option is to have wallet A owned by a program-derived address, and then your program can transfer the tokens from wallet A based on any logic it wants.
So first, transfer the ownership to your program-derived address:
spl-token authorize <WALLET_2_ADDRESS> owner <PROGRAM_DERIVED_ADDRESS>
Then in your program, you can transfer to Alice with something like:
let transfer_instruction = spl_token::instruction::transfer(
&token_program.key,
&wallet_a_token_account.key,
&alice_token_account.key,
&program_derived_account.key,
&[],
transfer_amount,
)?;
let required_accounts_for_transfer = [
wallet_a_token_account.clone(),
alice_token_account.clone(),
program_derived_account.clone(),
];
invoke_signed(
&transfer_instruction,
&required_accounts_for_transfer,
&[
&[b"your", b"seeds", b"here",]
]
)?;
This was adapted from a full example for transferring SPL tokens within a program: https://solanacookbook.com/references/programs.html#how-to-do-cross-program-invocation
More information about program-derived addresses at https://solanacookbook.com/references/programs.html#how-to-create-a-pda, with an example of how to create an account.

How to verify public address owner with crypto wallets

I am currently thinking about creating a dapp that connects to a phantom wallet on solana. A user account will be created upon connection Signup/Login a User. I'm not sure how to verify the public address. Wallets will pass information to the frontend and i would have to forward this information to the backend, thus it is manipulable and useless... How do I prevent people from sending fake addresses to the server and signing up to any account they want? I thought about signing a message but why is this not done on e.g. opensea.io(Eth/Metamask)?
How do I prevent people from sending fake addresses to the server and signing up to any account they want?
Make them sign a message.
I thought about signing a message but why is this not done on e.g. opensea.io(Eth/Metamask)?
This is not done on OpenSea because OpenSea does not create or manage user accounts for its users. The app relies entirely on the PKI of the user's Web3 provider (such as MetaMask).
Ask yourself why you need to create a user account for your users on your backend. If you need to create such an account, then make the user sign a message. If you don't need to create a user account, then just let the user authenticate directly with the blockchain using their own PKI like OpenSea does.
Why not create the Keypair (public + private key) in the backend itself? Since you're creating a new account on signup. Send a request to the backend and create account and return the public key to the user.
But instead of doing this. You can ask the user to create a new wallet and singup using something like a phantom wallet. Did that help?

solana transfer nft to any address web3js

I want to make a transfer from my wallet to another wallet with code. I use web3.js and I made a Solana transfer, but I don't know how to make an NFT transfer.
NFTs on Solana are represented as SPL tokens, which can be transferred in JS using the "#solana/spl-token" package on npm: https://www.npmjs.com/package/#solana/spl-token
There's an example of how to use it at https://github.com/solana-labs/solana-program-library/blob/master/token/js/examples/createMintAndTransferTokens.ts and in the repo tests.
You can find more information on SPL tokens at https://spl.solana.com/token
NFT transfer is same as normal spl-token transfer.
Prior to transfer NFT, you need to know its Token Mint Address or its Associated Token Account of yours.
Also need to know receiver's Associated Token Account of NFT Mint Token Account.
If receiver doesn't have associated token account, you or he need to create it first.
If you are not familiar with the account types, please read my article on medium.
https://medium.com/#blockchainlover2019/how-to-verify-ownership-of-metaplex-nft-programmatically-at-on-chain-1059418c3c6
Transferring token by using web3 is easy and not knowhow knowledge.
This is my code from Solana program (smart contract), which transfers nft from one to another.
let transfer_ix = spl_token::instruction::transfer(
token_program.key,
nft_account_to_send.key,
nft_account_to_receive.key,
&pda,
&[],
1
)?;
invoke_signed(
&transfer_ix,
&[
nft_account_to_send.clone(),
nft_account_to_receive.clone(),
pda_account.clone(),
token_program.clone(),
],
&[&[&b"nft_transfer_is_easy"[..], &[_nonce]]]
)?;
I will add another code for you, which runs on web3.

How do I create a user wallet in Stripe?

I’m trying to create a wallet for a user in Stripe. Other uses can donate into another user’s wallet and that user can withdraw the funds into their account. This account should remain untouched by the account owner and controlled by the software.
This will need to be seperate from the primary account which holds funds for subscriptions from users which the Stripe account owner can withdraw (income).
Is this possible with Stripe/Stripe Connect and can anyone point me in the right direction?
You'd indeed need to use Stripe Connect for this.
This isn't really a programming question so you likely won't find much help here. You should reach out Stripe's support directly at https://support.stripe.com/email and explain your business model with as much details as you can (who you are, who your users will be, where are you and they located, what would a sample transaction look like, etc.). They will be able to guide you and help you design your payment flow using Stripe's API.
You can create a wallet by using charge feature of stripe i.e. for nodeJs it is stripe.charges.create({}) function.
It may vary depending upon your language of choice. You can prompt the user to recharge his wallet and create a charge through which you can transfer the amount to the admin account use a parameter in your db to store the user's current wallet balance for each payment deduct the required amount from the said user's account and add it to the other user's account.
Click here for more details !
Cheers!

Resources