From 7add85f54475dbc21d6152ad5157205fa6fbfec2 Mon Sep 17 00:00:00 2001 From: Lucio Rubens Date: Thu, 19 Oct 2023 12:13:39 -0400 Subject: [PATCH 1/9] feat: add `/vm.m_run` message handler --- .../src/common/utils/client-utils.ts | 2 ++ .../common/validation/validation-message.ts | 33 +++++++++++++++++++ .../src/inject/executor/executor.ts | 6 ++++ .../src/inject/message/methods/transaction.ts | 7 +++- .../wallet/transaction-detail/use-status.ts | 10 +++++- .../src/services/transaction/message/vm/vm.ts | 16 +++++++++ .../message-info/message-info-vm.ts | 19 +++++++++++ .../src/transaction/transaction-builder.ts | 5 +++ .../src/transaction/transaction.ts | 2 +- 9 files changed, 97 insertions(+), 3 deletions(-) diff --git a/packages/adena-extension/src/common/utils/client-utils.ts b/packages/adena-extension/src/common/utils/client-utils.ts index 5ecf66fb..7d03f758 100644 --- a/packages/adena-extension/src/common/utils/client-utils.ts +++ b/packages/adena-extension/src/common/utils/client-utils.ts @@ -82,6 +82,8 @@ export function parseTxsEachDate(txs: object[]) { txDesc = `pkg: ${cur.pkg_path}`; } else if (cur.type === '/vm.m_addpkg') { txFunc = 'AddPkg'; + } else if (cur.type === '/vm.m_run') { + txDesc = `Run`; } else { txDesc = ''; } diff --git a/packages/adena-extension/src/common/validation/validation-message.ts b/packages/adena-extension/src/common/validation/validation-message.ts index 6492f07e..450ff161 100644 --- a/packages/adena-extension/src/common/validation/validation-message.ts +++ b/packages/adena-extension/src/common/validation/validation-message.ts @@ -99,3 +99,36 @@ export const validateTrasactionMessageOfAddPkg = (message: { [key in string]: an } return true; }; + +export const validateTrasactionMessageOfRun = (message: { [key in string]: any }) => { + if (!message.type || !message.value) { + return false; + } + if (message.type !== '/vm.m_run') { + return false; + } + if (typeof message.value !== 'object') { + return false; + } + if (typeof message.value.caller !== 'string') { + return false; + } + if (typeof message.value.send !== 'string') { + return false; + } + if (typeof message.value.package !== 'object') { + return false; + } + + const packageValue = message.value.package; + if (typeof packageValue?.Name !== 'string') { + return false; + } + if (typeof packageValue?.Path !== 'string') { + return false; + } + if (!Array.isArray(packageValue?.Files)) { + return false; + } + return true; +}; diff --git a/packages/adena-extension/src/inject/executor/executor.ts b/packages/adena-extension/src/inject/executor/executor.ts index 2319e2bb..30e6df8b 100644 --- a/packages/adena-extension/src/inject/executor/executor.ts +++ b/packages/adena-extension/src/inject/executor/executor.ts @@ -4,6 +4,7 @@ import { validateDoContractRequest, validateTrasactionMessageOfAddPkg, validateTrasactionMessageOfBankSend, + validateTrasactionMessageOfRun, validateTrasactionMessageOfVmCall, } from '@common/validation/validation-message'; @@ -116,6 +117,11 @@ export class AdenaExecutor { return InjectionMessageInstance.failure('INVALID_FORMAT'); } break; + case '/vm.m_run': + if (!validateTrasactionMessageOfRun(message)) { + return InjectionMessageInstance.failure('INVALID_FORMAT'); + } + break; default: return InjectionMessageInstance.failure('UNSUPPORTED_TYPE'); } diff --git a/packages/adena-extension/src/inject/message/methods/transaction.ts b/packages/adena-extension/src/inject/message/methods/transaction.ts index 744c0134..b91e0c1c 100644 --- a/packages/adena-extension/src/inject/message/methods/transaction.ts +++ b/packages/adena-extension/src/inject/message/methods/transaction.ts @@ -77,7 +77,7 @@ export const validateInjectionAddress = (currentAccountAddress: string) => { }; export const validateInjectionTransactionType = (requestData: InjectionMessage) => { - const messageTypes = ['/bank.MsgSend', '/vm.m_call', '/vm.m_addpkg']; + const messageTypes = ['/bank.MsgSend', '/vm.m_call', '/vm.m_addpkg', '/vm.m_run']; return requestData.data?.messages.every((message: any) => messageTypes.includes(message?.type)); }; @@ -103,6 +103,11 @@ export const validateInjectionTransactionMessage = ( return false; } break; + case '/vm.m_run': + if (currentAccountAddress !== message.value.caller) { + return false; + } + break; default: break; } diff --git a/packages/adena-extension/src/pages/wallet/transaction-detail/use-status.ts b/packages/adena-extension/src/pages/wallet/transaction-detail/use-status.ts index 9a4318da..de51204b 100644 --- a/packages/adena-extension/src/pages/wallet/transaction-detail/use-status.ts +++ b/packages/adena-extension/src/pages/wallet/transaction-detail/use-status.ts @@ -29,7 +29,7 @@ export interface TxProps { txType: string; } -type TxTypeValue = '/bank.MsgSend' | '/vm.m_call' | '/vm.m_addpkg'; +type TxTypeValue = '/bank.MsgSend' | '/vm.m_call' | '/vm.m_addpkg' | '/vm.m_run'; export interface ResultTxStateType { txStatusStyle: { [key in string]: any }; @@ -48,6 +48,7 @@ const statusSymbol = { '/bank.MsgSend': gnot, '/vm.m_call': contract, '/vm.m_addpkg': addpkg, + '/vm.m_run': gnot, }; const useStatus = () => { @@ -91,6 +92,13 @@ const useStatus = () => { txSend: 'AddPkg', }; } + if ((state.txType as TxTypeValue) === '/vm.m_run') { + result = { + ...result, + txTypeDesc: 'Run', + txSend: 'Run', + }; + } return result; }; diff --git a/packages/adena-extension/src/services/transaction/message/vm/vm.ts b/packages/adena-extension/src/services/transaction/message/vm/vm.ts index c81ee9cf..0aecd5ca 100644 --- a/packages/adena-extension/src/services/transaction/message/vm/vm.ts +++ b/packages/adena-extension/src/services/transaction/message/vm/vm.ts @@ -37,3 +37,19 @@ export const createMessageOfVmCall = (info: { }, }; }; + +export const createMessageOfVmRun = (info: { + caller: string; + send: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + packageInfo: any; +}) => { + return { + type: '/vm.m_run', + value: { + caller: info.caller, + send: info.send, + package: info.packageInfo + }, + }; +}; diff --git a/packages/adena-module/src/transaction/message-info/message-info-vm.ts b/packages/adena-module/src/transaction/message-info/message-info-vm.ts index 50a270f4..80aeca40 100644 --- a/packages/adena-module/src/transaction/message-info/message-info-vm.ts +++ b/packages/adena-module/src/transaction/message-info/message-info-vm.ts @@ -26,6 +26,12 @@ export interface VmAddPackage extends InfoType { deposit: string; } +export interface VmRun extends InfoType { + caller: string; + send: string; + package?: Package; +} + export const encodeVmCall = (writer: protobuf.Writer, messageInfo: VmCall) => { if (messageInfo.caller !== '') { writer.uint32(10).string(messageInfo.caller); @@ -80,3 +86,16 @@ export const encodeVmAddPackage = (writer: protobuf.Writer, messageInfo: VmAddPa } return writer; }; + +export const encodeVmRun = (writer: protobuf.Writer, messageInfo: VmAddPackage) => { + if (messageInfo.caller !== '') { + writer.uint32(10).string(messageInfo.caller); + } + if (messageInfo.send !== '') { + writer.uint32(18).string(messageInfo.send); + } + if (messageInfo.package !== undefined) { + encodePackage(writer.uint32(18).fork(), messageInfo.package).ldelim(); + } + return writer; +}; diff --git a/packages/adena-module/src/transaction/transaction-builder.ts b/packages/adena-module/src/transaction/transaction-builder.ts index b9c2f7d3..4d2d7d98 100644 --- a/packages/adena-module/src/transaction/transaction-builder.ts +++ b/packages/adena-module/src/transaction/transaction-builder.ts @@ -5,6 +5,7 @@ import { encodeBankSend, encodeVmAddPackage, encodeVmCall, + encodeVmRun, VmAddPackage, VmCall, } from './message-info'; @@ -112,6 +113,10 @@ export class TransactionBuilder { messageInfo = message.value as VmAddPackage; encodeVmAddPackage(writer, messageInfo); break; + case '/vm.m_run': + messageInfo = message.value as VmAddPackage; + encodeVmRun(writer, messageInfo); + break; default: throw new Error('Not Found Transaction Message Type'); } diff --git a/packages/adena-module/src/transaction/transaction.ts b/packages/adena-module/src/transaction/transaction.ts index b7dfae4b..a19d2a4c 100644 --- a/packages/adena-module/src/transaction/transaction.ts +++ b/packages/adena-module/src/transaction/transaction.ts @@ -4,7 +4,7 @@ import protobuf from 'protobufjs/minimal'; import { StdSignDoc } from '..'; import { TransactionEncode } from './transaction-encode'; -export type MessageTypeUrl = '/vm.m_call' | '/vm.m_addpkg' | '/bank.MsgSend'; +export type MessageTypeUrl = '/vm.m_call' | '/vm.m_addpkg' | '/vm.m_run' | '/bank.MsgSend'; export interface TransactionMessage { type: MessageTypeUrl; From 4b77dfbdf2440f3448515a6ab56fde10c464ee3f Mon Sep 17 00:00:00 2001 From: Lucio Rubens Date: Thu, 19 Oct 2023 12:33:32 -0400 Subject: [PATCH 2/9] fix: type --- .../src/transaction/message-info/message-info-vm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adena-module/src/transaction/message-info/message-info-vm.ts b/packages/adena-module/src/transaction/message-info/message-info-vm.ts index 80aeca40..a459fe9a 100644 --- a/packages/adena-module/src/transaction/message-info/message-info-vm.ts +++ b/packages/adena-module/src/transaction/message-info/message-info-vm.ts @@ -87,7 +87,7 @@ export const encodeVmAddPackage = (writer: protobuf.Writer, messageInfo: VmAddPa return writer; }; -export const encodeVmRun = (writer: protobuf.Writer, messageInfo: VmAddPackage) => { +export const encodeVmRun = (writer: protobuf.Writer, messageInfo: VmRun) => { if (messageInfo.caller !== '') { writer.uint32(10).string(messageInfo.caller); } From 3f09a5208bf5c10b3ddb7e077b4fe9348c94b176 Mon Sep 17 00:00:00 2001 From: Lucio Rubens Date: Thu, 19 Oct 2023 12:35:59 -0400 Subject: [PATCH 3/9] fix: transaction-builder --- packages/adena-module/src/transaction/transaction-builder.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/adena-module/src/transaction/transaction-builder.ts b/packages/adena-module/src/transaction/transaction-builder.ts index 4d2d7d98..52428bc2 100644 --- a/packages/adena-module/src/transaction/transaction-builder.ts +++ b/packages/adena-module/src/transaction/transaction-builder.ts @@ -8,6 +8,7 @@ import { encodeVmRun, VmAddPackage, VmCall, + VmRun, } from './message-info'; import { MessageTypeUrl, @@ -114,7 +115,7 @@ export class TransactionBuilder { encodeVmAddPackage(writer, messageInfo); break; case '/vm.m_run': - messageInfo = message.value as VmAddPackage; + messageInfo = message.value as VmRun; encodeVmRun(writer, messageInfo); break; default: From b8e93d5c55f3516b20cf5e0297cad4be287c7996 Mon Sep 17 00:00:00 2001 From: Lucio Rubens Date: Fri, 20 Oct 2023 10:36:53 -0400 Subject: [PATCH 4/9] fix: position --- .../src/transaction/message-info/message-info-vm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/adena-module/src/transaction/message-info/message-info-vm.ts b/packages/adena-module/src/transaction/message-info/message-info-vm.ts index a459fe9a..cca98ebe 100644 --- a/packages/adena-module/src/transaction/message-info/message-info-vm.ts +++ b/packages/adena-module/src/transaction/message-info/message-info-vm.ts @@ -95,7 +95,7 @@ export const encodeVmRun = (writer: protobuf.Writer, messageInfo: VmRun) => { writer.uint32(18).string(messageInfo.send); } if (messageInfo.package !== undefined) { - encodePackage(writer.uint32(18).fork(), messageInfo.package).ldelim(); + encodePackage(writer.uint32(26).fork(), messageInfo.package).ldelim(); } return writer; }; From 2068f6494700bbd09340c71b8277dd6298676c70 Mon Sep 17 00:00:00 2001 From: jinoosss Date: Sat, 21 Oct 2023 22:30:21 +0900 Subject: [PATCH 5/9] feat: Add Make Transaction Page --- .../src/common/utils/encoding-util.ts | 3 + .../make-transaction-container.tsx | 229 ++++++++++++++++++ ...e-transaction-ledger-loading-container.tsx | 85 +++++++ .../src/router/custom-router.tsx | 4 + packages/adena-extension/src/router/path.ts | 2 + 5 files changed, 323 insertions(+) create mode 100644 packages/adena-extension/src/common/utils/encoding-util.ts create mode 100644 packages/adena-extension/src/containers/make-transaction-container/make-transaction-container.tsx create mode 100644 packages/adena-extension/src/containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx diff --git a/packages/adena-extension/src/common/utils/encoding-util.ts b/packages/adena-extension/src/common/utils/encoding-util.ts new file mode 100644 index 00000000..2ed56203 --- /dev/null +++ b/packages/adena-extension/src/common/utils/encoding-util.ts @@ -0,0 +1,3 @@ +export function bytesToBase64(bytes: number[]) { + return Buffer.from(bytes).toString('base64'); +} diff --git a/packages/adena-extension/src/containers/make-transaction-container/make-transaction-container.tsx b/packages/adena-extension/src/containers/make-transaction-container/make-transaction-container.tsx new file mode 100644 index 00000000..72c38cd3 --- /dev/null +++ b/packages/adena-extension/src/containers/make-transaction-container/make-transaction-container.tsx @@ -0,0 +1,229 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import ApproveTransaction from '@components/approve/approve-transaction/approve-transaction'; +import { useLocation, useNavigate } from 'react-router-dom'; +import { useCurrentAccount } from '@hooks/use-current-account'; +import { InjectionMessage, InjectionMessageInstance } from '@inject/message'; +import { createFaviconByHostname, decodeParameter, parseParmeters } from '@common/utils/client-utils'; +import { useAdenaContext, useWalletContext } from '@hooks/use-context'; +import { StdSignDoc, Account, isLedgerAccount } from 'adena-module'; +import { RoutePath } from '@router/path'; +import { validateInjectionData } from '@inject/message/methods'; +import BigNumber from 'bignumber.js'; +import { useNetwork } from '@hooks/use-network'; +import { bytesToBase64 } from '@common/utils/encoding-util'; + +function mappedTransactionData(document: StdSignDoc) { + return { + messages: document.msgs, + contracts: document.msgs.map((message) => { + return { + type: message?.type || '', + function: message?.type === '/bank.MsgSend' ? 'Transfer' : message?.value?.func || '', + value: message?.value || '', + }; + }), + gasWanted: document.fee.gas, + gasFee: `${document.fee.amount[0].amount}${document.fee.amount[0].denom}`, + document, + } +} + +const DEFAULT_DENOM = 'GNOT'; + +const MakeTransactionContainer: React.FC = () => { + const navigate = useNavigate(); + const { gnoProvider } = useWalletContext(); + const { walletService, transactionService } = useAdenaContext(); + const { currentAccount } = useCurrentAccount(); + const [transactionData, setTrasactionData] = useState<{ [key in string]: any } | undefined>( + undefined, + ); + const { currentNetwork } = useNetwork(); + const [hostname, setHostname] = useState(''); + const location = useLocation(); + const [requestData, setReqeustData] = useState(); + const [favicon, setFavicon] = useState(null); + const [visibleTransactionInfo, setVisibleTransactionInfo] = useState(false); + const [document, setDocument] = useState(); + + const networkFee = useMemo(() => { + if (!document || document.fee.amount.length === 0) { + return { + amount: '1', + denom: DEFAULT_DENOM + }; + } + const networkFeeAmount = document.fee.amount[0].amount; + const networkFeeAmountOfGnot = + BigNumber(networkFeeAmount) + .shiftedBy(-6) + .toString(); + return { + amount: networkFeeAmountOfGnot, + denom: DEFAULT_DENOM + }; + }, [document]); + + useEffect(() => { + checkLockWallet(); + }, [walletService]); + + const checkLockWallet = () => { + walletService.isLocked().then(locked => locked && navigate(RoutePath.ApproveLogin + location.search)); + } + + useEffect(() => { + if (location.search) { + initRequestData(); + } + }, [location]); + + const initRequestData = () => { + const data = parseParmeters(location.search); + const parsedData = decodeParameter(data['data']); + setReqeustData({ ...parsedData, hostname: data['hostname'] }); + }; + + useEffect(() => { + if (currentAccount && requestData && gnoProvider) { + if (validate(currentAccount, requestData)) { + initFavicon(); + initTransactionData(); + } + } + }, [currentAccount, requestData, gnoProvider]); + + const validate = (currentAccount: Account, requestData: InjectionMessage) => { + const validationMessage = validateInjectionData(currentAccount.getAddress('g'), requestData); + if (validationMessage) { + chrome.runtime.sendMessage(validationMessage); + return false; + } + return true; + } + + const initFavicon = async () => { + const faviconData = await createFaviconByHostname(requestData?.hostname ?? ''); + setFavicon(faviconData); + }; + + const initTransactionData = async () => { + if (!currentAccount || !requestData || !currentNetwork) { + return false; + } + try { + const document = await transactionService.createDocument( + currentAccount, + currentNetwork.networkId, + requestData?.data?.messages, + requestData?.data?.gasWanted, + requestData?.data?.gasFee, + requestData?.data?.memo, + ); + setDocument(document); + setTrasactionData(mappedTransactionData(document)); + setHostname(requestData?.hostname ?? ''); + return true; + } catch (e) { + console.error(e); + const error: any = e; + if (error?.message === 'Transaction signing request was rejected by the user') { + chrome.runtime.sendMessage( + InjectionMessageInstance.failure( + 'SIGN_REJECTED', + requestData?.data, + requestData?.key, + ), + ); + } + } + return false; + }; + + const sendTransaction = async () => { + if (!document || !currentAccount) { + chrome.runtime.sendMessage( + InjectionMessageInstance.failure('UNEXPECTED_ERROR', {}, requestData?.key), + ); + return false; + } + + try { + const signature = await transactionService.createSignature( + currentAccount, + document + ); + const transactionBytes = await transactionService.createTransaction(document, signature); + const encodedTransaction = bytesToBase64(transactionBytes); + chrome.runtime.sendMessage( + InjectionMessageInstance.success('MAKE_TX', { encodedTransaction }, requestData?.key), + ); + } catch (e) { + if (e instanceof Error) { + const message = e.message; + if (message.includes('Ledger')) { + return false; + } + chrome.runtime.sendMessage( + InjectionMessageInstance.failure( + 'SIGN_FAILED', + { error: { message } }, + requestData?.key, + ), + ); + } + chrome.runtime.sendMessage( + InjectionMessageInstance.failure( + 'SIGN_FAILED', + {}, + requestData?.key, + ), + ); + } + return false; + }; + + const onToggleTransactionData = (visibleTransactionInfo: boolean) => { + setVisibleTransactionInfo(visibleTransactionInfo); + }; + + const onClickConfirm = () => { + if (!currentAccount) { + return; + } + if (isLedgerAccount(currentAccount)) { + navigate(RoutePath.ApproveSignLoading, { + state: { + document, + requestData + } + }); + return; + } + sendTransaction(); + }; + + const onClickCancel = () => { + chrome.runtime.sendMessage( + InjectionMessageInstance.failure('SIGN_REJECTED', {}, requestData?.key), + ); + }; + + return ( + + ); +}; + +export default MakeTransactionContainer; \ No newline at end of file diff --git a/packages/adena-extension/src/containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx b/packages/adena-extension/src/containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx new file mode 100644 index 00000000..0b5c3a3d --- /dev/null +++ b/packages/adena-extension/src/containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx @@ -0,0 +1,85 @@ +import React, { useEffect, useState } from 'react'; +import { useLocation } from 'react-router-dom'; +import { StdSignDoc, isLedgerAccount } from 'adena-module'; +import ApproveLedgerLoading from '@components/approve/approve-ledger-loading/approve-ledger-loading'; +import { InjectionMessage, InjectionMessageInstance } from '@inject/message'; +import { useCurrentAccount } from '@hooks/use-current-account'; +import { useAdenaContext } from '@hooks/use-context'; +import { bytesToBase64 } from '@common/utils/encoding-util'; + +interface MakeTransactionLedgerLoadingState { + requestData?: InjectionMessage; + document?: StdSignDoc; +} + +const MakeTransactionLedgerLoadingContainer: React.FC = () => { + const location = useLocation(); + const { transactionService } = useAdenaContext(); + const { document, requestData } = location.state as MakeTransactionLedgerLoadingState; + const { currentAccount } = useCurrentAccount(); + const [completed, setCompleted] = useState(false); + + useEffect(() => { + if (currentAccount) { + requestTransaction(); + } + }, [currentAccount]); + + const requestTransaction = async () => { + if (completed) { + return; + } + const result = await createLedgerTransaction(); + setCompleted(result); + setTimeout(() => !result && requestTransaction(), 1000); + }; + + const createLedgerTransaction = async () => { + if (!currentAccount || !document) { + return false; + } + + if (!isLedgerAccount(currentAccount)) { + return false; + } + + const result = await transactionService.createSignatureWithLedger(currentAccount, document).then(async (signature) => { + const transactionBytes = await transactionService.createTransaction(document, signature); + const encodedTransaction = bytesToBase64(transactionBytes); + chrome.runtime.sendMessage( + InjectionMessageInstance.success('MAKE_TX', { encodedTransaction }, requestData?.key), + ); + return true; + }).catch((error: Error) => { + if (error.message === 'Transaction signing request was rejected by the user') { + chrome.runtime.sendMessage( + InjectionMessageInstance.failure('SIGN_REJECTED', {}, requestData?.key), + ); + return true; + } + if (error.message.includes('Ledger')) { + return false; + } + return false; + }); + return result; + }; + + const onClickCancel = () => { + if (!requestData) { + window.close(); + return; + } + chrome.runtime.sendMessage( + InjectionMessageInstance.failure('SIGN_REJECTED', requestData.data, requestData.key), + ); + } + + return ( + + ); +}; + +export default MakeTransactionLedgerLoadingContainer; \ No newline at end of file diff --git a/packages/adena-extension/src/router/custom-router.tsx b/packages/adena-extension/src/router/custom-router.tsx index 2f557b53..38188585 100644 --- a/packages/adena-extension/src/router/custom-router.tsx +++ b/packages/adena-extension/src/router/custom-router.tsx @@ -72,6 +72,8 @@ import EditCustomNetworkPage from '@pages/wallet/edit-custom-network'; import ApproveChangingNetworkPage from '@pages/wallet/approve-changing-network/approve-changing-network'; import ApproveAddingNetworkPage from '@pages/wallet/approve-adding-network/approve-adding-network'; import AccountDetailsPage from '@pages/wallet/account-details'; +import MakeTransactionContainer from '@containers/make-transaction-container/make-transaction-container'; +import MakeTransactionLedgerLoadingContainer from '@containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container'; export const CustomRouter = () => { const { wallet } = useWalletContext(); @@ -122,6 +124,8 @@ export const CustomRouter = () => { } /> } /> } /> + } /> + } /> } /> } /> } /> diff --git a/packages/adena-extension/src/router/path.ts b/packages/adena-extension/src/router/path.ts index 1f109423..d1f26267 100644 --- a/packages/adena-extension/src/router/path.ts +++ b/packages/adena-extension/src/router/path.ts @@ -32,6 +32,8 @@ export enum RoutePath { ApproveTransactionLoading = '/approve/wallet/transaction/loading', ApproveSign = '/approve/wallet/sign', ApproveSignLoading = '/approve/wallet/sign/loading', + MakeTransaction = '/approve/wallet/make-tx', + MakeTransactionLoading = '/approve/wallet/make-tx/loading', ApproveEstablish = '/approve/wallet/establish', ApproveChangingNetwork = '/approve/wallet/network/change', ApproveAddingNetwork = '/approve/wallet/network/add', From 73219b19e9a073eb30c2b518edfacfb6a15dd12b Mon Sep 17 00:00:00 2001 From: jinoosss Date: Sat, 21 Oct 2023 22:31:01 +0900 Subject: [PATCH 6/9] feat: Add MakeTx Method --- packages/adena-extension/src/inject.ts | 5 ++++ .../src/inject/executor/executor.ts | 9 ++++++++ .../src/inject/message/message-handler.ts | 7 ++++++ .../src/inject/message/message.ts | 4 ++++ .../src/inject/message/methods/transaction.ts | 23 +++++++++++++++++++ 5 files changed, 48 insertions(+) diff --git a/packages/adena-extension/src/inject.ts b/packages/adena-extension/src/inject.ts index 657e3d16..dc0432e9 100644 --- a/packages/adena-extension/src/inject.ts +++ b/packages/adena-extension/src/inject.ts @@ -32,6 +32,11 @@ const init = () => { const response = await executor.signAmino(mesasage); return response; }, + async MakeTx(mesasage: RequestDocontractMessage) { + const executor = new AdenaExecutor(); + const response = await executor.makeTx(mesasage); + return response; + }, async AddNetwork(chain: RequestAddedNetworkMessage) { const executor = new AdenaExecutor(); const response = await executor.addNetwork(chain); diff --git a/packages/adena-extension/src/inject/executor/executor.ts b/packages/adena-extension/src/inject/executor/executor.ts index 2319e2bb..52942414 100644 --- a/packages/adena-extension/src/inject/executor/executor.ts +++ b/packages/adena-extension/src/inject/executor/executor.ts @@ -85,6 +85,15 @@ export class AdenaExecutor { return this.sendEventMessage(eventMessage); }; + public makeTx = (params: RequestDocontractMessage) => { + const result = this.valdiateContractMessage(params); + if (result) { + return this.sendEventMessage(result); + } + const eventMessage = AdenaExecutor.createEventMessage('MAKE_TX', params); + return this.sendEventMessage(eventMessage); + }; + public addNetwork = (chain: RequestAddedNetworkMessage) => { const eventMessage = AdenaExecutor.createEventMessage('ADD_NETWORK', { ...chain }); return this.sendEventMessage(eventMessage); diff --git a/packages/adena-extension/src/inject/message/message-handler.ts b/packages/adena-extension/src/inject/message/message-handler.ts index 50c4c84f..3a131d98 100644 --- a/packages/adena-extension/src/inject/message/message-handler.ts +++ b/packages/adena-extension/src/inject/message/message-handler.ts @@ -112,6 +112,13 @@ export class MessageHandler { } }); break; + case 'MAKE_TX': + HandlerMethod.checkEstablished(message, sendResponse).then((isEstablished) => { + if (isEstablished) { + HandlerMethod.makeTx(message, sendResponse); + } + }); + break; default: break; } diff --git a/packages/adena-extension/src/inject/message/message.ts b/packages/adena-extension/src/inject/message/message.ts index f6c2f220..0ce061f3 100644 --- a/packages/adena-extension/src/inject/message/message.ts +++ b/packages/adena-extension/src/inject/message/message.ts @@ -17,6 +17,10 @@ const MESSAGE_TYPES = { code: 0, description: 'Sign Amino', }, + MAKE_TX: { + code: 0, + description: 'Make Transaction', + }, ADD_NETWORK: { code: 0, description: 'Add Network', diff --git a/packages/adena-extension/src/inject/message/methods/transaction.ts b/packages/adena-extension/src/inject/message/methods/transaction.ts index 744c0134..e17def53 100644 --- a/packages/adena-extension/src/inject/message/methods/transaction.ts +++ b/packages/adena-extension/src/inject/message/methods/transaction.ts @@ -26,6 +26,29 @@ export const signAmino = async ( ); }; +export const makeTx = async ( + requestData: InjectionMessage, + sendResponse: (message: any) => void, +) => { + const core = new InjectCore(); + const locked = await core.walletService.isLocked(); + if (!locked) { + const address = await core.getCurrentAddress(); + const validationMessage = validateInjectionData(address, requestData); + if (validationMessage) { + sendResponse(validationMessage); + return; + } + } + + HandlerMethod.createPopup( + RoutePath.MakeTransaction, + requestData, + InjectionMessageInstance.failure('SIGN_REJECTED', {}, requestData.key), + sendResponse, + ); +}; + export const doContract = async ( requestData: InjectionMessage, sendResponse: (message: any) => void, From 23484cf9637a0e057f018b33d9c69c09faa69ac2 Mon Sep 17 00:00:00 2001 From: jinoosss <112360739+jinoosss@users.noreply.github.com> Date: Sun, 22 Oct 2023 23:52:57 +0900 Subject: [PATCH 7/9] fix: Rename method `adena.MakeTx` to `adena.SignTx` (#284) --- .../approve-sign-transaction-container.tsx} | 8 ++++---- ...rove-sign-transaction-ledger-loading-container.tsx} | 10 +++++----- packages/adena-extension/src/inject.ts | 4 ++-- .../adena-extension/src/inject/executor/executor.ts | 4 ++-- .../src/inject/message/message-handler.ts | 4 ++-- packages/adena-extension/src/inject/message/message.ts | 4 ++-- .../src/inject/message/methods/transaction.ts | 4 ++-- packages/adena-extension/src/router/custom-router.tsx | 8 ++++---- packages/adena-extension/src/router/path.ts | 4 ++-- 9 files changed, 25 insertions(+), 25 deletions(-) rename packages/adena-extension/src/containers/{make-transaction-container/make-transaction-container.tsx => approve-sign-transaction-container/approve-sign-transaction-container.tsx} (97%) rename packages/adena-extension/src/containers/{make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx => approve-sign-transaction-ledger-loading-container/approve-sign-transaction-ledger-loading-container.tsx} (87%) diff --git a/packages/adena-extension/src/containers/make-transaction-container/make-transaction-container.tsx b/packages/adena-extension/src/containers/approve-sign-transaction-container/approve-sign-transaction-container.tsx similarity index 97% rename from packages/adena-extension/src/containers/make-transaction-container/make-transaction-container.tsx rename to packages/adena-extension/src/containers/approve-sign-transaction-container/approve-sign-transaction-container.tsx index 72c38cd3..bcdabb30 100644 --- a/packages/adena-extension/src/containers/make-transaction-container/make-transaction-container.tsx +++ b/packages/adena-extension/src/containers/approve-sign-transaction-container/approve-sign-transaction-container.tsx @@ -30,7 +30,7 @@ function mappedTransactionData(document: StdSignDoc) { const DEFAULT_DENOM = 'GNOT'; -const MakeTransactionContainer: React.FC = () => { +const ApproveSignTransactionContainer: React.FC = () => { const navigate = useNavigate(); const { gnoProvider } = useWalletContext(); const { walletService, transactionService } = useAdenaContext(); @@ -156,7 +156,7 @@ const MakeTransactionContainer: React.FC = () => { const transactionBytes = await transactionService.createTransaction(document, signature); const encodedTransaction = bytesToBase64(transactionBytes); chrome.runtime.sendMessage( - InjectionMessageInstance.success('MAKE_TX', { encodedTransaction }, requestData?.key), + InjectionMessageInstance.success('SIGN_TX', { encodedTransaction }, requestData?.key), ); } catch (e) { if (e instanceof Error) { @@ -211,7 +211,7 @@ const MakeTransactionContainer: React.FC = () => { return ( { ); }; -export default MakeTransactionContainer; \ No newline at end of file +export default ApproveSignTransactionContainer; \ No newline at end of file diff --git a/packages/adena-extension/src/containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx b/packages/adena-extension/src/containers/approve-sign-transaction-ledger-loading-container/approve-sign-transaction-ledger-loading-container.tsx similarity index 87% rename from packages/adena-extension/src/containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx rename to packages/adena-extension/src/containers/approve-sign-transaction-ledger-loading-container/approve-sign-transaction-ledger-loading-container.tsx index 0b5c3a3d..590dd36a 100644 --- a/packages/adena-extension/src/containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container.tsx +++ b/packages/adena-extension/src/containers/approve-sign-transaction-ledger-loading-container/approve-sign-transaction-ledger-loading-container.tsx @@ -7,15 +7,15 @@ import { useCurrentAccount } from '@hooks/use-current-account'; import { useAdenaContext } from '@hooks/use-context'; import { bytesToBase64 } from '@common/utils/encoding-util'; -interface MakeTransactionLedgerLoadingState { +interface ApproveSignTransactionLedgerLoadingState { requestData?: InjectionMessage; document?: StdSignDoc; } -const MakeTransactionLedgerLoadingContainer: React.FC = () => { +const ApproveSignTransactionLedgerLoadingContainer: React.FC = () => { const location = useLocation(); const { transactionService } = useAdenaContext(); - const { document, requestData } = location.state as MakeTransactionLedgerLoadingState; + const { document, requestData } = location.state as ApproveSignTransactionLedgerLoadingState; const { currentAccount } = useCurrentAccount(); const [completed, setCompleted] = useState(false); @@ -47,7 +47,7 @@ const MakeTransactionLedgerLoadingContainer: React.FC = () => { const transactionBytes = await transactionService.createTransaction(document, signature); const encodedTransaction = bytesToBase64(transactionBytes); chrome.runtime.sendMessage( - InjectionMessageInstance.success('MAKE_TX', { encodedTransaction }, requestData?.key), + InjectionMessageInstance.success('SIGN_TX', { encodedTransaction }, requestData?.key), ); return true; }).catch((error: Error) => { @@ -82,4 +82,4 @@ const MakeTransactionLedgerLoadingContainer: React.FC = () => { ); }; -export default MakeTransactionLedgerLoadingContainer; \ No newline at end of file +export default ApproveSignTransactionLedgerLoadingContainer; \ No newline at end of file diff --git a/packages/adena-extension/src/inject.ts b/packages/adena-extension/src/inject.ts index dc0432e9..32b2ea57 100644 --- a/packages/adena-extension/src/inject.ts +++ b/packages/adena-extension/src/inject.ts @@ -32,9 +32,9 @@ const init = () => { const response = await executor.signAmino(mesasage); return response; }, - async MakeTx(mesasage: RequestDocontractMessage) { + async SignTx(mesasage: RequestDocontractMessage) { const executor = new AdenaExecutor(); - const response = await executor.makeTx(mesasage); + const response = await executor.signTx(mesasage); return response; }, async AddNetwork(chain: RequestAddedNetworkMessage) { diff --git a/packages/adena-extension/src/inject/executor/executor.ts b/packages/adena-extension/src/inject/executor/executor.ts index 49b29744..cb90e309 100644 --- a/packages/adena-extension/src/inject/executor/executor.ts +++ b/packages/adena-extension/src/inject/executor/executor.ts @@ -86,12 +86,12 @@ export class AdenaExecutor { return this.sendEventMessage(eventMessage); }; - public makeTx = (params: RequestDocontractMessage) => { + public signTx = (params: RequestDocontractMessage) => { const result = this.valdiateContractMessage(params); if (result) { return this.sendEventMessage(result); } - const eventMessage = AdenaExecutor.createEventMessage('MAKE_TX', params); + const eventMessage = AdenaExecutor.createEventMessage('SIGN_TX', params); return this.sendEventMessage(eventMessage); }; diff --git a/packages/adena-extension/src/inject/message/message-handler.ts b/packages/adena-extension/src/inject/message/message-handler.ts index 3a131d98..7366eb69 100644 --- a/packages/adena-extension/src/inject/message/message-handler.ts +++ b/packages/adena-extension/src/inject/message/message-handler.ts @@ -112,10 +112,10 @@ export class MessageHandler { } }); break; - case 'MAKE_TX': + case 'SIGN_TX': HandlerMethod.checkEstablished(message, sendResponse).then((isEstablished) => { if (isEstablished) { - HandlerMethod.makeTx(message, sendResponse); + HandlerMethod.signTransaction(message, sendResponse); } }); break; diff --git a/packages/adena-extension/src/inject/message/message.ts b/packages/adena-extension/src/inject/message/message.ts index 0ce061f3..82bf4d9f 100644 --- a/packages/adena-extension/src/inject/message/message.ts +++ b/packages/adena-extension/src/inject/message/message.ts @@ -17,9 +17,9 @@ const MESSAGE_TYPES = { code: 0, description: 'Sign Amino', }, - MAKE_TX: { + SIGN_TX: { code: 0, - description: 'Make Transaction', + description: 'Sign Transaction', }, ADD_NETWORK: { code: 0, diff --git a/packages/adena-extension/src/inject/message/methods/transaction.ts b/packages/adena-extension/src/inject/message/methods/transaction.ts index d5e33d13..97850632 100644 --- a/packages/adena-extension/src/inject/message/methods/transaction.ts +++ b/packages/adena-extension/src/inject/message/methods/transaction.ts @@ -26,7 +26,7 @@ export const signAmino = async ( ); }; -export const makeTx = async ( +export const signTransaction = async ( requestData: InjectionMessage, sendResponse: (message: any) => void, ) => { @@ -42,7 +42,7 @@ export const makeTx = async ( } HandlerMethod.createPopup( - RoutePath.MakeTransaction, + RoutePath.ApproveSignTransaction, requestData, InjectionMessageInstance.failure('SIGN_REJECTED', {}, requestData.key), sendResponse, diff --git a/packages/adena-extension/src/router/custom-router.tsx b/packages/adena-extension/src/router/custom-router.tsx index 38188585..a810b1ae 100644 --- a/packages/adena-extension/src/router/custom-router.tsx +++ b/packages/adena-extension/src/router/custom-router.tsx @@ -72,8 +72,8 @@ import EditCustomNetworkPage from '@pages/wallet/edit-custom-network'; import ApproveChangingNetworkPage from '@pages/wallet/approve-changing-network/approve-changing-network'; import ApproveAddingNetworkPage from '@pages/wallet/approve-adding-network/approve-adding-network'; import AccountDetailsPage from '@pages/wallet/account-details'; -import MakeTransactionContainer from '@containers/make-transaction-container/make-transaction-container'; -import MakeTransactionLedgerLoadingContainer from '@containers/make-transaction-ledger-loading-container/make-transaction-ledger-loading-container'; +import ApproveSignTransactionContainer from '@containers/approve-sign-transaction-container/approve-sign-transaction-container'; +import ApproveSignTransactionLedgerLoadingContainer from '@containers/approve-sign-transaction-ledger-loading-container/approve-sign-transaction-ledger-loading-container'; export const CustomRouter = () => { const { wallet } = useWalletContext(); @@ -124,8 +124,8 @@ export const CustomRouter = () => { } /> } /> } /> - } /> - } /> + } /> + } /> } /> } /> } /> diff --git a/packages/adena-extension/src/router/path.ts b/packages/adena-extension/src/router/path.ts index d1f26267..bdd7c31c 100644 --- a/packages/adena-extension/src/router/path.ts +++ b/packages/adena-extension/src/router/path.ts @@ -32,8 +32,8 @@ export enum RoutePath { ApproveTransactionLoading = '/approve/wallet/transaction/loading', ApproveSign = '/approve/wallet/sign', ApproveSignLoading = '/approve/wallet/sign/loading', - MakeTransaction = '/approve/wallet/make-tx', - MakeTransactionLoading = '/approve/wallet/make-tx/loading', + ApproveSignTransaction = '/approve/wallet/sign-tx', + ApproveSignTransactionLoading = '/approve/wallet/sign-tx/loading', ApproveEstablish = '/approve/wallet/establish', ApproveChangingNetwork = '/approve/wallet/network/change', ApproveAddingNetwork = '/approve/wallet/network/add', From d179ca924f0a83959a11471c375aaf8583f56fe3 Mon Sep 17 00:00:00 2001 From: jinoosss Date: Sun, 22 Oct 2023 22:21:13 +0900 Subject: [PATCH 8/9] chore: Change to package version 1.8.1 --- package.json | 2 +- packages/adena-extension/package.json | 2 +- packages/adena-extension/public/manifest.json | 2 +- packages/adena-module/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index fef75169..85c91f32 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "adena-wallet", - "version": "1.8.0", + "version": "1.8.1", "description": "Adena Wallet", "license": "Adena License", "private": true, diff --git a/packages/adena-extension/package.json b/packages/adena-extension/package.json index da379a33..1cd778cf 100644 --- a/packages/adena-extension/package.json +++ b/packages/adena-extension/package.json @@ -1,6 +1,6 @@ { "name": "adena-extension", - "version": "1.8.0", + "version": "1.8.1", "private": true, "description": "Adena is a friendly browser extension wallet for the Gnoland blockchain.", "scripts": { diff --git a/packages/adena-extension/public/manifest.json b/packages/adena-extension/public/manifest.json index 835878da..eaa8cf58 100644 --- a/packages/adena-extension/public/manifest.json +++ b/packages/adena-extension/public/manifest.json @@ -2,7 +2,7 @@ "name": "Adena", "description": "Adena is a friendly browser extension wallet for the Gnoland blockchain.", "manifest_version": 3, - "version": "1.8.0", + "version": "1.8.1", "action": { "default_popup": "popup.html" }, diff --git a/packages/adena-module/package.json b/packages/adena-module/package.json index 1ee01d7c..843eac55 100644 --- a/packages/adena-module/package.json +++ b/packages/adena-module/package.json @@ -1,7 +1,7 @@ { "name": "adena-module", "private": true, - "version": "1.8.0", + "version": "1.8.1", "description": "Adena's Wallet", "main": "./dist/index.umd.js", "module": "./dist/index.esm.js", From f1835eda26abbf557c76bb92a23618d2c34ef567 Mon Sep 17 00:00:00 2001 From: jinoosss Date: Sun, 22 Oct 2023 23:58:32 +0900 Subject: [PATCH 9/9] chore: Update build version --- scripts/build.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build.info b/scripts/build.info index a0522628..9327b820 100644 --- a/scripts/build.info +++ b/scripts/build.info @@ -1 +1 @@ -20230303-4 +qa.1 \ No newline at end of file