diff --git a/backend/moonstream/data.py b/backend/moonstream/data.py index c44a4bc6..9677b75e 100644 --- a/backend/moonstream/data.py +++ b/backend/moonstream/data.py @@ -96,8 +96,8 @@ class EthereumTransaction(BaseModel): gas: int gasPrice: int value: int - from_address: str = Field(alias="from") - to_address: Optional[str] = Field(default=None, alias="to") + from_address: str + to_address: Optional[str] hash: Optional[str] = None block_hash: Optional[str] = Field(default=None, alias="blockHash") block_number: Optional[int] = Field(default=None, alias="blockNumber") diff --git a/frontend/pages/stream/[entryId].js b/frontend/pages/stream/[entryId].js index da8a143e..947f2623 100644 --- a/frontend/pages/stream/[entryId].js +++ b/frontend/pages/stream/[entryId].js @@ -1,114 +1,58 @@ -import React from "react"; -import { Flex, HStack, Skeleton, Heading } from "@chakra-ui/react"; -//import { useTxInfo, useRouter } from "../../src/core/hooks"; -import { useRouter } from "../../src/core/hooks"; -// import FourOFour from "../../src/components/FourOFour"; -// import FourOThree from "../../src/components/FourOThree"; +import React, {useContext} from "react"; +import { Flex, HStack, Skeleton, Box, Heading, Center, Spinner } from "@chakra-ui/react"; +import { useTxInfo, useTxCashe, useRouter } from "../../src/core/hooks"; +import FourOFour from "../../src/components/FourOFour"; +import FourOThree from "../../src/components/FourOThree"; import Tags from "../../src/components/Tags"; -import Scrollable from "../../src/components/Scrollable"; -import TxInfo from "../../src/components/TxInfo"; import { getLayout } from "../../src/layouts/EntriesLayout"; +import Scrollable from "../../src/components/Scrollable"; +import TxInfo from "../../src/components/TxInfo" +import UIContext from "../../src/core/providers/UIProvider/context"; const Entry = () => { + const ui = useContext(UIContext); const router = useRouter(); const { entryId } = router.params; - /* const { + const txCache = useTxCashe; + + const callReroute = () => { + ui.setEntriesViewMode("list"); + router.push({ + pathname: `/stream`, + query: router.query, + }); + const LoadingSpinner = () => ( + +
+
+
+ ); + return ( + + ) + } + + const transaction = txCache.getCurrentTransaction() + + const { data: entry, isFetchedAfterMount, isLoading, isError, error, - } = useJournalEntry(journalId, entryId, "personal"); -*/ - const raw_transaction = { - tx: { - blockHash: - "0x2f1cb4055fa3ba8af199aeba564917999b3e661d582082e5928721c3f4ef04ca", - blockNumber: 12882164, - from: "0x52f200565581ae950c765b67f574cfc99f662657", - gas: 400000, - gasPrice: 12500000000, - hash: "0xee3d2c14cacc0e5b8085c0b1a0cbacb6ed79762220dcee0a9c19a5a25e59a331", - input: - "0x6102a8610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80636e8af2721461003a575b600080fd5b6100576004803603602081101561005057600080fd5b50356100b2565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561009d578181015183820152602001610085565b50505050905001935050505060405180910390f35b60048101546000906060908067ffffffffffffffff811180156100d457600080fd5b506040519080825280602002602001820160405280156100fe578160200160208202803683370190505b50915060005b8181101561017757600061014f670de0b6b3a764000061014688600401858154811061012c57fe5b6000918252602090912001546001600160a01b031661017e565b600f0b906101ff565b905080850194508084838151811061016357fe5b602090810291909101015250600101610104565b5050915091565b6000816001600160a01b031663ac969a73306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156101cd57600080fd5b505afa1580156101e1573d6000803e3d6000fd5b505050506040513d60208110156101f757600080fd5b505192915050565b60008161020e5750600061026c565b600083600f0b121561021f57600080fd5b600f83900b6fffffffffffffffffffffffffffffffff8316810260401c90608084901c026001600160c01b0381111561025757600080fd5b60401b811981111561026857600080fd5b0190505b9291505056fea2646970667358221220bf54788224a5a22890835d5e41e3e9622b1a055984390a38ae02a95c53dccfd864736f6c63430007030033", - nonce: 184, - r: "0xe7e8e58deccd5f277928d25f7fc66548be1a84af811db8927dd86fbd08c5acd6", - s: "0x2214b48d9ce2b80c11586ddaff5214429c99e09188f75c04b7b0d0b7536ec94c", - to: null, - transactionIndex: 76, - type: "0x0", - v: "0x25", - value: 0, - }, - }; - - let isFetchedAfterMount = false; - let isLoading = false; - let isError = false; - - const ETHER_TX = { - tx: { - gas: 400000, - gasPrice: 12500000000, - value: 0, - from: "0x52f200565581ae950c765b67f574cfc99f662657", - to: null, - hash: "0xee3d2c14cacc0e5b8085c0b1a0cbacb6ed79762220dcee0a9c19a5a25e59a331", - blockHash: - "0x2f1cb4055fa3ba8af199aeba564917999b3e661d582082e5928721c3f4ef04ca", - blockNumber: 12882164, - input: - "0x6102a8610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c80636e8af2721461003a575b600080fd5b6100576004803603602081101561005057600080fd5b50356100b2565b6040518083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561009d578181015183820152602001610085565b50505050905001935050505060405180910390f35b60048101546000906060908067ffffffffffffffff811180156100d457600080fd5b506040519080825280602002602001820160405280156100fe578160200160208202803683370190505b50915060005b8181101561017757600061014f670de0b6b3a764000061014688600401858154811061012c57fe5b6000918252602090912001546001600160a01b031661017e565b600f0b906101ff565b905080850194508084838151811061016357fe5b602090810291909101015250600101610104565b5050915091565b6000816001600160a01b031663ac969a73306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156101cd57600080fd5b505afa1580156101e1573d6000803e3d6000fd5b505050506040513d60208110156101f757600080fd5b505192915050565b60008161020e5750600061026c565b600083600f0b121561021f57600080fd5b600f83900b6fffffffffffffffffffffffffffffffff8316810260401c90608084901c026001600160c01b0381111561025757600080fd5b60401b811981111561026857600080fd5b0190505b9291505056fea2646970667358221220bf54788224a5a22890835d5e41e3e9622b1a055984390a38ae02a95c53dccfd864736f6c63430007030033", - nonce: 184, - r: "0xe7e8e58deccd5f277928d25f7fc66548be1a84af811db8927dd86fbd08c5acd6", - s: "0x2214b48d9ce2b80c11586ddaff5214429c99e09188f75c04b7b0d0b7536ec94c", - v: "0x25", - transactionIndex: 76, - type: "0x0", - }, - is_smart_contract_deployment: true, - is_smart_contract_call: false, - smart_contract_address: "0x2f7E36b386F40d01A867BaffF3F321bC01882F7f", - abi: { - functions: [ - { - hex_signature: "0x6e8af272", - text_signature_candidates: [], - type: "function", - }, - { - hex_signature: "0xac969a73", - text_signature_candidates: ["viewNumeraireBalance(address)"], - type: "function", - }, - { - hex_signature: "0xffffffff", - text_signature_candidates: ["test266151307()", "lololo()"], - type: "function", - }, - ], - events: [ - { - hex_signature: "0x123456", - text_signature_candidates: ["viewNumeraireBalance(address)"], - type: "event", - }, - { - hex_signature: "0x123436", - text_signature_candidates: [], - type: "event", - }, - ], - }, - errors: [], - }; - let entry = { - title: ETHER_TX.tx.hash, - content: "```json\n" + JSON.stringify(ETHER_TX) + "```", - }; - - // if (isError && error.response.status === 404) return ; - // if (isError && error.response.status === 403) return ; + } = useTxInfo({tx:transaction}) + + if (isError) {return callReroute()} + if (isError && error.response.status === 404) return ; + if (isError && error.response.status === 403) return ; // if (!entry || isLoading) return ""; return ( @@ -139,7 +83,7 @@ const Entry = () => { fontSize="1.5rem" textAlign="left" > - {entry?.title} + {entry && entry.hash} @@ -162,7 +106,7 @@ const Entry = () => { isLoaded={isFetchedAfterMount || entry} > - + {!isLoading && ( )} diff --git a/frontend/src/components/StreamEntry.js b/frontend/src/components/StreamEntry.js index 9851db3d..fe7710a1 100644 --- a/frontend/src/components/StreamEntry.js +++ b/frontend/src/components/StreamEntry.js @@ -14,7 +14,7 @@ import moment from "moment"; import { ArrowRightIcon } from "@chakra-ui/icons"; import { useRouter } from "../core/hooks"; import UIContext from "../core/providers/UIProvider/context"; -import { useToast } from "../core/hooks"; +import { useToast, useTxCashe } from "../core/hooks"; const StreamEntry = ({ entry, filterCallback, filterConstants }) => { const ui = useContext(UIContext); @@ -30,17 +30,18 @@ const StreamEntry = ({ entry, filterCallback, filterConstants }) => { } else if (copyString) { onCopy(); } - }, [copyString, onCopy, hasCopied, toast]); + }, [copyString, onCopy, hasCopied, toast]); const handleViewClicked = (entryId) => { ui.setEntryId(entryId); ui.setEntriesViewMode("entry"); + useTxCashe.setCurrentTransaction(entry) router.push({ - pathname: `/stream/${entry.id}`, + pathname: `/stream/${entry.hash}`, query: router.query, }); }; - + const [showFullView] = useMediaQuery(["(min-width: 420px)"]); console.log(entry); diff --git a/frontend/src/components/TxInfo.js b/frontend/src/components/TxInfo.js index 62ff2e73..7038eaf2 100644 --- a/frontend/src/components/TxInfo.js +++ b/frontend/src/components/TxInfo.js @@ -49,46 +49,49 @@ const TxABI = (props) => { ); }; const TxInfo = (props) => { - const transaction = props.transaction; - const dont_display = (key) => { - return !["input"].includes(key); - }; - return ( - - - - Value - {transaction.tx.value} - amount of ETH to transfer in WEI - - - Gas - {transaction.tx.gas} - gas limit for transaction - - - Gas price - {transaction.tx.gasPrice} - the fee the sender pays per unit of gas - - - - - - {Object.keys(transaction.tx) - .filter(dont_display) - .map((key) => ( - - - - - ))} - -
{key}{transaction.tx[key]}
- {transaction.abi && ( - - )} -
- ); -}; + const transaction = props.transaction; + const dont_display = (key) => { + return !["input"].includes(key) + } + return ( + + + + Value + {transaction.tx.value} + amount of ETH to transfer in WEI + + + Gas + {transaction.tx.gas} + gas limit for transaction + + + Gas price + {transaction.tx.gasPrice} + the fee the sender pays per unit of gas + + + + + + {Object.keys(transaction.tx).filter(dont_display).map((key) => ( + (transaction.tx[key] != undefined && + + + ) + ))} + +
{key}{transaction.tx[key]}
+ {transaction.tx.input && transaction.tx.input !== "0x" && + + } +
+ + + ) +} export default TxInfo; diff --git a/frontend/src/core/hooks/index.js b/frontend/src/core/hooks/index.js index 328a74da..a228a75f 100644 --- a/frontend/src/core/hooks/index.js +++ b/frontend/src/core/hooks/index.js @@ -20,4 +20,5 @@ export { default as useStripe } from "./useStripe"; export { default as useSubscriptions } from "./useSubscriptions"; export { default as useToast } from "./useToast"; export { default as useTxInfo } from "./useTxInfo"; +export { default as useTxCashe } from "./useTxCache" export { default as useUser } from "./useUser"; diff --git a/frontend/src/core/hooks/useTxCache.js b/frontend/src/core/hooks/useTxCache.js new file mode 100644 index 00000000..b015ee78 --- /dev/null +++ b/frontend/src/core/hooks/useTxCache.js @@ -0,0 +1,7 @@ +class TxCashe { + currentTransaction = undefined + getCurrentTransaction(){return this.currentTransaction} + setCurrentTransaction(transaction){ this.currentTransaction = transaction} +} +const useTxCashe = new TxCashe(); +export default useTxCashe; \ No newline at end of file diff --git a/frontend/src/core/hooks/useTxInfo.js b/frontend/src/core/hooks/useTxInfo.js index ac6b1719..745a92ad 100644 --- a/frontend/src/core/hooks/useTxInfo.js +++ b/frontend/src/core/hooks/useTxInfo.js @@ -4,14 +4,14 @@ import { queryCacheProps } from "./hookCommon"; import { useToast } from "."; const useTxInfo = (transaction) => { - console.log("Use hook", transaction); - const toast = useToast(); - const getTxInfo = async () => { - const response = await TxInfoService.getTxInfo(transaction); - return response.data; - }; - const { data, isLoading, isFetchedAfterMount, refetch, isError, error } = - useQuery(["txinfo", transaction.tx.hash], getTxInfo, { + if (!transaction.tx) return {data: "undefined", isLoading: false, isFetchedAfterMount: true, refetch: false, isError: true, error: "undefined"} + const toast = useToast(); + const getTxInfo = async () => { + const response = await TxInfoService.getTxInfo(transaction); + return response.data; + } + const { data, isLoading, isFetchedAfterMount, refetch, isError, error } = + useQuery(["txinfo", transaction.tx.hash ], getTxInfo, { ...queryCacheProps, onError: (error) => toast(error, "error"), });