From 08bbd1ead563816216a5ab43dd198c5a0229c477 Mon Sep 17 00:00:00 2001 From: Dima v Date: Wed, 4 May 2022 12:09:47 +0300 Subject: [PATCH] =?UTF-8?q?feat(payload):=20#24=20multiple=20send=20restor?= =?UTF-8?q?ed=20+=20memo=20fast=20implementation=20=E2=80=A6=20(#35)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(payload): #24 multiple send restored + memo fast implementation (usestate) * chore(payload): docs for #24 execute multi added --- apps/payload/src/auth/hooks/useAuth.ts | 20 ++--- apps/payload/src/outpost/components/Tx.tsx | 70 ++++++++--------- .../layout/message/OutpostCardMessageBody.tsx | 42 +++++----- .../message/OutpostCardMessageRenderer.tsx | 1 + .../message/OutpostMessageCardConstructor.tsx | 10 +-- .../layout/message/rendermodes/JsonRender.tsx | 4 +- .../messages/OutpostMessageExecuteMulti.tsx | 74 +++++++++++++----- .../outpost/hooks/useExecuteMessageCustom.ts | 6 +- apps/web/docs/payload/ui/message.md | 6 ++ .../static/outpost/OPMessageExecuteMulti.png | Bin 0 -> 32022 bytes packages/core/src/types/model.ts | 2 +- 11 files changed, 133 insertions(+), 102 deletions(-) create mode 100644 apps/web/static/outpost/OPMessageExecuteMulti.png diff --git a/apps/payload/src/auth/hooks/useAuth.ts b/apps/payload/src/auth/hooks/useAuth.ts index 241520b..e0f1bef 100644 --- a/apps/payload/src/auth/hooks/useAuth.ts +++ b/apps/payload/src/auth/hooks/useAuth.ts @@ -1,19 +1,13 @@ -import { useCallback, useMemo } from "react" -import { atom, useRecoilState } from "recoil" -import { encode } from "js-base64" -import { CreateTxOptions, Tx, isTxError } from "@terra-money/terra.js" -import { AccAddress, SignDoc } from "@terra-money/terra.js" -import { MnemonicKey, RawKey, SignatureV2 } from "@terra-money/terra.js" import { LedgerKey } from "@terra-money/ledger-terra-js" -import { useChainID } from "data/wallet" +import { AccAddress, CreateTxOptions, isTxError, MnemonicKey, RawKey, SignatureV2, SignDoc, Tx } from "@terra-money/terra.js" import { useLCDClient } from "data/queries/lcdClient" -import is from "../scripts/is" -import { PasswordError } from "../scripts/keystore" -import { getDecryptedKey, testPassword } from "../scripts/keystore" -import { getWallet, storeWallet } from "../scripts/keystore" -import { clearWallet, lockWallet } from "../scripts/keystore" -import { getStoredWallet, getStoredWallets } from "../scripts/keystore" +import { useChainID } from "data/wallet" +import { encode } from "js-base64" +import { useCallback, useMemo } from "react" +import { atom, useRecoilState } from "recoil" import encrypt from "../scripts/encrypt" +import is from "../scripts/is" +import { clearWallet, getDecryptedKey, getStoredWallet, getStoredWallets, getWallet, lockWallet, PasswordError, storeWallet, testPassword } from "../scripts/keystore" import useAvailable from "./useAvailable" const walletState = atom({ diff --git a/apps/payload/src/outpost/components/Tx.tsx b/apps/payload/src/outpost/components/Tx.tsx index 8282bf1..bb32641 100644 --- a/apps/payload/src/outpost/components/Tx.tsx +++ b/apps/payload/src/outpost/components/Tx.tsx @@ -1,47 +1,43 @@ -import { Fragment, ReactNode } from "react"; -import { useCallback, useEffect, useMemo, useState } from "react"; -import { useTranslation } from "react-i18next"; -import { QueryKey, useQuery } from "react-query"; -import { useNavigate } from "react-router-dom"; -import { useRecoilValue, useSetRecoilState } from "recoil"; -import classNames from "classnames"; -import BigNumber from "bignumber.js"; -import { head, isNil } from "ramda"; - import AccountBalanceWalletIcon from "@mui/icons-material/AccountBalanceWallet"; import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline"; +import { Coin, Coins, CreateTxOptions, Fee, LCDClient } from "@terra-money/terra.js"; +import { ConnectType, CreateTxFailed, TxFailed, useConnectedWallet, UserDenied, useWallet } from "@terra-money/wallet-provider"; import { isDenom, isDenomIBC, readDenom } from "@terra.kitchen/utils"; -import { Coin, Coins, LCDClient } from "@terra-money/terra.js"; -import { CreateTxOptions, Fee } from "@terra-money/terra.js"; -import { ConnectType, UserDenied } from "@terra-money/wallet-provider"; -import { CreateTxFailed, TxFailed } from "@terra-money/wallet-provider"; -import { useWallet, useConnectedWallet } from "@terra-money/wallet-provider"; - -import { Contents } from "types/components"; -import { DEFAULT_GAS_ADJUSTMENT } from "config/constants"; -import { has } from "utils/num"; -import { getAmount, sortCoins } from "utils/coin"; -import { getErrorMessage } from "utils/error"; -import { useCurrency } from "data/settings/Currency"; -import { queryKey, RefetchOptions } from "data/query"; -import { useAddress, useNetwork } from "data/wallet"; -import { isBroadcastingState, latestTxState } from "data/queries/tx"; -import { useBankBalance, useIsWalletEmpty } from "data/queries/bank"; - +import ConnectWallet from "app/sections/ConnectWallet"; +import { isWallet, useAuth } from "auth"; +import { PasswordError } from "auth/scripts/keystore"; +import BigNumber from "bignumber.js"; +import classNames from "classnames"; +import { Details } from "components/display"; +import { Modal } from "components/feedback"; +import { FormError, FormItem, Input, Select, Submit } from "components/form"; import { Pre } from "components/general"; import { Flex, Grid } from "components/layout"; -import { FormError, Submit, Select, Input, FormItem } from "components/form"; -import { Modal } from "components/feedback"; -import { Details } from "components/display"; import { Read } from "components/token"; -import ConnectWallet from "app/sections/ConnectWallet"; +import { DEFAULT_GAS_ADJUSTMENT } from "config/constants"; +import { useBankBalance, useIsWalletEmpty } from "data/queries/bank"; +import { isBroadcastingState, latestTxState } from "data/queries/tx"; +import { queryKey, RefetchOptions } from "data/query"; +import { useCurrency } from "data/settings/Currency"; +import { useAddress, useNetwork } from "data/wallet"; import useToPostMultisigTx from "pages/multisig/utils/useToPostMultisigTx"; -import { isWallet, useAuth } from "auth"; -import { PasswordError } from "auth/scripts/keystore"; - -import styles from "./Tx.module.scss"; +import { head, isNil } from "ramda"; +import { Fragment, ReactNode, useCallback, useEffect, useMemo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { QueryKey, useQuery } from "react-query"; +import { useNavigate } from "react-router-dom"; +import { useRecoilValue, useSetRecoilState } from "recoil"; import { useTx } from "txs/TxContext"; import { toInput } from "txs/utils"; +import { Contents } from "types/components"; +import { getAmount, sortCoins } from "utils/coin"; +import { getErrorMessage } from "utils/error"; +import { has } from "utils/num"; +import styles from "./Tx.module.scss"; + + + + interface Props { /* Only when the token is paid out of the balance held */ @@ -222,12 +218,12 @@ function Tx(props: Props) { throw new Error("Fee is not estimated"); const tx = createTx(values); - + console.log({tx}); if (!tx) throw new Error("Tx is not defined"); const gasCoins = new Coins([Coin.fromData(gasFee)]); const fee = new Fee(estimatedGas, gasCoins); - + if (isWallet.multisig(wallet)) { const unsignedTx = await auth.create({ ...tx, fee }); navigate(toPostMultisigTx(unsignedTx)); diff --git a/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageBody.tsx b/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageBody.tsx index d12482c..e36dc46 100644 --- a/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageBody.tsx +++ b/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageBody.tsx @@ -1,5 +1,5 @@ import { Button, Collapse } from '@mui/material'; -import { ContractMessage, ContractMessageTypes } from '@outp0st/core'; +import { ContractMessage, ContractMessageRenderModes, ContractMessageTypes } from '@outp0st/core'; import { useRO } from 'outpost/hooks/useRO'; import { useOutpostState } from 'outpost/state/useOutpostState'; import { FC, ReactNode } from 'react'; @@ -25,24 +25,24 @@ const generateButtons = (message: ContractMessage, updateMessage: any) => { return buttons; }; -// const generateButtonsRender = ( -// message: ContractMessage, -// updateMessage: any, -// ) => { -// let buttons: ReactNode[] = []; -// for (let item in ContractMessageRenderModes) { -// buttons.push( -// , -// ); -// } -// return buttons; -// }; +const generateButtonsRender = ( + message: ContractMessage, + updateMessage: any, +) => { + let buttons: ReactNode[] = []; + for (let item in ContractMessageRenderModes) { + buttons.push( + , + ); + } + return buttons; +}; // const generateButtonsMulti = (message: ContractMessage, updateMessage: any) => { // let buttons: ReactNode[] = []; @@ -68,11 +68,11 @@ const OutpostCardMessageBody: FC = ({ const ro = useRO(); return ( - {/* {!ro && ( + {!ro && ( {generateButtonsRender(message, updateMessage)} - )} */} + )} {!ro && ( {generateButtons(message, updateMessage)} diff --git a/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageRenderer.tsx b/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageRenderer.tsx index e8e01e5..6034efe 100644 --- a/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageRenderer.tsx +++ b/apps/payload/src/outpost/components/ui/layout/message/OutpostCardMessageRenderer.tsx @@ -7,6 +7,7 @@ interface OutpostCardMessageRendererProps { message: ContractMessage; failMessage?: string | undefined; validateError?: string | undefined; + placeholder?: string; } function OutpostCardMessageRenderer(props: OutpostCardMessageRendererProps) { diff --git a/apps/payload/src/outpost/components/ui/layout/message/OutpostMessageCardConstructor.tsx b/apps/payload/src/outpost/components/ui/layout/message/OutpostMessageCardConstructor.tsx index fe2210d..c57ed46 100644 --- a/apps/payload/src/outpost/components/ui/layout/message/OutpostMessageCardConstructor.tsx +++ b/apps/payload/src/outpost/components/ui/layout/message/OutpostMessageCardConstructor.tsx @@ -10,9 +10,9 @@ const OutpostMessageQuery = React.lazy( const OutpostMessageExecute = React.lazy( () => import('../../messages/OutpostMessageExecute'), ); -// const OutpostMessageExecuteMulti = React.lazy( -// () => import('../../messages/OutpostMessageExecuteMulti'), -// ); +const OutpostMessageExecuteMulti = React.lazy( + () => import('../../messages/OutpostMessageExecuteMulti'), +); const OutpostMessageInsta = React.lazy( () => import('../../messages/OutpostMessageInsta'), ); @@ -50,8 +50,8 @@ function GetMessageByType(message: ContractMessage) { return ; case ContractMessageTypes.EXECUTE: return ; - // case ContractMessageTypes.EXECUTE_MULTI: - // return ; + case ContractMessageTypes.EXECUTE_MULTI: + return ; case ContractMessageTypes.DOC: return ; default: diff --git a/apps/payload/src/outpost/components/ui/layout/message/rendermodes/JsonRender.tsx b/apps/payload/src/outpost/components/ui/layout/message/rendermodes/JsonRender.tsx index fe443db..0b873e1 100644 --- a/apps/payload/src/outpost/components/ui/layout/message/rendermodes/JsonRender.tsx +++ b/apps/payload/src/outpost/components/ui/layout/message/rendermodes/JsonRender.tsx @@ -7,6 +7,7 @@ interface JsonRenderProps { message: ContractMessage; failMessage?: string | undefined; validateError?: string | undefined; + placeholder?:string; } // function addNumbersToJsonString(noNumbersJsonString: string) { @@ -14,7 +15,7 @@ interface JsonRenderProps { // } -function JsonRender({ message, failMessage, validateError }: JsonRenderProps) { +function JsonRender({ message, failMessage, validateError, placeholder }: JsonRenderProps) { const { updateMessage } = useOutpostState(); let error: string = ''; if (validateError) error = `JSON error: ${validateError}`; @@ -23,6 +24,7 @@ function JsonRender({ message, failMessage, validateError }: JsonRenderProps) { { updateMessage({ ...message, message: e.target.value }); }} diff --git a/apps/payload/src/outpost/components/ui/messages/OutpostMessageExecuteMulti.tsx b/apps/payload/src/outpost/components/ui/messages/OutpostMessageExecuteMulti.tsx index 532efbb..dbb50ae 100644 --- a/apps/payload/src/outpost/components/ui/messages/OutpostMessageExecuteMulti.tsx +++ b/apps/payload/src/outpost/components/ui/messages/OutpostMessageExecuteMulti.tsx @@ -1,7 +1,10 @@ -import { ContractMessage } from '@outp0st/core'; +import { ContractMessage, ContractMessageTypes } from '@outp0st/core'; +import { MsgExecuteContract } from '@terra-money/terra.js'; +import { FormItem, Input } from 'components/form'; import { Button } from 'components/general'; import { useExecuteMessageCustom } from 'outpost/hooks/useExecuteMessageCustom'; import { validateMsg } from 'outpost/utils'; +import { useState } from 'react'; // import Tx from "txs/Tx" import TxContext from 'txs/TxContext'; import Tx from '../../Tx'; @@ -13,22 +16,22 @@ interface OutpostMessageExecuteMultiProps { message: ContractMessage; } -// interface CW20TransferMsg { -// transfer: { -// amount: string; -// recipient: string; -// }; -// } +interface CW20TransferMsg { + transfer: { + amount: string; + recipient: string; + }; +} export default function OutpostMessageExecuteMulti({ message, }: OutpostMessageExecuteMultiProps) { + const [memo, setMemo] = useState(""); const { tx } = useExecuteMessageCustom( message, - // (address, contractAddress, exec_msg, coins) - () => { + (address, contractAddress, exec_msg, coins) => { //console.log({ exec_msg }); - let result: any[] = []; + let result_msgs: any[] = []; // if ( // message.type === ContractMessageTypes.EXECUTE_MULTI && // message.multiType === ContractExecuteMultiMessageTypes.TRANSFER_LUV @@ -48,29 +51,58 @@ export default function OutpostMessageExecuteMulti({ // coins, // ); // }); - // } else if ( - // message.type === ContractMessageTypes.EXECUTE_MULTI && - // message.multiType === ContractExecuteMultiMessageTypes.SIMPLE - // ) { - // const msgs: CW20TransferMsg[] = exec_msg; - // result = msgs.map(msg => { - // return new MsgExecuteContract(address, contractAddress, msg, coins); - // }); - // } + //} + if ( + message.type === ContractMessageTypes.EXECUTE_MULTI + // && message.multiType === ContractExecuteMultiMessageTypes.SIMPLE + ) { + const msgs: CW20TransferMsg[] = exec_msg; + if (Array.isArray(msgs)) + result_msgs = msgs.map(msg => { + return new MsgExecuteContract(address, contractAddress, msg, coins); + }); + } //console.log({ result }); - return result; + return {memo, msgs:result_msgs}; }, ); + const placeholderString = ` + [ + { + "transfer": { + "amount": "2000000", + "recipient": "terra1ejksjvfvzpcqzg88nfd82hx2cv7g7lj9gjz669" + } + }, + { + "transfer": { + "amount": "2000000", + "recipient": "terra1ejksjvfvzpcqzg88nfd82hx2cv7g7lj9gjz669" + } + } + ] + ` const validateError = validateMsg(message.message || ''); + const finalTx = {...tx, memo} return ( - + {({ fee, submit, failMessage, resultQuery, disabled }) => ( + + + setMemo(e.target.value) + } + /> + {fee.render()} diff --git a/apps/payload/src/outpost/hooks/useExecuteMessageCustom.ts b/apps/payload/src/outpost/hooks/useExecuteMessageCustom.ts index 01b422f..2e8593c 100644 --- a/apps/payload/src/outpost/hooks/useExecuteMessageCustom.ts +++ b/apps/payload/src/outpost/hooks/useExecuteMessageCustom.ts @@ -15,7 +15,7 @@ export function useExecuteMessageCustom( contractAddress: string, exec_msg: any, coins: Coins, - ) => any[], + ) => {memo:string, msgs:any[]}, ): any { const { getContract } = useOutpostState(); const bankBalance = useBankBalance(); @@ -34,9 +34,9 @@ export function useExecuteMessageCustom( const exec_msg = parseJSON(msg); const coins = getCoins([defaultItem]); - const msgs = createMessagesFn(address, contractAddress!, exec_msg, coins); //[new MsgExecuteContract(address, contractAddress!, exec_msg, coins)]; + const {memo, msgs} = createMessagesFn(address, contractAddress!, exec_msg, coins); //[new MsgExecuteContract(address, contractAddress!, exec_msg, coins)]; - return { msgs }; + return { memo, msgs }; }, [address, contractAddress, msg, initialGasDenom, createMessagesFn]); const estimationTxValues = useMemo( () => [msg, contractAddress], diff --git a/apps/web/docs/payload/ui/message.md b/apps/web/docs/payload/ui/message.md index 2e177cc..3f8f9de 100644 --- a/apps/web/docs/payload/ui/message.md +++ b/apps/web/docs/payload/ui/message.md @@ -24,3 +24,9 @@ _Sometimes, we can't submit message - check the error message (often, it's not t 1. You can create Doc type message to document next step, or to indicate action 2. Click on Description text, to open/close markdown editor + +## EXECUTE_MULTI +![Message execute multi](/outpost/OPMessageExecuteMulti.png) + +1. You can arrange messages to execute them in one transaction +2. You can provide memo for this transaction \ No newline at end of file diff --git a/apps/web/static/outpost/OPMessageExecuteMulti.png b/apps/web/static/outpost/OPMessageExecuteMulti.png new file mode 100644 index 0000000000000000000000000000000000000000..01598097770165b238e787621688c8eb27569a03 GIT binary patch literal 32022 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 G^#1@x0{Yqj literal 0 HcmV?d00001 diff --git a/packages/core/src/types/model.ts b/packages/core/src/types/model.ts index 74780cd..e1dbf03 100644 --- a/packages/core/src/types/model.ts +++ b/packages/core/src/types/model.ts @@ -50,7 +50,7 @@ export enum ContractExecuteMultiMessageTypes { export enum ContractMessageTypes { INSTA = 'INSTA', EXECUTE = 'EXECUTE', - // EXECUTE_MULTI = 'EXECUTE_MULTI', + EXECUTE_MULTI = 'EXECUTE_MULTI', QUERY = 'QUERY', DOC = 'DOC', }