diff --git a/packages/adena-extension/src/common/validation/validation-transaction.ts b/packages/adena-extension/src/common/validation/validation-transaction.ts index 382e116bf..f49423aa9 100644 --- a/packages/adena-extension/src/common/validation/validation-transaction.ts +++ b/packages/adena-extension/src/common/validation/validation-transaction.ts @@ -15,6 +15,7 @@ export const validateInjectionData = (requestData: InjectionMessage): InjectionM export const validateInjectionDataWithAddress = ( requestData: InjectionMessage, address: string, + multisig?: boolean, ): InjectionMessage | null => { if (!validateInjectionTransactionType(requestData)) { return InjectionMessageInstance.failure( @@ -24,7 +25,7 @@ export const validateInjectionDataWithAddress = ( ); } - if (!validateInjectionTransactionMessageWithAddress(requestData, address)) { + if (!multisig && !validateInjectionTransactionMessageWithAddress(requestData, address)) { return InjectionMessageInstance.failure( WalletResponseFailureType.ACCOUNT_MISMATCH, { requestData, address }, diff --git a/packages/adena-extension/src/components/molecules/approve-transaction/index.tsx b/packages/adena-extension/src/components/molecules/approve-transaction/index.tsx index b258a020a..feeefaf56 100644 --- a/packages/adena-extension/src/components/molecules/approve-transaction/index.tsx +++ b/packages/adena-extension/src/components/molecules/approve-transaction/index.tsx @@ -51,6 +51,7 @@ export interface ApproveTransactionProps { onClickConfirm: () => void; onClickCancel: () => void; useNetworkFeeReturn: UseNetworkFeeReturn; + multisig?: boolean; } export const ApproveTransaction: React.FC = ({ @@ -78,10 +79,15 @@ export const ApproveTransaction: React.FC = ({ onClickConfirm, onClickCancel, openScannerLink, + multisig, }) => { const [openedNetworkFeeSetting, setOpenedNetworkFeeSetting] = useState(false); const disabledApprove = useMemo(() => { + if (multisig) { + return false + } + if (useNetworkFeeReturn.isLoading) { return true; } diff --git a/packages/adena-extension/src/pages/popup/wallet/approve-sign-transaction/index.tsx b/packages/adena-extension/src/pages/popup/wallet/approve-sign-transaction/index.tsx index 3d213b9f2..1fa293b39 100644 --- a/packages/adena-extension/src/pages/popup/wallet/approve-sign-transaction/index.tsx +++ b/packages/adena-extension/src/pages/popup/wallet/approve-sign-transaction/index.tsx @@ -78,7 +78,21 @@ const ApproveSignTransactionContainer: React.FC = () => { const { openScannerLink } = useLink(); const { data: currentBalance = null } = useGetGnotBalance(); - const useNetworkFeeReturn = useNetworkFee(document, true); + let useNetworkFeeReturn = useNetworkFee(document, true); + + if (requestData?.data?.multisig) { + useNetworkFeeReturn = { + ...useNetworkFeeReturn, + networkFee: { + amount: requestData.data.gasFee.toString(), + denom: GasToken.denom, + }, + isLoading: false, + isSimulateError: false, + currentGasFeeRawAmount: requestData.data.gasFee, + } + } + const networkFee = useNetworkFeeReturn.networkFee; const processing = useMemo(() => processType !== 'INIT', [processType]); @@ -187,6 +201,7 @@ const ApproveSignTransactionContainer: React.FC = () => { const validationMessage = validateInjectionDataWithAddress( requestData, await currentAccount.getAddress(defaultAddressPrefix), + requestData.data?.multisig, ); if (validationMessage) { chrome.runtime.sendMessage(validationMessage); @@ -247,22 +262,45 @@ const ApproveSignTransactionContainer: React.FC = () => { } const currentMemo = memo; - const currentGasPrice = useNetworkFeeReturn.currentGasFeeRawAmount; - const currentGasWanted = useNetworkFeeReturn.currentGasInfo?.gasWanted || 0; - - const updatedDocument: Document = { - ...document, - memo: currentMemo, - fee: { - amount: [ - { - amount: currentGasPrice.toString(), - denom: GasToken.denom, - }, - ], - gas: currentGasWanted.toString(), - }, - }; + + let updatedDocument: Document + if (requestData?.data?.multisig) { + const currentGasPrice = requestData.data.gasFee + const currentGasWanted = requestData.data.gasWanted + + updatedDocument = { + ...document, + memo: currentMemo, + account_number: requestData.data.accountNumber.toString(), + sequence: requestData.data.sequence.toString(), + fee: { + amount: [ + { + amount: currentGasPrice.toString(), + denom: GasToken.denom, + }, + ], + gas: currentGasWanted.toString(), + }, + }; + } else { + const currentGasPrice = useNetworkFeeReturn.currentGasFeeRawAmount; + const currentGasWanted = useNetworkFeeReturn.currentGasInfo?.gasWanted || 0; + + updatedDocument = { + ...document, + memo: currentMemo, + fee: { + amount: [ + { + amount: currentGasPrice.toString(), + denom: GasToken.denom, + }, + ], + gas: currentGasWanted.toString(), + }, + }; + } setDocument(updatedDocument); setTransactionData(mappedTransactionData(updatedDocument)); @@ -406,6 +444,7 @@ const ApproveSignTransactionContainer: React.FC = () => { openScannerLink={openScannerLink} opened={visibleTransactionInfo} transactionData={JSON.stringify(document, null, 2)} + multisig={requestData?.data?.multisig} /> ); }; diff --git a/packages/adena-extension/src/pages/popup/wallet/approve-sign/index.tsx b/packages/adena-extension/src/pages/popup/wallet/approve-sign/index.tsx index 238c31491..920ce9f18 100644 --- a/packages/adena-extension/src/pages/popup/wallet/approve-sign/index.tsx +++ b/packages/adena-extension/src/pages/popup/wallet/approve-sign/index.tsx @@ -78,7 +78,21 @@ const ApproveSignContainer: React.FC = () => { const { data: currentBalance = null } = useGetGnotBalance(); - const useNetworkFeeReturn = useNetworkFee(document, true); + let useNetworkFeeReturn = useNetworkFee(document, true); // XXX: prevent useless network calls + + if (requestData?.data?.multisig) { + useNetworkFeeReturn = { + ...useNetworkFeeReturn, + networkFee: { + amount: requestData.data.gasFee.toString(), + denom: GasToken.denom, + }, + isLoading: false, + isSimulateError: false, + currentGasFeeRawAmount: requestData.data.gasFee, + } + } + const networkFee = useNetworkFeeReturn.networkFee; const processing = useMemo(() => processType !== 'INIT', [processType]); @@ -186,6 +200,7 @@ const ApproveSignContainer: React.FC = () => { const validationMessage = validateInjectionDataWithAddress( requestData, await currentAccount.getAddress('g'), + requestData.data?.multisig, ); if (validationMessage) { chrome.runtime.sendMessage(validationMessage); @@ -246,22 +261,45 @@ const ApproveSignContainer: React.FC = () => { } const currentMemo = memo; - const currentGasPrice = useNetworkFeeReturn.currentGasFeeRawAmount; - const currentGasWanted = useNetworkFeeReturn.currentGasInfo?.gasWanted || 0; - - const updatedDocument: Document = { - ...document, - memo: currentMemo, - fee: { - amount: [ - { - amount: currentGasPrice.toString(), - denom: GasToken.denom, - }, - ], - gas: currentGasWanted.toString(), - }, - }; + + let updatedDocument: Document + if (requestData?.data?.multisig) { + const currentGasPrice = requestData.data.gasFee + const currentGasWanted = requestData.data.gasWanted + + updatedDocument = { + ...document, + memo: currentMemo, + account_number: requestData.data.accountNumber.toString(), + sequence: requestData.data.sequence.toString(), + fee: { + amount: [ + { + amount: currentGasPrice.toString(), + denom: GasToken.denom, + }, + ], + gas: currentGasWanted.toString(), + }, + }; + } else { + const currentGasPrice = useNetworkFeeReturn.currentGasFeeRawAmount; + const currentGasWanted = useNetworkFeeReturn.currentGasInfo?.gasWanted || 0; + + updatedDocument = { + ...document, + memo: currentMemo, + fee: { + amount: [ + { + amount: currentGasPrice.toString(), + denom: GasToken.denom, + }, + ], + gas: currentGasWanted.toString(), + }, + }; + } setDocument(updatedDocument); setTransactionData(mappedTransactionData(updatedDocument)); @@ -280,12 +318,16 @@ const ApproveSignContainer: React.FC = () => { } try { - const signature = await transactionService.createSignature(currentAccount, document); + const signature = await transactionService.createSignature( + currentAccount, + document, + ); + const addr = await currentAccount?.getAddress('g') setProcessType('PROCESSING'); setResponse( InjectionMessageInstance.success( WalletResponseSuccessType.SIGN_SUCCESS, - { document, signature }, + { document, signature, account: addr}, requestData?.key, ), ); @@ -306,7 +348,7 @@ const ApproveSignContainer: React.FC = () => { setResponse( InjectionMessageInstance.failure( WalletResponseFailureType.SIGN_FAILED, - {}, + { error: { message: `${e}` } }, requestData?.key, ), ); @@ -401,6 +443,7 @@ const ApproveSignContainer: React.FC = () => { openScannerLink={openScannerLink} opened={visibleTransactionInfo} transactionData={JSON.stringify(document, null, 2)} + multisig={requestData?.data?.multisig} /> ); }; diff --git a/packages/adena-module/src/wallet/keyring/keyring-util.ts b/packages/adena-module/src/wallet/keyring/keyring-util.ts index 58622a325..3da3ccc75 100644 --- a/packages/adena-module/src/wallet/keyring/keyring-util.ts +++ b/packages/adena-module/src/wallet/keyring/keyring-util.ts @@ -1,4 +1,4 @@ -import { Tx, Wallet as Tm2Wallet } from '@gnolang/tm2-js-client'; +import { Tx, Wallet as Tm2Wallet, SignTransactionOptions } from '@gnolang/tm2-js-client'; import { decodeTxMessages, Document, documentToTx } from './../../utils/messages'; import { AddressKeyring } from './address-keyring'; @@ -51,5 +51,13 @@ export function makeSignedTx(wallet: Tm2Wallet, document: Document): Promise const tx = documentToTx(document); const decodeTxMessageFunction = decodeTxMessages; - return wallet.signTransaction(tx, decodeTxMessageFunction); + const opts: SignTransactionOptions = {} + if (document.account_number) { + opts.accountNumber = document.account_number + } + if (document.sequence) { + opts.sequence = document.sequence + } + + return wallet.signTransaction(tx, decodeTxMessageFunction, opts); }