87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import toast from 'react-hot-toast'
 | 
						|
import state, { FaucetAccountRes } from '../index'
 | 
						|
import fetchAccountInfo from '../../utils/accountInfo';
 | 
						|
 | 
						|
export const names = [
 | 
						|
  'Alice',
 | 
						|
  'Bob',
 | 
						|
  'Carol',
 | 
						|
  'Carlos',
 | 
						|
  'Charlie',
 | 
						|
  'Dan',
 | 
						|
  'Dave',
 | 
						|
  'David',
 | 
						|
  'Faythe',
 | 
						|
  'Frank',
 | 
						|
  'Grace',
 | 
						|
  'Heidi',
 | 
						|
  'Judy',
 | 
						|
  'Olive',
 | 
						|
  'Peggy',
 | 
						|
  'Walter'
 | 
						|
]
 | 
						|
 | 
						|
/* This function adds faucet account to application global state.
 | 
						|
 * It calls the /api/faucet endpoint which in send a HTTP POST to
 | 
						|
 * https://hooks-testnet.xrpl-labs.com/newcreds and it returns
 | 
						|
 * new account with 10 000 XRP. Hooks Testnet /newcreds endpoint
 | 
						|
 * is protected with CORS so that's why we did our own endpoint
 | 
						|
 */
 | 
						|
export const addFaucetAccount = async (name?: string, showToast: boolean = false) => {
 | 
						|
  if (typeof window === undefined) return
 | 
						|
 | 
						|
  const toastId = showToast ? toast.loading('Creating account') : ''
 | 
						|
  const res = await fetch(`${window.location.origin}/api/faucet`, {
 | 
						|
    method: 'POST'
 | 
						|
  })
 | 
						|
  const json: FaucetAccountRes | { error: string } = await res.json()
 | 
						|
  if ('error' in json) {
 | 
						|
    if (!showToast) return;
 | 
						|
    return toast.error(json.error, { id: toastId })
 | 
						|
  }
 | 
						|
  const currNames = state.accounts.map(acc => acc.name)
 | 
						|
  const info = await fetchAccountInfo(json.address, { silent: true })
 | 
						|
  state.accounts.push({
 | 
						|
    name: name || names.filter(name => !currNames.includes(name))[0],
 | 
						|
    xrp: (json.xrp || 0 * 1000000).toString(),
 | 
						|
    address: json.address,
 | 
						|
    secret: json.secret,
 | 
						|
    sequence: info?.Sequence || 1,
 | 
						|
    hooks: [],
 | 
						|
    isLoading: false,
 | 
						|
    version: '2'
 | 
						|
  })
 | 
						|
  if (showToast) {
 | 
						|
    toast.success('New account created', { id: toastId })
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
  // fetch initial faucets
 | 
						|
  ; (async function fetchFaucets() {
 | 
						|
    if (typeof window !== 'undefined') {
 | 
						|
      if (state.accounts.length === 0) {
 | 
						|
        await addFaucetAccount()
 | 
						|
        // setTimeout(() => {
 | 
						|
        //   addFaucetAccount();
 | 
						|
        // }, 10000);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  })()
 | 
						|
 | 
						|
export const addFunds = async (address: string) => {
 | 
						|
  const toastId = toast.loading('Requesting funds')
 | 
						|
  const res = await fetch(`${window.location.origin}/api/faucet?account=${address}`, {
 | 
						|
    method: 'POST'
 | 
						|
  })
 | 
						|
  const json: FaucetAccountRes | { error: string } = await res.json()
 | 
						|
  if ('error' in json) {
 | 
						|
    return toast.error(json.error, { id: toastId })
 | 
						|
  } else {
 | 
						|
    toast.success(`Funds added (${json.xrp} XRP)`, { id: toastId })
 | 
						|
    const currAccount = state.accounts.find(acc => acc.address === address)
 | 
						|
    if (currAccount) {
 | 
						|
      currAccount.xrp = (Number(currAccount.xrp) + json.xrp * 1000000).toString()
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |