From eef34853687cfb92b8e8cfa86019ccdc95734b74 Mon Sep 17 00:00:00 2001 From: fabiolalombardim <37227394+fabiolalombardim@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:04:52 +0200 Subject: [PATCH 1/3] All Homebase modals updated (#593) * modals updated * current delegate added --- src/modules/common/MainButton.tsx | 1 + src/modules/common/SmallButton.tsx | 1 + src/modules/explorer/components/BatchBar.tsx | 22 +-- .../components/ConfigProposalForm.tsx | 132 +++++++++++++----- .../DelegationChangeProposalForm.tsx | 71 ++++++++-- .../components/GuardianChangeProposalForm.tsx | 96 ++++++++++--- .../components/NewTreasuryProposalDialog.tsx | 16 +-- .../explorer/components/ProposalForm.tsx | 48 +++---- .../explorer/components/ProposalFormInput.tsx | 2 +- .../components/ProposalFormSendButton.tsx | 5 +- .../explorer/components/ResponsiveDialog.tsx | 16 ++- src/modules/explorer/pages/DAOList/index.tsx | 5 - .../explorer/pages/Proposals/index.tsx | 4 - src/theme/index.ts | 3 +- 14 files changed, 294 insertions(+), 128 deletions(-) diff --git a/src/modules/common/MainButton.tsx b/src/modules/common/MainButton.tsx index c22aed76..7c195a97 100644 --- a/src/modules/common/MainButton.tsx +++ b/src/modules/common/MainButton.tsx @@ -7,6 +7,7 @@ export const MainButton = styled(Button)(({ theme }) => ({ "transition": ".15s ease-in", "background": theme.palette.secondary.main, "textTransform": "none", + "borderRadius": 8, "&$disabled": { boxShadow: "none" diff --git a/src/modules/common/SmallButton.tsx b/src/modules/common/SmallButton.tsx index 29a66d65..39d060bb 100644 --- a/src/modules/common/SmallButton.tsx +++ b/src/modules/common/SmallButton.tsx @@ -6,6 +6,7 @@ export const SmallButton = styled(Button)({ "boxShadow": "0px 0px 7px -2px rgba(0, 0, 0, 0.2)", "transition": ".15s ease-out", "textTransform": "capitalize", + "borderRadius": 8, "&$disabled": { boxShadow: "none" diff --git a/src/modules/explorer/components/BatchBar.tsx b/src/modules/explorer/components/BatchBar.tsx index e6ca4519..ad03453a 100644 --- a/src/modules/explorer/components/BatchBar.tsx +++ b/src/modules/explorer/components/BatchBar.tsx @@ -45,13 +45,13 @@ const AddButton = styled(Paper)({ "minWidth": 31, "textAlign": "center", "padding": 0, - "background": "#383e43", - "color": "#fff", + "background": "inherit", + "color": "rgb(129, 254, 183)", "alignItems": "center", "display": "flex", "justifyContent": "center", "cursor": "pointer", - + "boxShadow": "none", "&:hover": { background: "#3c4349" } @@ -69,10 +69,10 @@ interface Props { export const BatchBar = ({ isBatch, handleIsBatchChange, onClickAdd, items, activeItem, setActiveItem }: Props) => { return ( - + - + Batch Transfer? @@ -90,13 +90,17 @@ export const BatchBar = ({ isBatch, handleIsBatchChange, onClickAdd, items, acti item key={index} onClick={() => setActiveItem(index)} - style={Number(index + 1) === activeItem ? { background: "#81FEB7" } : { background: "#3c4349" }} + style={Number(index + 1) === activeItem ? { background: "#81FEB7" } : { background: "inherit" }} > - #{index + 1} + {index + 1} ) @@ -105,6 +109,6 @@ export const BatchBar = ({ isBatch, handleIsBatchChange, onClickAdd, items, acti + ) : null} - + ) } diff --git a/src/modules/explorer/components/ConfigProposalForm.tsx b/src/modules/explorer/components/ConfigProposalForm.tsx index cedc6b7d..28436398 100644 --- a/src/modules/explorer/components/ConfigProposalForm.tsx +++ b/src/modules/explorer/components/ConfigProposalForm.tsx @@ -1,5 +1,5 @@ /* eslint-disable react/display-name */ -import { Grid, Typography, TextField } from "@material-ui/core" +import { Grid, Typography, TextField, styled } from "@material-ui/core" import React, { useCallback } from "react" import { useDAO } from "services/services/dao/hooks/useDAO" import { SendButton } from "./ProposalFormSendButton" @@ -8,6 +8,13 @@ import { useDAOID } from "../pages/DAO/router" import { ProposalFormInput } from "./ProposalFormInput" import { useProposeConfigChange } from "../../../services/contracts/baseDAO/hooks/useProposeConfigChange" import { ResponsiveDialog } from "./ResponsiveDialog" +import * as yup from "yup" +import { yupResolver } from "@hookform/resolvers/yup" + +const ErrorText = styled(Typography)({ + fontSize: 14, + color: "red" +}) type RecursivePartial = { [P in keyof T]?: RecursivePartial @@ -27,16 +34,24 @@ interface Props { defaultTab?: number } -// const validationSchema: Yup.SchemaOf = Yup.object({ -// frozen_extra_value: Yup.number().required("Required"), -// slash_scale_value: Yup.number().min(0, "Cannot be lesser than 0").max(100, "Cannot be greater than 100") -// }); +const validationSchema = yup.object({ + frozen_extra_value: yup.number().typeError("Amount must be a number"), + returnedPercentage: yup + .number() + .min(0, "Cannot be lesser than 0") + .max(100, "Cannot be greater than 100") + .typeError("Amount must be a number") +}) export const ConfigProposalForm: React.FC = ({ open, handleClose }) => { const daoId = useDAOID() const { data: dao } = useDAO(daoId) - const methods = useForm() + const methods = useForm({ resolver: yupResolver(validationSchema) }) + + const { + formState: { errors } + } = methods const { mutate } = useProposeConfigChange() @@ -64,69 +79,112 @@ export const ConfigProposalForm: React.FC = ({ open, handleClose }) => { handleClose() } }, - [dao, handleClose, methods, mutate] + [dao, mutate, methods, handleClose] ) return ( - + All fields are optional. Leave empty what you wish to leave unchanged - - + {/* + ( )} /> + */} + + + ( + + )} + /> + + + + Current:{" "} + + + {dao && dao?.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} + + - {/* */} - + ( - + )} /> + {errors.returnedPercentage?.message} + + + Current:{" "} + + + {dao && dao?.data.extra.returnedPercentage.toString()}% + + - - - Proposal Fee:{" "} - - - {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} - + + + + Proposal Fee:{" "} + + + {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} + + + + + Submit + + - - - Submit - diff --git a/src/modules/explorer/components/DelegationChangeProposalForm.tsx b/src/modules/explorer/components/DelegationChangeProposalForm.tsx index 45099290..1f4a2965 100644 --- a/src/modules/explorer/components/DelegationChangeProposalForm.tsx +++ b/src/modules/explorer/components/DelegationChangeProposalForm.tsx @@ -9,6 +9,15 @@ import { useDAOID } from "../pages/DAO/router" import { ProposalFormInput } from "./ProposalFormInput" import { ResponsiveDialog } from "./ResponsiveDialog" import { useProposeDelegationChange } from "services/contracts/baseDAO/hooks/useProposeDelegationChange" +import * as yup from "yup" +import { yupResolver } from "@hookform/resolvers/yup" +import { validateContractAddress, validateAddress } from "@taquito/utils" +import { useDelegate } from "services/contracts/baseDAO/hooks/useDelegate" + +const ErrorText = styled(Typography)({ + fontSize: 14, + color: "red" +}) type RecursivePartial = { [P in keyof T]?: RecursivePartial @@ -31,10 +40,24 @@ const Content = styled(Grid)({ padding: "10px 0" }) +const isInvalidKtOrTzAddress = (address: string | undefined) => { + if (address !== undefined) { + return validateContractAddress(address) !== 3 && validateAddress(address) !== 3 ? false : true + } + return false +} + +const validationSchema = yup.object({ + newDelegationAddress: yup + .string() + .test("is-valid-address", "Must be a valid address", value => isInvalidKtOrTzAddress(value)) +}) + export const DelegationChangeProposalForm: React.FC = ({ open, handleClose, defaultValues }) => { const daoId = useDAOID() const { data: dao } = useDAO(daoId) + const currentDelegate = useDelegate(dao && dao?.data.address ? dao?.data.address : "") const methods = useForm({ defaultValues: useMemo( () => ({ @@ -42,10 +65,14 @@ export const DelegationChangeProposalForm: React.FC = ({ open, handleClos ...defaultValues }), [defaultValues] - ) - // resolver: yupResolver(validationSchema as any), + ), + resolver: yupResolver(validationSchema) }) + const { + formState: { errors } + } = methods + const newDelegationAddress = methods.watch("newDelegationAddress") useEffect(() => { @@ -74,6 +101,19 @@ export const DelegationChangeProposalForm: React.FC = ({ open, handleClos title={"Change Delegate"} > + {dao && ( + + + Current Delegate:{" "} + + + {currentDelegate && currentDelegate.data && currentDelegate.data.address + ? currentDelegate.data.address + : "-"} + + + )} + = ({ open, handleClos )} /> + {errors.newDelegationAddress?.message} - - - Proposal Fee:{" "} - - - {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} - - + + + + Proposal Fee:{" "} + + + {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} + + - - Submit - + + + Submit + + + diff --git a/src/modules/explorer/components/GuardianChangeProposalForm.tsx b/src/modules/explorer/components/GuardianChangeProposalForm.tsx index 86cb69f0..10f092c2 100644 --- a/src/modules/explorer/components/GuardianChangeProposalForm.tsx +++ b/src/modules/explorer/components/GuardianChangeProposalForm.tsx @@ -8,6 +8,14 @@ import { useDAOID } from "../pages/DAO/router" import { ProposalFormInput } from "./ProposalFormInput" import { useProposeGuardianChange } from "../../../services/contracts/baseDAO/hooks/useProposeGuardianChange" import { ResponsiveDialog } from "./ResponsiveDialog" +import * as yup from "yup" +import { yupResolver } from "@hookform/resolvers/yup" +import { validateContractAddress, validateAddress } from "@taquito/utils" + +const ErrorText = styled(Typography)({ + fontSize: 14, + color: "red" +}) type RecursivePartial = { [P in keyof T]?: RecursivePartial @@ -28,6 +36,19 @@ interface Props { const Content = styled(Grid)({}) +const isInvalidKtOrTzAddress = (address: string | undefined) => { + if (address !== undefined) { + return validateContractAddress(address) !== 3 && validateAddress(address) !== 3 ? false : true + } + return false +} + +const validationSchema = yup.object({ + newGuardianAddress: yup + .string() + .test("is-valid-address", "Must be a valid address", value => isInvalidKtOrTzAddress(value)) +}) + export const GuardianChangeProposalForm: React.FC = ({ open, handleClose, defaultValues }) => { const daoId = useDAOID() const { data: dao } = useDAO(daoId) @@ -39,10 +60,14 @@ export const GuardianChangeProposalForm: React.FC = ({ open, handleClose, ...defaultValues }), [defaultValues] - ) - // resolver: yupResolver(validationSchema as any), + ), + resolver: yupResolver(validationSchema) }) + const { + formState: { errors } + } = methods + const newGuardianAddress = methods.watch("newGuardianAddress") useEffect(() => { @@ -68,17 +93,35 @@ export const GuardianChangeProposalForm: React.FC = ({ open, handleClose, onClose={handleClose} aria-labelledby="alert-dialog-title" aria-describedby="alert-dialog-description" - title={"Update Guardian"} + title={"Change Guardian"} > {dao && ( Current Guardian:{" "} - {dao.data.guardian} + + + {dao.data.guardian} )} + {/* + + ( + + )} + /> + + */} = ({ open, handleClose, )} /> + {errors.newGuardianAddress?.message} - - - Proposal Fee:{" "} - - - {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} - + + + + Proposal Fee:{" "} + + + {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} + + + + + Submit + + - - - Submit - diff --git a/src/modules/explorer/components/NewTreasuryProposalDialog.tsx b/src/modules/explorer/components/NewTreasuryProposalDialog.tsx index a707f90c..fb06bf50 100644 --- a/src/modules/explorer/components/NewTreasuryProposalDialog.tsx +++ b/src/modules/explorer/components/NewTreasuryProposalDialog.tsx @@ -29,14 +29,14 @@ export type Asset = Token | { symbol: "XTZ" } const AmountText = styled(Typography)(({ theme }) => ({ color: theme.palette.secondary.main, - fontSize: 14, + fontSize: 16, lineHeight: "146.3%", - marginRight: 10 + marginRight: 10, + fontWeight: 300 })) const DAOBalanceText = styled(Typography)({ color: "#ffff", - fontSize: 14, lineHeight: "100%", marginRight: 10 }) @@ -201,7 +201,7 @@ export const NewTreasuryProposalDialog: React.FC<{ open: boolean }> = ({ open }) }, [index, setValue, max, currentAssetBalance, currentTransfer, ledger]) return ( - + = ({ open }) {"Must be greater than zero"} ) : null} - - - DAO Balance + + + DAO Balance: - + {daoAssets ? ( {currentAssetBalance !== undefined && diff --git a/src/modules/explorer/components/ProposalForm.tsx b/src/modules/explorer/components/ProposalForm.tsx index 3d86bbb3..a4e75112 100644 --- a/src/modules/explorer/components/ProposalForm.tsx +++ b/src/modules/explorer/components/ProposalForm.tsx @@ -92,7 +92,8 @@ const enabledForms: Record< } const Content = styled(Grid)({ - padding: "0 54px" + padding: "0 54px", + paddingBottom: 24 }) const SwapText = styled(Typography)({ @@ -193,7 +194,6 @@ export const ProposalFormContainer: React.FC = ({ if (state === 0) { handleChangeTab?.(1) } else if (state === 1) { - console.log() handleChangeTab?.(0) } else { return @@ -221,7 +221,7 @@ export const ProposalFormContainer: React.FC = ({ ))} - + = ({ /> - - - Proposal Fee:{" "} - - - {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} - - + + + + Proposal Fee:{" "} + + + {dao && dao.data.extra.frozen_extra_value.toString()} {dao ? dao.data.token.symbol : ""} + + - - Submit - + + + Submit + + + )} diff --git a/src/modules/explorer/components/ProposalFormInput.tsx b/src/modules/explorer/components/ProposalFormInput.tsx index e6aa4e6c..099bad43 100644 --- a/src/modules/explorer/components/ProposalFormInput.tsx +++ b/src/modules/explorer/components/ProposalFormInput.tsx @@ -3,7 +3,7 @@ import Editor from "react-simple-code-editor" import { Grid, styled, Typography } from "@material-ui/core" const StyledBody = styled(Grid)(({ theme }) => ({ - "borderRadius": 4, + "borderRadius": 8, "background": theme.palette.primary.main, "padding": "0 20px", "minHeight": 54, diff --git a/src/modules/explorer/components/ProposalFormSendButton.tsx b/src/modules/explorer/components/ProposalFormSendButton.tsx index 03a59806..e174cc3e 100644 --- a/src/modules/explorer/components/ProposalFormSendButton.tsx +++ b/src/modules/explorer/components/ProposalFormSendButton.tsx @@ -10,8 +10,9 @@ const SendContainer = styled(Grid)(({ theme }) => ({ })) const StyledSendButton = styled(MainButton)(({ theme }) => ({ - width: 101, - color: "#1C1F23" + width: 96, + color: "#1C1F23", + height: 40 })) export const SendButton: React.FC = ({ children, ...props }) => { diff --git a/src/modules/explorer/components/ResponsiveDialog.tsx b/src/modules/explorer/components/ResponsiveDialog.tsx index a7138b4d..04aea87d 100644 --- a/src/modules/explorer/components/ResponsiveDialog.tsx +++ b/src/modules/explorer/components/ResponsiveDialog.tsx @@ -48,8 +48,13 @@ export const ResponsiveDialog: React.FC<{ return isSmall ? ( - - {onGoBack ? : null} + + {onGoBack !== undefined ? ( + + {" "} + + + ) : null} {title} @@ -64,7 +69,12 @@ export const ResponsiveDialog: React.FC<{ - {onGoBack ? : null} + {onGoBack !== undefined ? ( + + {" "} + + + ) : null}{" "} {title} diff --git a/src/modules/explorer/pages/DAOList/index.tsx b/src/modules/explorer/pages/DAOList/index.tsx index 7c97c0e7..c8666d81 100644 --- a/src/modules/explorer/pages/DAOList/index.tsx +++ b/src/modules/explorer/pages/DAOList/index.tsx @@ -115,11 +115,6 @@ const ExternalLink = styled(Typography)({ } }) -const ExternalLinkIcon = styled(LaunchOutlined)({ - fontSize: 14, - marginBottom: 2 -}) - export const DAOList: React.FC = () => { const { network, account, tezos } = useTezos() const { data: daos, isLoading } = useAllDAOs(network) diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index f8a2ee0c..bbdb671b 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -192,10 +192,6 @@ export const Proposals: React.FC = () => { setOpenDialog(false) } - useEffect(() => { - console.log("se actualizó") - }, [openDialog]) - const onFlush = useCallback(async () => { if (executableProposals && expiredProposals && executableProposals.length && data) { mutate({ diff --git a/src/theme/index.ts b/src/theme/index.ts index 239ee96a..5953ba6b 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -317,7 +317,8 @@ export const theme = createTheme({ "$checked$checked + &": { opacity: 1, backgroundColor: "#1C1F23", - color: "#81FEB7" + color: "#81FEB7", + border: "1px solid #1C1F23" } }, thumb: { From 92b75d60bd8d9b809c9ac6603b5819c140ba24d5 Mon Sep 17 00:00:00 2001 From: fabiolalombardim <37227394+fabiolalombardim@users.noreply.github.com> Date: Mon, 26 Jun 2023 18:05:14 +0200 Subject: [PATCH 2/3] Settings modal (#594) * contract field & delegate added * responsive modal --- src/assets/img/download.svg | 3 + src/modules/common/CopyAddress.tsx | 2 +- src/modules/common/CopyButton.tsx | 7 +- .../explorer/components/ResponsiveDialog.tsx | 13 +- .../pages/Config/components/DAOInfoTable.tsx | 268 +++++++++++++----- .../pages/DAO/components/Settings.tsx | 41 +-- src/theme/index.ts | 3 +- 7 files changed, 217 insertions(+), 120 deletions(-) create mode 100644 src/assets/img/download.svg diff --git a/src/assets/img/download.svg b/src/assets/img/download.svg new file mode 100644 index 00000000..b3f04df2 --- /dev/null +++ b/src/assets/img/download.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/modules/common/CopyAddress.tsx b/src/modules/common/CopyAddress.tsx index af74a764..71c0fc32 100644 --- a/src/modules/common/CopyAddress.tsx +++ b/src/modules/common/CopyAddress.tsx @@ -16,7 +16,7 @@ export const CopyAddress: React.FC = ({ address, typographyProps }) => { <> - + {isMobileSmall ? toShortAddress(address) : address} diff --git a/src/modules/common/CopyButton.tsx b/src/modules/common/CopyButton.tsx index af259835..3b2d9f0b 100644 --- a/src/modules/common/CopyButton.tsx +++ b/src/modules/common/CopyButton.tsx @@ -1,8 +1,9 @@ import React, { useState } from "react" import { Box, styled, Tooltip } from "@material-ui/core" -import { FileCopyOutlined } from "@material-ui/icons" +import { FileCopyOutlined, Image } from "@material-ui/icons" +import DownloadIcon from "assets/img/download.svg" -const CopyIcon = styled(FileCopyOutlined)({ +const CopyIcon = styled("img")({ cursor: "pointer" }) @@ -23,7 +24,7 @@ export const CopyButton: React.FC<{ text: string; style?: any }> = ({ text, styl }} > - + ) diff --git a/src/modules/explorer/components/ResponsiveDialog.tsx b/src/modules/explorer/components/ResponsiveDialog.tsx index 04aea87d..eaddf628 100644 --- a/src/modules/explorer/components/ResponsiveDialog.tsx +++ b/src/modules/explorer/components/ResponsiveDialog.tsx @@ -8,12 +8,15 @@ const Content = styled(Grid)({ padding: "41px 46px" }) -const TitleText = styled(Typography)({ +const TitleText = styled(Typography)(({ theme }) => ({ color: "#ffff", fontWeight: 550, lineHeight: ".80", - textTransform: "capitalize" -}) + textTransform: "capitalize", + [theme.breakpoints.down("sm")]: { + fontSize: 18 + } +})) const CustomDialog = styled(Dialog)({ "& .MuiDialog-paperWidthMd": { @@ -62,7 +65,9 @@ export const ResponsiveDialog: React.FC<{ - {children} + + {children} + ) : ( diff --git a/src/modules/explorer/pages/Config/components/DAOInfoTable.tsx b/src/modules/explorer/pages/Config/components/DAOInfoTable.tsx index c2ae6ce2..d5794866 100644 --- a/src/modules/explorer/pages/Config/components/DAOInfoTable.tsx +++ b/src/modules/explorer/pages/Config/components/DAOInfoTable.tsx @@ -1,109 +1,225 @@ /* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain */ -import { styled, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from "@material-ui/core" +import { + Grid, + styled, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Typography, + useMediaQuery, + useTheme +} from "@material-ui/core" import React from "react" import { useDAO } from "services/services/dao/hooks/useDAO" import BigNumber from "bignumber.js" import { useDAOID } from "../../DAO/router" +import { useDelegate } from "services/contracts/baseDAO/hooks/useDelegate" +import { CopyButton } from "modules/common/CopyButton" +import { CopyAddress } from "modules/common/CopyAddress" -const RowValue = styled(Typography)({ +const RowValue = styled(Typography)(({ theme }) => ({ fontWeight: 300, - fontSize: 18 -}) + fontSize: 18, + [theme.breakpoints.down("sm")]: { + fontSize: 16 + } +})) -const TableTitle = styled(Typography)({ +const TableTitle = styled(Typography)(({ theme }) => ({ fontWeight: 500, - fontSize: 18 -}) + fontSize: 18, + [theme.breakpoints.down("sm")]: { + fontSize: 16 + } +})) const CustomTableContainer = styled(TableContainer)(({ theme }) => ({ + width: "inherit", [theme.breakpoints.down("sm")]: {} })) +const CustomTableCell = styled(TableCell)(({ theme }) => ({ + [theme.breakpoints.down("sm")]: { + paddingBottom: 0, + paddingLeft: "16px !important", + textAlign: "end" + } +})) + +const CustomTableCellTitle = styled(TableCell)(({ theme }) => ({ + [theme.breakpoints.down("sm")]: { + paddingLeft: "16px !important" + } +})) + +const CustomTableCellValue = styled(TableCell)(({ theme }) => ({ + [theme.breakpoints.down("sm")]: { + paddingTop: 0, + paddingRight: "16px !important", + textAlign: "end", + paddingBottom: 0 + } +})) + export const DaoInfoTables: React.FC = () => { const daoId = useDAOID() const { data: dao } = useDAO(daoId) + const theme = useTheme() + const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) + const currentDelegate = useDelegate(dao && dao?.data.address ? dao?.data.address : "") return ( <> + + + + {dao ? ( + <> + + + + Contract Address (Treasury) + + + + + {isMobileSmall ? ( + + ) : ( + <> + + {dao.data.address} + + + + )} + + + + + + + Current Delegate + + + + + {currentDelegate && currentDelegate.data && currentDelegate.data.address ? ( + isMobileSmall ? ( + + ) : ( + + {currentDelegate.data.address} + + + ) + ) : ( + "-" + )} + + + + + ) : null} + +
+
- + Proposal & Voting Settings - + {dao ? ( <> - - Voting Period Duration - - + + + Voting Period Duration + + + {dao.data.period} blocks - + - - Flush Delay Duration - - + + + Flush Delay Duration + + + {new BigNumber(dao.data.proposal_flush_level).toNumber() - 2 * new BigNumber(dao.data.period).toNumber()}{" "} blocks - + - - Proposal Blocks to Expire - - + + + Proposal Blocks to Expire + + + {new BigNumber(dao.data.proposal_expired_level).toNumber() - new BigNumber(dao.data.proposal_flush_level).toNumber()}{" "} blocks - + - - Stake Required to Propose - - + + + Stake Required to Propose + + + {new BigNumber(dao.data.extra.frozen_extra_value).toNumber()} locked {dao.data.token.symbol} - + - - Stake Returned if Rejected - - + + + Stake Returned if Rejected + + + {dao.data.extra.returnedPercentage}% of locked {dao.data.token.symbol} - + - - Transfer Maximum XTZ Amount - - + + + Transfer Maximum XTZ Amount + + + {new BigNumber(dao.data.extra.max_xtz_amount).div(10 ** 6).toNumber()} XTZ - + - - Transfer Minimum XTZ Amount - - + + + Transfer Minimum XTZ Amount + + + {new BigNumber(dao.data.extra.min_xtz_amount).div(10 ** 6).toNumber()} XTZ - + ) : null} @@ -115,55 +231,65 @@ export const DaoInfoTables: React.FC = () => {
- + Quorum Settings - + {dao ? ( <> - - Quorum Threshold - - + + + Quorum Threshold + + + {dao.data.quorum_threshold.toNumber()} {dao.data.token.symbol} - + - - Quorum Min Amount - - + + + Quorum Min Amount + + + {new BigNumber(dao.data.min_quorum_threshold).div(10000).toNumber()}% - + - - Quorum Max Amount - - + + + Quorum Max Amount + + + {new BigNumber(dao.data.max_quorum_threshold).div(10000).toNumber()}% - + - - Quorum Change - - + + + Quorum Change + + + {new BigNumber(dao.data.quorum_change).div(10000).toNumber()}% - + - - Quorum Max Change - - + + + Quorum Max Change + + + {new BigNumber(dao.data.max_quorum_change).div(10000).toNumber()}% - + ) : null} diff --git a/src/modules/explorer/pages/DAO/components/Settings.tsx b/src/modules/explorer/pages/DAO/components/Settings.tsx index 0a9d4025..32004f20 100644 --- a/src/modules/explorer/pages/DAO/components/Settings.tsx +++ b/src/modules/explorer/pages/DAO/components/Settings.tsx @@ -1,53 +1,14 @@ /* eslint-disable react/display-name */ -import { Grid, styled, Typography, useMediaQuery, useTheme } from "@material-ui/core" -import React, { useState } from "react" -import { useDAO } from "services/services/dao/hooks/useDAO" -import { useDAOID } from "../router" +import React from "react" import { ResponsiveDialog } from "modules/explorer/components/ResponsiveDialog" import { DaoInfoTables } from "../../Config/components/DAOInfoTable" -const OptionContainer = styled(Grid)(({ theme }) => ({ - "minHeight": 80, - "background": theme.palette.primary.main, - "borderRadius": 8, - "padding": "35px 42px", - "marginBottom": 16, - "cursor": "pointer", - "height": 110, - "&:hover": { - background: theme.palette.secondary.dark, - scale: 1.01, - transition: "0.15s ease-in" - } -})) - -const ActionText = styled(Typography)(({ theme }) => ({ - fontWeight: 400, - fontSize: 20, - marginBottom: 8 -})) - -const ActionDescriptionText = styled(Typography)(({ theme }) => ({ - fontWeight: 300, - fontSize: 16 -})) - -interface Action { - id: any - name: string - description: string - isLambda: boolean -} - interface Props { open: boolean handleClose: () => void } export const DaoSettingModal: React.FC = ({ open, handleClose }) => { - const theme = useTheme() - const isMobileSmall = useMediaQuery(theme.breakpoints.down("sm")) - return ( <> diff --git a/src/theme/index.ts b/src/theme/index.ts index 5953ba6b..376daa07 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -388,7 +388,8 @@ export const theme = createTheme({ root: { "height": 70, "& th:first-child, & td:first-child": { - paddingLeft: 46 + paddingLeft: 46, + textAlign: "inherit" }, "& th:last-child, & td:last-child": { paddingRight: 46 From c8d70fd921a876c3d76c8092a8f1b9d502401444 Mon Sep 17 00:00:00 2001 From: Manank Patni Date: Thu, 29 Jun 2023 03:15:56 +0530 Subject: [PATCH 3/3] Add delegated token deployment (#592) Signed-off-by: Manank Patni --- .../contracts/token/assets/MultiAsset.json | 4592 ----------------- .../assets/fa2_single_asset_delegated.ts | 938 ++++ .../contracts/token/hooks/useToken.ts | 8 +- src/services/contracts/token/index.ts | 39 +- 4 files changed, 968 insertions(+), 4609 deletions(-) delete mode 100644 src/services/contracts/token/assets/MultiAsset.json create mode 100644 src/services/contracts/token/assets/fa2_single_asset_delegated.ts diff --git a/src/services/contracts/token/assets/MultiAsset.json b/src/services/contracts/token/assets/MultiAsset.json deleted file mode 100644 index e1f8b94a..00000000 --- a/src/services/contracts/token/assets/MultiAsset.json +++ /dev/null @@ -1,4592 +0,0 @@ -[ - { - "prim": "storage", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%admin" - ] - }, - { - "prim": "bool", - "annots": [ - "%paused" - ] - } - ] - }, - { - "prim": "option", - "args": [ - { - "prim": "address" - } - ], - "annots": [ - "%pending_admin" - ] - } - ], - "annots": [ - "%admin" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ], - "annots": [ - "%ledger" - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - } - ] - }, - { - "prim": "unit" - } - ], - "annots": [ - "%operators" - ] - } - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "big_map", - "args": [ - { - "prim": "nat" - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat", - "annots": [ - "%token_id" - ] - }, - { - "prim": "map", - "args": [ - { - "prim": "string" - }, - { - "prim": "bytes" - } - ], - "annots": [ - "%token_info" - ] - } - ] - } - ], - "annots": [ - "%token_metadata" - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "nat" - }, - { - "prim": "nat" - } - ], - "annots": [ - "%token_total_supply" - ] - } - ] - } - ], - "annots": [ - "%assets" - ] - } - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "string" - }, - { - "prim": "bytes" - } - ], - "annots": [ - "%metadata" - ] - } - ] - } - ] - }, - { - "prim": "parameter", - "args": [ - { - "prim": "or", - "args": [ - { - "prim": "or", - "args": [ - { - "prim": "or", - "args": [ - { - "prim": "or", - "args": [ - { - "prim": "unit", - "annots": [ - "%confirm_admin" - ] - }, - { - "prim": "bool", - "annots": [ - "%pause" - ] - } - ] - }, - { - "prim": "address", - "annots": [ - "%set_admin" - ] - } - ], - "annots": [ - "%admin" - ] - }, - { - "prim": "or", - "args": [ - { - "prim": "or", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "list", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%owner" - ] - }, - { - "prim": "nat", - "annots": [ - "%token_id" - ] - } - ] - } - ], - "annots": [ - "%requests" - ] - }, - { - "prim": "contract", - "args": [ - { - "prim": "list", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%owner" - ] - }, - { - "prim": "nat", - "annots": [ - "%token_id" - ] - } - ], - "annots": [ - "%request" - ] - }, - { - "prim": "nat", - "annots": [ - "%balance" - ] - } - ] - } - ] - } - ], - "annots": [ - "%callback" - ] - } - ], - "annots": [ - "%balance_of" - ] - }, - { - "prim": "list", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%from_" - ] - }, - { - "prim": "list", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%to_" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat", - "annots": [ - "%token_id" - ] - }, - { - "prim": "nat", - "annots": [ - "%amount" - ] - } - ] - } - ] - } - ], - "annots": [ - "%txs" - ] - } - ] - } - ], - "annots": [ - "%transfer" - ] - } - ] - }, - { - "prim": "list", - "args": [ - { - "prim": "or", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%owner" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%operator" - ] - }, - { - "prim": "nat", - "annots": [ - "%token_id" - ] - } - ] - } - ], - "annots": [ - "%add_operator" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%owner" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%operator" - ] - }, - { - "prim": "nat", - "annots": [ - "%token_id" - ] - } - ] - } - ], - "annots": [ - "%remove_operator" - ] - } - ] - } - ], - "annots": [ - "%update_operators" - ] - } - ], - "annots": [ - "%assets" - ] - } - ] - }, - { - "prim": "or", - "args": [ - { - "prim": "or", - "args": [ - { - "prim": "list", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%owner" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat", - "annots": [ - "%token_id" - ] - }, - { - "prim": "nat", - "annots": [ - "%amount" - ] - } - ] - } - ] - } - ], - "annots": [ - "%burn_tokens" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat", - "annots": [ - "%token_id" - ] - }, - { - "prim": "map", - "args": [ - { - "prim": "string" - }, - { - "prim": "bytes" - } - ], - "annots": [ - "%token_info" - ] - } - ], - "annots": [ - "%create_token" - ] - } - ] - }, - { - "prim": "list", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address", - "annots": [ - "%owner" - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat", - "annots": [ - "%token_id" - ] - }, - { - "prim": "nat", - "annots": [ - "%amount" - ] - } - ] - } - ] - } - ], - "annots": [ - "%mint_tokens" - ] - } - ], - "annots": [ - "%tokens" - ] - } - ] - } - ] - }, - { - "prim": "code", - "args": [ - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "FA2_TOKEN_UNDEFINED" - } - ] - }, - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "FA2_INSUFFICIENT_BALANCE" - } - ] - }, - { - "prim": "LAMBDA", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ] - } - ] - }, - { - "prim": "nat" - }, - [ - { - "prim": "UNPAIR" - }, - { - "prim": "GET" - }, - { - "prim": "IF_NONE", - "args": [ - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "nat" - }, - { - "int": "0" - } - ] - } - ], - [] - ] - } - ] - ] - }, - { - "prim": "DUP" - }, - { - "prim": "LAMBDA", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "lambda", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ] - } - ] - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat" - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ] - } - ] - } - ] - } - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ] - }, - [ - { - "prim": "UNPAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "ADD" - }, - { - "prim": "DUP" - }, - { - "prim": "PUSH", - "args": [ - { - "prim": "nat" - }, - { - "int": "0" - } - ] - }, - { - "prim": "COMPARE" - }, - { - "prim": "EQ" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "DROP" - }, - { - "prim": "NONE", - "args": [ - { - "prim": "nat" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "UPDATE" - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SOME" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "UPDATE" - } - ] - ] - } - ] - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "APPLY" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "LAMBDA", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "lambda", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ] - } - ] - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "string" - } - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat" - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ] - } - ] - } - ] - } - ] - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - }, - { - "prim": "nat" - } - ] - }, - [ - { - "prim": "UNPAIR" - }, - { - "prim": "UNPAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SUB" - }, - { - "prim": "ISNAT" - }, - { - "prim": "IF_NONE", - "args": [ - [ - { - "prim": "DROP", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "FAILWITH" - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DUP" - }, - { - "prim": "PUSH", - "args": [ - { - "prim": "nat" - }, - { - "int": "0" - } - ] - }, - { - "prim": "COMPARE" - }, - { - "prim": "EQ" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "DROP" - }, - { - "prim": "NONE", - "args": [ - { - "prim": "nat" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "UPDATE" - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SOME" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "UPDATE" - } - ] - ] - } - ] - ] - } - ] - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "APPLY" - }, - { - "prim": "LAMBDA", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "bool" - } - ] - }, - { - "prim": "option", - "args": [ - { - "prim": "address" - } - ] - } - ] - }, - { - "prim": "unit" - }, - [ - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "SENDER" - }, - { - "prim": "COMPARE" - }, - { - "prim": "NEQ" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "NOT_AN_ADMIN" - } - ] - }, - { - "prim": "FAILWITH" - } - ], - [] - ] - }, - { - "prim": "UNIT" - } - ] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "6" - } - ] - }, - { - "prim": "UNPAIR" - }, - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "DIG", - "args": [ - { - "int": "6" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "SWAP" - }, - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "IF_NONE", - "args": [ - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "NO_PENDING_ADMIN" - } - ] - }, - { - "prim": "FAILWITH" - } - ], - [ - { - "prim": "SENDER" - }, - { - "prim": "COMPARE" - }, - { - "prim": "EQ" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "NONE", - "args": [ - { - "prim": "address" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SENDER" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - } - ], - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "NOT_A_PENDING_ADMIN" - } - ] - }, - { - "prim": "FAILWITH" - } - ] - ] - } - ] - ] - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ], - [ - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "DROP" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ] - ] - } - ], - [ - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "DROP" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "SOME" - }, - { - "prim": "SWAP" - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ] - ] - }, - { - "prim": "UNPAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "PAIR" - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "PAUSED" - } - ] - }, - { - "prim": "FAILWITH" - } - ], - [] - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "MAP", - "args": [ - [ - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CDR" - }, - { - "prim": "MEM" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "7" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "SWAP" - }, - { - "prim": "PAIR" - } - ], - [ - { - "prim": "DROP" - }, - { - "prim": "DUP", - "args": [ - { - "int": "6" - } - ] - }, - { - "prim": "FAILWITH" - } - ] - ] - } - ] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "CDR" - }, - { - "prim": "PUSH", - "args": [ - { - "prim": "mutez" - }, - { - "int": "0" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "TRANSFER_TOKENS" - }, - { - "prim": "SWAP" - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CONS" - }, - { - "prim": "PAIR" - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "5" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "LAMBDA", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "address" - } - ] - }, - { - "prim": "pair", - "args": [ - { - "prim": "nat" - }, - { - "prim": "big_map", - "args": [ - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "pair", - "args": [ - { - "prim": "address" - }, - { - "prim": "nat" - } - ] - } - ] - }, - { - "prim": "unit" - } - ] - } - ] - } - ] - }, - { - "prim": "unit" - }, - [ - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "DUP" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "COMPARE" - }, - { - "prim": "EQ" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "DROP", - "args": [ - { - "int": "3" - } - ] - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "MEM" - }, - { - "prim": "IF", - "args": [ - [], - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "FA2_NOT_OPERATOR" - } - ] - }, - { - "prim": "FAILWITH" - } - ] - ] - } - ] - ] - }, - { - "prim": "UNIT" - } - ] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "ITER", - "args": [ - [ - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CDR" - }, - { - "prim": "ITER", - "args": [ - [ - { - "prim": "SWAP" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "MEM" - }, - { - "prim": "IF", - "args": [ - [ - { - "prim": "DUP", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SENDER" - }, - { - "prim": "DUP", - "args": [ - { - "int": "5" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "6" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DUP", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "8" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "8" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - } - ], - [ - { - "prim": "DROP", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP", - "args": [ - { - "int": "8" - } - ] - }, - { - "prim": "FAILWITH" - } - ] - ] - } - ] - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DROP" - } - ] - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ] - ] - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "PAIR" - }, - { - "prim": "SENDER" - }, - { - "prim": "SWAP" - }, - { - "prim": "UNPAIR" - }, - { - "prim": "ITER", - "args": [ - [ - { - "prim": "SWAP" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "IF_LEFT", - "args": [ - [], - [] - ] - }, - { - "prim": "CAR" - }, - { - "prim": "COMPARE" - }, - { - "prim": "EQ" - }, - { - "prim": "IF", - "args": [ - [], - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "FA2_NOT_OWNER" - } - ] - }, - { - "prim": "FAILWITH" - } - ] - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "SWAP" - }, - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "SWAP" - }, - { - "prim": "PUSH", - "args": [ - { - "prim": "option", - "args": [ - { - "prim": "unit" - } - ] - }, - { - "prim": "Some", - "args": [ - { - "prim": "Unit" - } - ] - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "UPDATE" - } - ], - [ - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "NONE", - "args": [ - { - "prim": "unit" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "UPDATE" - } - ] - ] - } - ] - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ] - ] - }, - { - "prim": "UNPAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CDR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "PAIR" - } - ] - ] - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "5" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "IF_LEFT", - "args": [ - [ - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "ITER", - "args": [ - [ - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "5" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - } - ] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "ITER", - "args": [ - [ - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET" - }, - { - "prim": "IF_NONE", - "args": [ - [ - { - "prim": "DROP", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP", - "args": [ - { - "int": "5" - } - ] - }, - { - "prim": "FAILWITH" - } - ], - [ - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SUB" - }, - { - "prim": "ISNAT" - }, - { - "prim": "IF_NONE", - "args": [ - [ - { - "prim": "DUP", - "args": [ - { - "int": "6" - } - ] - }, - { - "prim": "FAILWITH" - } - ], - [] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SOME" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "UPDATE" - } - ] - ] - } - ] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DUP" - }, - { - "prim": "CAR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET" - }, - { - "prim": "IF_NONE", - "args": [ - [ - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DUP", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SOME" - }, - { - "prim": "SWAP" - }, - { - "prim": "UPDATE" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "PUSH", - "args": [ - { - "prim": "option", - "args": [ - { - "prim": "nat" - } - ] - }, - { - "prim": "Some", - "args": [ - { - "int": "0" - } - ] - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "UPDATE" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - } - ], - [ - { - "prim": "PUSH", - "args": [ - { - "prim": "string" - }, - { - "string": "FA2_DUP_TOKEN_ID" - } - ] - }, - { - "prim": "FAILWITH" - } - ] - ] - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ] - ] - } - ], - [ - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "ITER", - "args": [ - [ - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "5" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "EXEC" - } - ] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "ITER", - "args": [ - [ - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "GET" - }, - { - "prim": "IF_NONE", - "args": [ - [ - { - "prim": "DROP", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "FAILWITH" - } - ], - [ - { - "prim": "SWAP" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "ADD" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "SWAP" - }, - { - "prim": "SOME" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "UPDATE" - } - ] - ] - } - ] - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "4" - } - ] - }, - { - "prim": "DROP" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DUP" - }, - { - "prim": "CDR" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "CDR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "DUP" - }, - { - "prim": "DUG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "GET", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "NIL", - "args": [ - { - "prim": "operation" - } - ] - }, - { - "prim": "PAIR" - } - ] - ] - }, - { - "prim": "UNPAIR" - }, - { - "prim": "DUP", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CDR" - }, - { - "prim": "DIG", - "args": [ - { - "int": "2" - } - ] - }, - { - "prim": "DIG", - "args": [ - { - "int": "3" - } - ] - }, - { - "prim": "CAR" - }, - { - "prim": "CAR" - }, - { - "prim": "PAIR" - }, - { - "prim": "PAIR" - }, - { - "prim": "SWAP" - }, - { - "prim": "PAIR" - } - ] - ] - } - ] - ] - } -] \ No newline at end of file diff --git a/src/services/contracts/token/assets/fa2_single_asset_delegated.ts b/src/services/contracts/token/assets/fa2_single_asset_delegated.ts new file mode 100644 index 00000000..98f4d8f7 --- /dev/null +++ b/src/services/contracts/token/assets/fa2_single_asset_delegated.ts @@ -0,0 +1,938 @@ +export default `{ parameter + (or (or (or (or %admin (bool %pause) (address %set_admin)) + (or %assets + (or (pair %balance_of + (list %requests (pair (address %owner) (nat %token_id))) + (contract %callback + (list (pair (pair %request (address %owner) (nat %token_id)) (nat %balance))))) + (list %transfer + (pair (address %from_) (list %txs (pair (address %to_) (nat %token_id) (nat %amount)))))) + (list %update_operators + (or (pair %add_operator (address %owner) (address %operator) (nat %token_id)) + (pair %remove_operator (address %owner) (address %operator) (nat %token_id)))))) + (or (option %set_delegate address) (address %set_minter))) + (or %tokens + (list %burn_tokens (pair (address %owner) (nat %amount))) + (list %mint_tokens (pair (address %owner) (nat %amount))))) ; +storage + (pair (pair (pair %admin (address %admin) (bool %paused)) + (pair %assets + (pair (pair (big_map %delegates address address) (big_map %ledger address nat)) + (address %minter) + (big_map %operators (pair address address nat) unit)) + (pair (big_map %token_metadata nat (pair (nat %token_id) (map %token_info string bytes))) + (nat %total_supply)) + (big_map %voting_power_history + (pair address nat) + (pair (nat %amount) (nat %from_block))) + (big_map %voting_power_history_sizes address nat))) + (big_map %metadata string bytes)) ; +code { PUSH string "FA2_TOKEN_UNDEFINED" ; + PUSH string "FA2_INSUFFICIENT_BALANCE" ; + LAMBDA + int + nat + { ISNAT ; IF_NONE { PUSH string "NOT_A_NAT" ; FAILWITH } {} } ; + LAMBDA + (pair (lambda int nat) + (pair (pair address int) + (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat))) + (pair (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat)) + { UNPAIR ; + SWAP ; + UNPAIR ; + UNPAIR ; + DUP 3 ; + CDR ; + CDR ; + CDR ; + DUP 2 ; + GET ; + IF_NONE + { SWAP ; DIG 3 ; SWAP ; EXEC ; PUSH nat 0 } + { DUP 4 ; + CDR ; + CDR ; + CAR ; + PUSH int 1 ; + DUP 3 ; + SUB ; + DUP 7 ; + SWAP ; + EXEC ; + DUP 4 ; + PAIR ; + GET ; + IF_NONE { PUSH string "option is None" ; FAILWITH } {} ; + DIG 3 ; + DUP 2 ; + CAR ; + ADD ; + DUP 6 ; + SWAP ; + EXEC ; + LEVEL ; + DIG 2 ; + CDR ; + COMPARE ; + EQ ; + IF { PUSH int 1 ; DIG 2 ; SUB ; DIG 4 ; SWAP ; EXEC } + { DIG 4 ; DROP ; SWAP } } ; + LEVEL ; + DIG 2 ; + PAIR ; + DUP 4 ; + CDR ; + CDR ; + CDR ; + PUSH nat 1 ; + DUP 4 ; + ADD ; + SOME ; + DUP 5 ; + UPDATE ; + DUP 5 ; + CDR ; + CDR ; + CAR ; + PAIR ; + DUP 5 ; + CDR ; + CAR ; + PAIR ; + DUP 5 ; + CAR ; + PAIR ; + DUP ; + CDR ; + CDR ; + CDR ; + DIG 5 ; + CDR ; + CDR ; + CAR ; + DIG 3 ; + SOME ; + DIG 4 ; + DIG 5 ; + PAIR ; + UPDATE ; + PAIR ; + DUP 2 ; + CDR ; + CAR ; + PAIR ; + SWAP ; + CAR ; + PAIR } ; + DUP 2 ; + APPLY ; + SWAP ; + DROP ; + LAMBDA + (pair address (big_map address nat)) + nat + { UNPAIR ; GET ; IF_NONE { PUSH nat 0 } {} } ; + LAMBDA + (pair (pair (lambda (pair address (big_map address nat)) nat) + (lambda + (pair (pair address int) + (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat)) + (pair (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat))) + string) + (pair (pair address int) + (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat))) + (pair (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat)) + { UNPAIR ; + UNPAIR 3 ; + DIG 3 ; + UNPAIR ; + UNPAIR ; + DUP 3 ; + CAR ; + CAR ; + CDR ; + DUP 2 ; + PAIR ; + DIG 4 ; + SWAP ; + EXEC ; + DUP 3 ; + ADD ; + ISNAT ; + IF_NONE + { DIG 4 ; FAILWITH } + { DIG 5 ; + DROP ; + PUSH nat 0 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP ; DUP 3 ; CAR ; CAR ; CDR ; DUP 2 ; NONE nat ; SWAP ; UPDATE } + { DUP 4 ; CAR ; CAR ; CDR ; SWAP ; SOME ; DUP 3 ; UPDATE } } ; + PUSH int 0 ; + DUP 4 ; + COMPARE ; + EQ ; + IF { SWAP ; DIG 2 ; DIG 4 ; DROP 3 ; SWAP } + { DUP 4 ; + DIG 3 ; + DIG 4 ; + CAR ; + CAR ; + CAR ; + DUP 5 ; + GET ; + IF_NONE { DIG 3 } { DIG 4 ; DROP } ; + PAIR ; + PAIR ; + DIG 2 ; + SWAP ; + EXEC } ; + DUP ; + CDR ; + DUP 2 ; + CAR ; + CDR ; + DIG 3 ; + DIG 3 ; + CAR ; + CAR ; + CAR ; + PAIR ; + PAIR ; + PAIR } ; + DUP 4 ; + DUP 4 ; + DUP 4 ; + PAIR 3 ; + APPLY ; + LAMBDA + (pair (pair (lambda + (pair (pair address int) + (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat)) + (pair (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat))) + string) + (pair (pair (list (pair (option address) (list (pair (option address) nat nat)))) + (lambda (pair (pair address address) nat (big_map (pair address address nat) unit)) unit)) + (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat))) + (pair (list operation) + (pair (pair (big_map address address) (big_map address nat)) + address + (big_map (pair address address nat) unit)) + (pair (big_map nat (pair nat (map string bytes))) nat) + (big_map (pair address nat) (pair nat nat)) + (big_map address nat)) + { UNPAIR ; + UNPAIR ; + DIG 2 ; + UNPAIR ; + UNPAIR ; + DIG 2 ; + SWAP ; + ITER { SWAP ; + SENDER ; + SWAP ; + DUP 3 ; + CDR ; + ITER { SWAP ; + PUSH nat 0 ; + DUP 3 ; + GET 3 ; + COMPARE ; + NEQ ; + IF { DROP 2 ; DUP 5 ; FAILWITH } + { DUP 4 ; + CAR ; + IF_NONE + {} + { DUP 2 ; + CAR ; + CDR ; + CDR ; + DUP 4 ; + GET 3 ; + PAIR ; + DUP 5 ; + DUP 3 ; + PAIR ; + PAIR ; + DUP 7 ; + SWAP ; + EXEC ; + DROP ; + SWAP ; + DUP 3 ; + GET 4 ; + NEG ; + DIG 2 ; + PAIR ; + PAIR ; + DUP 6 ; + SWAP ; + EXEC } ; + DUP 2 ; + CAR ; + IF_NONE + { SWAP ; DROP } + { SWAP ; DIG 2 ; GET 4 ; INT ; DIG 2 ; PAIR ; PAIR ; DUP 5 ; SWAP ; EXEC } } } ; + SWAP ; + DIG 2 ; + DROP 2 } ; + SWAP ; + DIG 2 ; + DIG 3 ; + DROP 3 ; + NIL operation ; + PAIR } ; + DUP 6 ; + DUP 3 ; + PAIR ; + APPLY ; + SWAP ; + DROP ; + LAMBDA + (list (pair address nat)) + nat + { PUSH nat 0 ; SWAP ; ITER { CDR ; ADD } } ; + LAMBDA + (pair address bool) + unit + { CAR ; + SENDER ; + COMPARE ; + NEQ ; + IF { PUSH string "NOT_AN_ADMIN" ; FAILWITH } { UNIT } } ; + LAMBDA + (pair address bool) + unit + { CDR ; IF { PUSH string "PAUSED" ; FAILWITH } { UNIT } } ; + DIG 8 ; + UNPAIR ; + PUSH mutez 0 ; + AMOUNT ; + COMPARE ; + GT ; + IF { PUSH string "AMOUNT_NOT_ZERO" ; FAILWITH } {} ; + IF_LEFT + { DIG 4 ; + DIG 8 ; + DROP 2 ; + IF_LEFT + { DIG 6 ; + DROP ; + IF_LEFT + { DIG 2 ; + DIG 4 ; + DIG 5 ; + DIG 6 ; + DROP 4 ; + DUP 2 ; + CAR ; + CAR ; + DIG 3 ; + SWAP ; + EXEC ; + DROP ; + DUP 2 ; + CAR ; + CAR ; + SWAP ; + IF_LEFT { SWAP ; CAR } { SWAP ; CDR ; SWAP } ; + PAIR ; + NIL operation ; + DUP 3 ; + CDR ; + DIG 3 ; + CAR ; + CDR ; + DIG 3 } + { DIG 3 ; + DROP ; + DUP 2 ; + CAR ; + CAR ; + DIG 3 ; + SWAP ; + EXEC ; + DROP ; + DUP 2 ; + CAR ; + CDR ; + SWAP ; + IF_LEFT + { IF_LEFT + { DIG 3 ; + DROP ; + DUP ; + CAR ; + MAP { PUSH nat 0 ; + DUP 2 ; + CDR ; + COMPARE ; + NEQ ; + IF { DROP ; DUP 5 ; FAILWITH } + { DUP 3 ; + CAR ; + CAR ; + CDR ; + DUP 2 ; + CAR ; + PAIR ; + DUP 6 ; + SWAP ; + EXEC ; + SWAP ; + PAIR } } ; + DIG 4 ; + DIG 5 ; + DROP 2 ; + SWAP ; + CDR ; + PUSH mutez 0 ; + DIG 2 ; + TRANSFER_TOKENS ; + SWAP ; + NIL operation ; + DIG 2 ; + CONS ; + PAIR } + { DIG 4 ; + DIG 5 ; + DROP 2 ; + MAP { DUP ; + CDR ; + MAP { DUP ; GET 4 ; DUP 2 ; GET 3 ; DIG 2 ; CAR ; SOME ; PAIR 3 } ; + SWAP ; + CAR ; + SOME ; + PAIR } ; + SWAP ; + LAMBDA + (pair (pair address address) nat (big_map (pair address address nat) unit)) + unit + { UNPAIR ; + UNPAIR ; + DIG 2 ; + UNPAIR ; + DUP 4 ; + DUP 4 ; + COMPARE ; + EQ ; + IF { DROP 4 ; UNIT } + { DIG 3 ; + PAIR ; + DIG 2 ; + PAIR ; + MEM ; + IF { UNIT } { PUSH string "FA2_NOT_OPERATOR" ; FAILWITH } } } ; + DIG 2 ; + PAIR ; + PAIR ; + DIG 2 ; + SWAP ; + EXEC } } + { DIG 3 ; + DIG 4 ; + DIG 5 ; + DROP 3 ; + SENDER ; + DUP 3 ; + CAR ; + CDR ; + CDR ; + DIG 2 ; + ITER { SWAP ; + DUP 3 ; + DUP 3 ; + IF_LEFT {} {} ; + CAR ; + COMPARE ; + EQ ; + IF {} { PUSH string "FA2_NOT_OWNER" ; FAILWITH } ; + SWAP ; + IF_LEFT + { SWAP ; + UNIT ; + SOME ; + DUP 3 ; + GET 4 ; + DUP 4 ; + GET 3 ; + PAIR ; + DIG 3 ; + CAR ; + PAIR ; + UPDATE } + { SWAP ; + DUP 2 ; + GET 4 ; + DUP 3 ; + GET 3 ; + PAIR ; + DIG 2 ; + CAR ; + PAIR ; + NONE unit ; + SWAP ; + UPDATE } } ; + SWAP ; + DROP ; + DUP 2 ; + CDR ; + SWAP ; + DUP 3 ; + CAR ; + CDR ; + CAR ; + PAIR ; + DIG 2 ; + CAR ; + CAR ; + PAIR ; + PAIR ; + NIL operation ; + PAIR } ; + UNPAIR ; + DUP 3 ; + CDR ; + DIG 2 ; + DIG 3 ; + CAR ; + CAR } ; + PAIR ; + PAIR ; + SWAP } + { DIG 4 ; + DIG 7 ; + DROP 2 ; + IF_LEFT + { DIG 3 ; + DROP ; + DUP 2 ; + CAR ; + CAR ; + DIG 3 ; + SWAP ; + EXEC ; + DROP ; + DUP 2 ; + CAR ; + CDR ; + DUP ; + CAR ; + CAR ; + CDR ; + SENDER ; + PAIR ; + DIG 4 ; + SWAP ; + EXEC ; + DUP 3 ; + IF_NONE { SENDER } {} ; + DUP 3 ; + CAR ; + CAR ; + CAR ; + SENDER ; + GET ; + IF_NONE { SENDER } {} ; + PUSH nat 0 ; + DUP 4 ; + COMPARE ; + EQ ; + DUP 2 ; + DUP 4 ; + COMPARE ; + EQ ; + OR ; + IF { SWAP ; DIG 2 ; DIG 6 ; DROP 4 ; DUP } + { DUP 4 ; + DUP 4 ; + NEG ; + DIG 2 ; + PAIR ; + PAIR ; + DUP 7 ; + SWAP ; + EXEC ; + DIG 2 ; + INT ; + DIG 2 ; + PAIR ; + PAIR ; + DIG 4 ; + SWAP ; + EXEC } ; + DUP ; + CDR ; + DUP 2 ; + CAR ; + CDR ; + DIG 2 ; + CAR ; + CAR ; + CDR ; + DIG 3 ; + CAR ; + CAR ; + CAR ; + DIG 4 ; + SENDER ; + UPDATE ; + PAIR ; + PAIR ; + PAIR ; + DUP 2 ; + CDR ; + SWAP ; + DIG 2 ; + CAR ; + CAR } + { DIG 2 ; + DIG 4 ; + DIG 5 ; + DROP 3 ; + DUP 2 ; + CAR ; + CAR ; + DIG 3 ; + SWAP ; + EXEC ; + DROP ; + DUP 2 ; + CDR ; + DUP 3 ; + CAR ; + CDR ; + DUP ; + CDR ; + DUP 2 ; + CAR ; + CDR ; + CDR ; + DIG 4 ; + PAIR ; + DIG 2 ; + CAR ; + CAR ; + PAIR ; + PAIR ; + DIG 2 ; + CAR ; + CAR } ; + PAIR ; + PAIR ; + NIL operation } } + { DIG 3 ; + DIG 6 ; + DIG 7 ; + DIG 9 ; + DROP 4 ; + DUP 2 ; + CAR ; + CAR ; + DIG 3 ; + SWAP ; + EXEC ; + DROP ; + DUP 2 ; + CAR ; + CDR ; + CAR ; + CDR ; + CAR ; + SENDER ; + COMPARE ; + NEQ ; + IF { PUSH string "NOT_MINTER" ; FAILWITH } {} ; + DUP 2 ; + CAR ; + CDR ; + SWAP ; + IF_LEFT + { DUP ; + MAP { NIL (pair (option address) nat nat) ; + DUP 2 ; + CDR ; + PUSH nat 0 ; + NONE address ; + PAIR 3 ; + CONS ; + SWAP ; + CAR ; + SOME ; + PAIR } ; + DUP 3 ; + LAMBDA + (pair (pair address address) nat (big_map (pair address address nat) unit)) + unit + { DROP ; UNIT } ; + DIG 2 ; + PAIR ; + PAIR ; + DIG 5 ; + SWAP ; + EXEC ; + UNPAIR ; + DIG 2 ; + DIG 5 ; + SWAP ; + EXEC ; + DIG 3 ; + CDR ; + CAR ; + CDR ; + SUB ; + ISNAT ; + IF_NONE { DIG 3 ; FAILWITH } { DIG 4 ; DROP } ; + DUP 3 ; + CDR ; + CDR ; + SWAP ; + DUP 4 ; + CDR ; + CAR ; + CAR ; + PAIR ; + PAIR ; + DIG 2 ; + CAR } + { DIG 5 ; + DROP ; + DUP ; + MAP { DUP ; CDR ; PUSH nat 0 ; DIG 2 ; CAR ; SOME ; PAIR 3 } ; + DUP 3 ; + LAMBDA + (pair (pair address address) nat (big_map (pair address address nat) unit)) + unit + { DROP ; UNIT } ; + NIL (pair (option address) (list (pair (option address) nat nat))) ; + DIG 3 ; + NONE address ; + PAIR ; + CONS ; + PAIR ; + PAIR ; + DIG 5 ; + SWAP ; + EXEC ; + UNPAIR ; + DIG 2 ; + DIG 5 ; + SWAP ; + EXEC ; + DUP 3 ; + CDR ; + CDR ; + SWAP ; + DIG 4 ; + CDR ; + CAR ; + CDR ; + ADD ; + DUP 4 ; + CDR ; + CAR ; + CAR ; + PAIR ; + PAIR ; + DIG 2 ; + CAR } ; + PAIR ; + SWAP ; + DUP 3 ; + CDR ; + DIG 2 ; + DIG 3 ; + CAR ; + CAR ; + PAIR ; + PAIR ; + SWAP } ; + PAIR } ; +view "voting_power" + (pair (address %addr) (nat %block_level)) + nat + { LAMBDA + int + nat + { ISNAT ; IF_NONE { PUSH string "NOT_A_NAT" ; FAILWITH } {} } ; + SWAP ; + UNPAIR ; + SWAP ; + CAR ; + CDR ; + SWAP ; + UNPAIR ; + DUP 3 ; + CDR ; + CDR ; + CDR ; + DUP 2 ; + GET ; + IF_NONE { PUSH nat 0 } {} ; + PUSH nat 0 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { DROP 5 ; PUSH nat 0 } + { DUP 4 ; + PUSH int 1 ; + DUP 3 ; + SUB ; + DUP 7 ; + SWAP ; + EXEC ; + DUP 4 ; + DIG 2 ; + CDR ; + CDR ; + CAR ; + DUG 2 ; + PAIR ; + GET ; + IF_NONE { PUSH string "option is None" ; FAILWITH } {} ; + DUP 4 ; + DUP 2 ; + CDR ; + COMPARE ; + LE ; + IF { SWAP ; DIG 2 ; DIG 3 ; DIG 4 ; DIG 5 ; DROP 5 ; CAR } + { DROP ; + DUP 4 ; + CDR ; + CDR ; + CAR ; + PUSH nat 0 ; + DUP 4 ; + PAIR ; + GET ; + IF_NONE { PUSH string "option is None" ; FAILWITH } {} ; + DUP 4 ; + SWAP ; + CDR ; + COMPARE ; + GT ; + IF { DROP 5 ; PUSH nat 0 } + { PUSH int 1 ; + SWAP ; + SUB ; + DUP 5 ; + SWAP ; + EXEC ; + PUSH nat 0 ; + PAIR ; + LEFT nat ; + LOOP_LEFT + { UNPAIR ; + DUP 2 ; + DUP 2 ; + COMPARE ; + EQ ; + IF { SWAP ; + DROP ; + DUP 4 ; + CDR ; + CDR ; + CAR ; + SWAP ; + DUP 3 ; + PAIR ; + GET ; + IF_NONE { PUSH string "option is None" ; FAILWITH } {} ; + CAR ; + RIGHT (pair nat nat) } + { PUSH int 2 ; + DUP 2 ; + DUP 4 ; + SUB ; + DUP 8 ; + SWAP ; + EXEC ; + EDIV ; + IF_NONE { PUSH string "DIV by 0" ; FAILWITH } {} ; + CAR ; + DUP 3 ; + SUB ; + DUP 7 ; + SWAP ; + EXEC ; + DUP 6 ; + CDR ; + CDR ; + CAR ; + DUP 2 ; + DUP 6 ; + PAIR ; + GET ; + IF_NONE { PUSH string "option is None" ; FAILWITH } {} ; + DUP 6 ; + DUP 2 ; + CDR ; + COMPARE ; + EQ ; + IF { SWAP ; DIG 2 ; DIG 3 ; DROP 3 ; CAR ; RIGHT (pair nat nat) } + { DUP 6 ; + SWAP ; + CDR ; + COMPARE ; + GT ; + IF { DIG 2 ; DROP ; PUSH int 1 ; SWAP ; SUB ; DUP 6 ; SWAP ; EXEC } + { SWAP ; DROP ; SWAP } ; + SWAP ; + PAIR ; + LEFT nat } } } ; + SWAP ; + DIG 2 ; + DIG 3 ; + DIG 4 ; + DROP 4 } } } } ; +view "total_supply" unit nat { CDR ; CAR ; CDR ; CDR ; CAR ; CDR } } + +` diff --git a/src/services/contracts/token/hooks/useToken.ts b/src/services/contracts/token/hooks/useToken.ts index 8c38d3c8..66526503 100644 --- a/src/services/contracts/token/hooks/useToken.ts +++ b/src/services/contracts/token/hooks/useToken.ts @@ -7,7 +7,8 @@ import { deployMetadataCarrier } from "services/contracts/metadataCarrier/deploy import { useTezos } from "services/beacon/hooks/useTezos" import mixpanel from "mixpanel-browser" import { TokenContractParams } from "modules/creator/deployment/state/types" -import { deployTokenContract } from ".." +import { getCurrentBlock } from "services/utils/utils" +import { deployTokenContract } from "services/contracts/token" export const useTokenOriginate = (tokenData: TokenContractParams) => { const queryClient = useQueryClient() @@ -33,10 +34,13 @@ export const useTokenOriginate = (tokenData: TokenContractParams) => { tokenSettings } + const currentBlock = await getCurrentBlock(network) + const contract = await deployTokenContract({ ...mutateTokenData, tezos: tezosToolkit, - account + account, + currentBlock }) if (!contract) { diff --git a/src/services/contracts/token/index.ts b/src/services/contracts/token/index.ts index 89545d59..b235a152 100644 --- a/src/services/contracts/token/index.ts +++ b/src/services/contracts/token/index.ts @@ -2,7 +2,7 @@ import { MichelsonMap, TezosToolkit } from "@taquito/taquito" import BigNumber from "bignumber.js" import { TokenContractParams } from "modules/creator/deployment/state/types" import { formatUnits } from "../utils" -import fa2MultiAsset from "./assets/MultiAsset.json" +import fa2_single_asset_delegated from "./assets/fa2_single_asset_delegated" interface Tezos { tezos: TezosToolkit @@ -13,8 +13,9 @@ export const deployTokenContract = async ({ tokenSettings, tokenDistribution, tezos, - account -}: TokenContractParams & Tezos) => { + account, + currentBlock +}: TokenContractParams & Tezos & any) => { try { const metadata = MichelsonMap.fromLiteral({ "": Buffer.from("tezos-storage:contents", "ascii").toString("hex"), @@ -23,7 +24,7 @@ export const deployTokenContract = async ({ version: "v0.0.1", name: tokenSettings.name, description: tokenSettings.description, - authors: ["FA2 Bakery"], + authors: ["Tezos Homebase"], source: { tools: ["Ligo"] }, @@ -35,14 +36,17 @@ export const deployTokenContract = async ({ const storage = { admin: { admin: account, - pending_admin: null, paused: false }, assets: { - token_total_supply: MichelsonMap.fromLiteral({}), - ledger: MichelsonMap.fromLiteral({}), - operators: MichelsonMap.fromLiteral({}), - token_metadata: MichelsonMap.fromLiteral({}) + ledger: new MichelsonMap(), + voting_power_history: new MichelsonMap(), + voting_power_history_sizes: new MichelsonMap(), + delegates: new MichelsonMap(), + operators: new MichelsonMap(), + token_metadata: new MichelsonMap(), + total_supply: 0, + minter: account }, metadata: metadata } @@ -52,14 +56,19 @@ export const deployTokenContract = async ({ tokenSettings.decimals && formatUnits(new BigNumber(tokenSettings.totalSupply), tokenSettings.decimals) - totalSupply && storage.assets.token_total_supply.set(index, totalSupply.toString()) - tokenDistribution.holders.map((holder, holderIndex) => { - holder.amount && - tokenSettings.decimals && + storage.assets.total_supply = totalSupply.toString() + tokenDistribution.holders.map((holder: { amount: BigNumber.Value; walletAddress: any }) => { + if (holder.amount && tokenSettings.decimals) { storage.assets.ledger.set( - [holder.walletAddress, index], + holder.walletAddress, formatUnits(new BigNumber(holder.amount), tokenSettings.decimals).toString() ) + storage.assets.voting_power_history.set([holder.walletAddress, 0], { + from_block: currentBlock, + amount: formatUnits(new BigNumber(holder.amount), tokenSettings.decimals).toString() + }) + storage.assets.voting_power_history_sizes.set(holder.walletAddress, 1) + } }) storage.assets.token_metadata.set(index, { token_id: index, @@ -73,7 +82,7 @@ export const deployTokenContract = async ({ }) }) const t = tezos.wallet.originate({ - code: fa2MultiAsset, + code: fa2_single_asset_delegated, storage }) const c = await t.send()