Skip to content

Commit

Permalink
Creating transfer fees function
Browse files Browse the repository at this point in the history
  • Loading branch information
jamiehewitt15 committed Aug 21, 2024
1 parent bb00a17 commit 1986c5b
Show file tree
Hide file tree
Showing 9 changed files with 161 additions and 5 deletions.
154 changes: 154 additions & 0 deletions dashboard/src/components/Admin/TransferFees.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import React, { useState } from 'react'
import { TextField, Button, Alert, Snackbar } from '@mui/material'
import { useAdminContext } from '@context/AdminProvider'
import { CommandStatus, JobStatus } from '@/shared/types/JobTypes'
import { checkJobPool, getSeverityFromStatus, isJobDone } from '@/shared/utils/jobs'
import JobStatusPanel from '../JobStatusPanel'
import styles from './index.module.css'

export default function TransferFees() {
const [showChainInput, setShowChainInput] = useState(false)
const [isLoading, setLoading] = useState(false)
const [chainId, setChainId] = useState<string>('')
const [tokenAddress, setTokenAddress] = useState<string>('')
const [tokenAmount, setTokenAmount] = useState<string>('')
const [destinationAddress, setDestinationAddress] = useState<string>('')
const { signature, expiryTimestamp } = useAdminContext()
const [severity, setSeverity] = useState<any>('info')
const [job, setJob] = useState<JobStatus | null>(null)
const [error, setError] = useState<string | null>(null)
const [snackbarOpen, setSnackbarOpen] = useState(false)

let intervalId: any = null

const validateInputs = () => {
if (!chainId || !tokenAddress || !tokenAmount || !destinationAddress) {
setError('All fields are required.')
return false
}
if (isNaN(Number(tokenAmount))) {
setError('Token amount must be a number.')
return false
}
setError(null)
return true
}

async function transferFees() {
if (!validateInputs()) return

setLoading(true)
try {
const apiUrl = '/directCommand'
const response = await fetch(apiUrl, {
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
},
method: 'POST',
body: JSON.stringify({
command: 'collectFees',
chainId,
tokenAddress,
tokenAmount,
destinationAddress,
expiryTimestamp,
signature
})
})

if (response.status === 200) {
const jobData = await response.json()
setSeverity(jobData.status === CommandStatus.DELIVERED ? 'info' : 'error')
setJob(jobData)
setSnackbarOpen(true)

let done = false
intervalId = setInterval(async () => {
const statusJob = await checkJobPool(jobData.jobId)
if (statusJob.length === 1) {
const job = statusJob[0]
setSeverity(getSeverityFromStatus(job.status))
done = isJobDone(job.status)
setJob(job)
} else {
setJob(null)
}
}, 3000)
if (done && intervalId) {
clearInterval(intervalId)
}
setShowChainInput(false)
} else {
setError('Error transferring fees. Please try again.')
}
} catch (error) {
console.error('error', error)
setError('Error transferring fees. Please try again.')
} finally {
setLoading(false)
}
}

return (
<div className={styles.column}>
<Button variant="contained" onClick={() => setShowChainInput(!showChainInput)}>
Transfer Fees
</Button>

{showChainInput && (
<div className={styles.filters}>
<TextField
label="Chain ID"
value={chainId}
onChange={(e) => setChainId(e.target.value)}
fullWidth
margin="normal"
variant="outlined"
/>
<TextField
label="Token Address"
value={tokenAddress}
onChange={(e) => setTokenAddress(e.target.value)}
fullWidth
margin="normal"
variant="outlined"
/>
<TextField
label="Token Amount"
value={tokenAmount}
onChange={(e) => setTokenAmount(e.target.value)}
fullWidth
margin="normal"
variant="outlined"
/>
<TextField
label="Destination Address"
value={destinationAddress}
onChange={(e) => setDestinationAddress(e.target.value)}
fullWidth
margin="normal"
variant="outlined"
/>
{error && <Alert severity="error">{error}</Alert>}
<Button
type="button"
onClick={transferFees}
variant="outlined"
disabled={isLoading}
fullWidth
>
Transfer Fees
</Button>
</div>
)}
<JobStatusPanel job={job} severity={severity} />
<Snackbar
open={snackbarOpen}
autoHideDuration={6000}
onClose={() => setSnackbarOpen(false)}
message="Fees successfully transferred!"
/>
</div>
)
}
2 changes: 2 additions & 0 deletions dashboard/src/components/Admin/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { ConnectButton } from '@rainbow-me/rainbowkit'
import Stack from '@mui/material/Stack'
import ReIndexChain from './ReindexChain'
import ReIndexTransaction from './ReindexTransaction'
import TransferFees from './TransferFees'

export default function AdminActions() {
const { generateSignature, signature, validTimestamp, admin } = useAdminContext()
Expand All @@ -31,6 +32,7 @@ export default function AdminActions() {
<DownloadLogs />
<ReIndexChain />
<ReIndexTransaction />
<TransferFees />
<StopNode />
</Stack>
)}
Expand Down
2 changes: 1 addition & 1 deletion dist/dashboard/404.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>404: This page could not be found</title><meta name="next-head-count" content="3"/><link rel="preload" href="/_next/static/css/28e16ff29a58442c.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/28e16ff29a58442c.css" crossorigin="" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" crossorigin="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-fe817b75e2ea8908.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/framework-ca706bf673a13738.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/main-66d85fc6f7952338.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_app-8a605b014f26ab32.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_error-e4216aab802f5810.js" defer="" crossorigin=""></script><script src="/_next/static/iHQ8Y5oSAlp7cdhLJAoyy/_buildManifest.js" defer="" crossorigin=""></script><script src="/_next/static/iHQ8Y5oSAlp7cdhLJAoyy/_ssgManifest.js" defer="" crossorigin=""></script></head><body><div id="__next"><div data-rk=""><style>[data-rk]{--rk-blurs-modalOverlay:blur(0px);--rk-fonts-body:SFRounded, ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--rk-radii-actionButton:9999px;--rk-radii-connectButton:12px;--rk-radii-menuButton:12px;--rk-radii-modal:24px;--rk-radii-modalMobile:28px;--rk-colors-accentColor:#0E76FD;--rk-colors-accentColorForeground:#FFF;--rk-colors-actionButtonBorder:rgba(0, 0, 0, 0.04);--rk-colors-actionButtonBorderMobile:rgba(0, 0, 0, 0.06);--rk-colors-actionButtonSecondaryBackground:rgba(0, 0, 0, 0.06);--rk-colors-closeButton:rgba(60, 66, 66, 0.8);--rk-colors-closeButtonBackground:rgba(0, 0, 0, 0.06);--rk-colors-connectButtonBackground:#FFF;--rk-colors-connectButtonBackgroundError:#FF494A;--rk-colors-connectButtonInnerBackground:linear-gradient(0deg, rgba(0, 0, 0, 0.03), rgba(0, 0, 0, 0.06));--rk-colors-connectButtonText:#25292E;--rk-colors-connectButtonTextError:#FFF;--rk-colors-connectionIndicator:#30E000;--rk-colors-downloadBottomCardBackground:linear-gradient(126deg, rgba(255, 255, 255, 0) 9.49%, rgba(171, 171, 171, 0.04) 71.04%), #FFFFFF;--rk-colors-downloadTopCardBackground:linear-gradient(126deg, rgba(171, 171, 171, 0.2) 9.49%, rgba(255, 255, 255, 0) 71.04%), #FFFFFF;--rk-colors-error:#FF494A;--rk-colors-generalBorder:rgba(0, 0, 0, 0.06);--rk-colors-generalBorderDim:rgba(0, 0, 0, 0.03);--rk-colors-menuItemBackground:rgba(60, 66, 66, 0.1);--rk-colors-modalBackdrop:rgba(0, 0, 0, 0.3);--rk-colors-modalBackground:#FFF;--rk-colors-modalBorder:transparent;--rk-colors-modalText:#25292E;--rk-colors-modalTextDim:rgba(60, 66, 66, 0.3);--rk-colors-modalTextSecondary:rgba(60, 66, 66, 0.6);--rk-colors-profileAction:#FFF;--rk-colors-profileActionHover:rgba(255, 255, 255, 0.5);--rk-colors-profileForeground:rgba(60, 66, 66, 0.06);--rk-colors-selectedOptionBorder:rgba(60, 66, 66, 0.1);--rk-colors-standby:#FFD641;--rk-shadows-connectButton:0px 4px 12px rgba(0, 0, 0, 0.1);--rk-shadows-dialog:0px 8px 32px rgba(0, 0, 0, 0.32);--rk-shadows-profileDetailsAction:0px 2px 6px rgba(37, 41, 46, 0.04);--rk-shadows-selectedOption:0px 2px 6px rgba(0, 0, 0, 0.24);--rk-shadows-selectedWallet:0px 2px 6px rgba(0, 0, 0, 0.12);--rk-shadows-walletLogo:0px 2px 16px rgba(0, 0, 0, 0.16);}</style><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"iHQ8Y5oSAlp7cdhLJAoyy","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>404: This page could not be found</title><meta name="next-head-count" content="3"/><link rel="preload" href="/_next/static/css/28e16ff29a58442c.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/28e16ff29a58442c.css" crossorigin="" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" crossorigin="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/_next/static/chunks/webpack-fe817b75e2ea8908.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/framework-ca706bf673a13738.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/main-66d85fc6f7952338.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_app-8a605b014f26ab32.js" defer="" crossorigin=""></script><script src="/_next/static/chunks/pages/_error-e4216aab802f5810.js" defer="" crossorigin=""></script><script src="/_next/static/1jjFxr_jnHtItT5FU8R8S/_buildManifest.js" defer="" crossorigin=""></script><script src="/_next/static/1jjFxr_jnHtItT5FU8R8S/_ssgManifest.js" defer="" crossorigin=""></script></head><body><div id="__next"><div data-rk=""><style>[data-rk]{--rk-blurs-modalOverlay:blur(0px);--rk-fonts-body:SFRounded, ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--rk-radii-actionButton:9999px;--rk-radii-connectButton:12px;--rk-radii-menuButton:12px;--rk-radii-modal:24px;--rk-radii-modalMobile:28px;--rk-colors-accentColor:#0E76FD;--rk-colors-accentColorForeground:#FFF;--rk-colors-actionButtonBorder:rgba(0, 0, 0, 0.04);--rk-colors-actionButtonBorderMobile:rgba(0, 0, 0, 0.06);--rk-colors-actionButtonSecondaryBackground:rgba(0, 0, 0, 0.06);--rk-colors-closeButton:rgba(60, 66, 66, 0.8);--rk-colors-closeButtonBackground:rgba(0, 0, 0, 0.06);--rk-colors-connectButtonBackground:#FFF;--rk-colors-connectButtonBackgroundError:#FF494A;--rk-colors-connectButtonInnerBackground:linear-gradient(0deg, rgba(0, 0, 0, 0.03), rgba(0, 0, 0, 0.06));--rk-colors-connectButtonText:#25292E;--rk-colors-connectButtonTextError:#FFF;--rk-colors-connectionIndicator:#30E000;--rk-colors-downloadBottomCardBackground:linear-gradient(126deg, rgba(255, 255, 255, 0) 9.49%, rgba(171, 171, 171, 0.04) 71.04%), #FFFFFF;--rk-colors-downloadTopCardBackground:linear-gradient(126deg, rgba(171, 171, 171, 0.2) 9.49%, rgba(255, 255, 255, 0) 71.04%), #FFFFFF;--rk-colors-error:#FF494A;--rk-colors-generalBorder:rgba(0, 0, 0, 0.06);--rk-colors-generalBorderDim:rgba(0, 0, 0, 0.03);--rk-colors-menuItemBackground:rgba(60, 66, 66, 0.1);--rk-colors-modalBackdrop:rgba(0, 0, 0, 0.3);--rk-colors-modalBackground:#FFF;--rk-colors-modalBorder:transparent;--rk-colors-modalText:#25292E;--rk-colors-modalTextDim:rgba(60, 66, 66, 0.3);--rk-colors-modalTextSecondary:rgba(60, 66, 66, 0.6);--rk-colors-profileAction:#FFF;--rk-colors-profileActionHover:rgba(255, 255, 255, 0.5);--rk-colors-profileForeground:rgba(60, 66, 66, 0.06);--rk-colors-selectedOptionBorder:rgba(60, 66, 66, 0.1);--rk-colors-standby:#FFD641;--rk-shadows-connectButton:0px 4px 12px rgba(0, 0, 0, 0.1);--rk-shadows-dialog:0px 8px 32px rgba(0, 0, 0, 0.32);--rk-shadows-profileDetailsAction:0px 2px 6px rgba(37, 41, 46, 0.04);--rk-shadows-selectedOption:0px 2px 6px rgba(0, 0, 0, 0.24);--rk-shadows-selectedWallet:0px 2px 6px rgba(0, 0, 0, 0.12);--rk-shadows-walletLogo:0px 2px 16px rgba(0, 0, 0, 0.16);}</style><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">This page could not be found<!-- -->.</h2></div></div></div></div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"1jjFxr_jnHtItT5FU8R8S","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Large diffs are not rendered by default.

Loading

0 comments on commit 1986c5b

Please sign in to comment.