106 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# Distribute Solana tokens
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A user may want to make payments to multiple accounts over multiple iterations.
							 | 
						||
| 
								 | 
							
								The user will have a spreadsheet listing public keys and token amounts, and
							 | 
						||
| 
								 | 
							
								some process for transferring tokens to them, and ensuring that no more than the
							 | 
						||
| 
								 | 
							
								expected amount are sent. The command-line tool here automates that process.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Distribute tokens
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Send tokens to the recipients in `<BIDS_CSV>`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example bids.csv:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```text
							 | 
						||
| 
								 | 
							
								primary_address,bid_amount_dollars
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv,6.6
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								solana-tokens distribute-tokens --from <KEYPAIR> --dollars-per-sol <NUMBER> --from-bids --input-csv <BIDS_CSV> --fee-payer <KEYPAIR>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example transaction log before:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```text
							 | 
						||
| 
								 | 
							
								recipient,amount,signature
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv,30,1111111111111111111111111111111111111111111111111111111111111111
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Send tokens to the recipients in `<BIDS_CSV>` if the distribution is
							 | 
						||
| 
								 | 
							
								not already recordered in the transaction log.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								solana-tokens distribute-tokens --from <KEYPAIR> --dollars-per-sol <NUMBER> --from-bids --input-csv <BIDS_CSV> --fee-payer <KEYPAIR>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example output:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```text
							 | 
						||
| 
								 | 
							
								Recipient                                     Amount
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv  70
							 | 
						||
| 
								 | 
							
								3ihfUy1n9gaqihM5bJCiTAGLgWc5zo3DqVUS6T736NLM  42
							 | 
						||
| 
								 | 
							
								UKUcTXgbeTYh65RaVV5gSf6xBHevqHvAXMo3e8Q6np8k  43
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example transaction log after:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								solana-tokens transaction-log --output-path transactions.csv
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```text
							 | 
						||
| 
								 | 
							
								recipient,amount,signature
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv,30,1111111111111111111111111111111111111111111111111111111111111111
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv,70,1111111111111111111111111111111111111111111111111111111111111111
							 | 
						||
| 
								 | 
							
								3ihfUy1n9gaqihM5bJCiTAGLgWc5zo3DqVUS6T736NLM,42,1111111111111111111111111111111111111111111111111111111111111111
							 | 
						||
| 
								 | 
							
								UKUcTXgbeTYh65RaVV5gSf6xBHevqHvAXMo3e8Q6np8k,43,1111111111111111111111111111111111111111111111111111111111111111
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Calculate what tokens should be sent
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								List the differences between a list of expected distributions and the record of what
							 | 
						||
| 
								 | 
							
								transactions have already been sent.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								solana-tokens distribute-tokens --dollars-per-sol <NUMBER> --dry-run --from-bids --input-csv <BIDS_CSV>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example bids.csv:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```text
							 | 
						||
| 
								 | 
							
								primary_address,bid_amount_dollars
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv,6.6
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv,15.4
							 | 
						||
| 
								 | 
							
								3ihfUy1n9gaqihM5bJCiTAGLgWc5zo3DqVUS6T736NLM,9.24
							 | 
						||
| 
								 | 
							
								UKUcTXgbeTYh65RaVV5gSf6xBHevqHvAXMo3e8Q6np8k,9.46
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Example output:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```text
							 | 
						||
| 
								 | 
							
								Recipient                                     Amount
							 | 
						||
| 
								 | 
							
								6Vo87BaDhp4v4GHwVDhw5huhxVF8CyxSXYtkUwVHbbPv  70
							 | 
						||
| 
								 | 
							
								3ihfUy1n9gaqihM5bJCiTAGLgWc5zo3DqVUS6T736NLM  42
							 | 
						||
| 
								 | 
							
								UKUcTXgbeTYh65RaVV5gSf6xBHevqHvAXMo3e8Q6np8k  43
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Distribute stake accounts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Distributing tokens via stake accounts works similarly to how tokens are distributed. The
							 | 
						||
| 
								 | 
							
								big difference is that new stake accounts are split from existing ones. By splitting,
							 | 
						||
| 
								 | 
							
								the new accounts inherit any lockup or custodian settings of the original.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								solana-tokens distribute-stake --stake-account-address <ACCOUNT_ADDRESS> \
							 | 
						||
| 
								 | 
							
								    --input-csv <ALLOCATIONS_CSV> \
							 | 
						||
| 
								 | 
							
								    --stake-authority <KEYPAIR> --withdraw-authority <KEYPAIR> --fee-payer <KEYPAIR>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Currently, this will subtract 1 SOL from each allocation and store it the
							 | 
						||
| 
								 | 
							
								recipient address. That SOL can be used to pay transaction fees on staking
							 | 
						||
| 
								 | 
							
								operations such as delegating stake. The rest of the allocation is put in
							 | 
						||
| 
								 | 
							
								a stake account. The new stake account address is output in the transaction
							 | 
						||
| 
								 | 
							
								log.
							 |