@particle-network/authkit
Version:
Auth Core provides MPC (Multi-Party Computation)-based threshold signatures.
8 lines (7 loc) • 27 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/pages/sign/components/info-sign.tsx", "../../src/utils/solana-utils.ts"],
"sourcesContent": ["import { RecordType } from '@particle-network/analytics';\nimport {\n SolanaEnhancedMethod,\n SolanaRpcMethod,\n analyticsRecord,\n getChainIcon,\n isNeedRestoreWallet,\n particleAuth,\n syncUserInfo,\n type SolanaDeserializeTransactionResult,\n type SplTokenChangeInfo,\n type TokenChangeInfo,\n} from '@particle-network/auth-core';\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport { Button, Modal, Tabs } from 'antd';\nimport base58 from 'bs58';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport CopyToClipboard from 'react-copy-to-clipboard';\nimport { AuthError } from '../../../api/model/authError';\nimport { PromptSettingType } from '../../../api/model/bundle';\nimport { AuthPage } from '../../../components/customRouter';\nimport IconCopy from '../../../components/icon/icon-copy';\nimport PowerFooter from '../../../components/power-footer';\nimport {\n useAuthCoreModal,\n useCustomNavigate,\n useEvents,\n useModalOptions,\n useParticleAuth,\n useTranslation,\n} from '../../../context';\nimport { useError } from '../../../context/hooks/useError';\nimport useMessage from '../../../context/hooks/useMessage';\nimport { usePaymentPassword } from '../../../context/hooks/usePaymentPassword';\nimport { AuthCoreModalEvent } from '../../../context/types';\nimport { getChainDisplayName } from '../../../utils/chain-utils';\nimport { shortString } from '../../../utils/common-utils';\nimport { isTelegramWebApp } from '../../../utils/isTelegramWebApp';\nimport { formatTokenAmount } from '../../../utils/number-utils';\nimport solana from '../../../utils/solana-utils';\nimport styles from './info-sign.less';\nimport Menu from './menu';\n\ninterface IProps {\n param: unknown;\n method: SolanaRpcMethod;\n chainId?: number;\n loginAuthorizationSign?: boolean;\n}\nfunction InfoSign(props: IProps) {\n const { method, param, chainId, loginAuthorizationSign } = props;\n const { t } = useTranslation();\n const navigate = useCustomNavigate();\n const { setPaymentVerify, userInfo, setPaymentPassword } = useParticleAuth();\n const { events } = useEvents();\n const { modalOptions } = useModalOptions();\n const { authCoreModal } = useAuthCoreModal();\n const { errorHandle } = useError();\n\n const [loading, setLoading] = useState(false);\n const message = useMessage();\n const [transactionInfo, setTransactionInfo] = useState<SolanaDeserializeTransactionResult>();\n\n const [nftChanges, setNftChanges] = useState<TokenChangeInfo[]>();\n\n const [tokenChanges, setTokenChanges] = useState<SplTokenChangeInfo[]>();\n\n const [headerTitle, setHeaderTitle] = useState<string>('');\n const [headerDes, setHeaderDes] = useState<string>('');\n\n const { hasSetPaymentPassword, showSetPaymentPasswordOrConfirm } = usePaymentPassword();\n\n const chain = useMemo(() => {\n return {\n id: chainId || particleAuth.solana.chainId,\n name: 'Solana',\n };\n }, []);\n\n const shortAddress = useMemo(() => {\n const address = particleAuth.solana.selectedAddress as string;\n return shortString(address);\n }, []);\n\n useEffect(() => {\n syncUserInfo().catch((e) => console.log('syncUserInfo', e));\n if (isNeedRestoreWallet()) {\n navigate(AuthPage.MasterPasswordVerify);\n }\n }, [navigate]);\n\n const loadsecurityAccounts = () => {\n syncUserInfo()\n .then(() => {\n approveSign();\n })\n .catch((error) => {\n setLoading(false);\n message.error(error.message ?? 'Sign Error');\n });\n };\n\n const finallyHandle = (result: any, error?: any) => {\n events.emit(AuthCoreModalEvent.SignResponse, {\n result,\n error,\n });\n };\n\n async function asyncFilter<T>(predicate: (indo: T) => Promise<boolean>, arr?: T[]): Promise<T[]> {\n if (!arr) {\n return [];\n }\n const results = await Promise.all(arr.map(predicate));\n return arr.filter((_v, index) => results[index]);\n }\n\n const approveSign = async () => {\n if (!method) return;\n\n analyticsRecord({\n // eslint-disable-next-line camelcase\n record_type: RecordType.PAGE_SIGN_CONFIRM_BUTTON_CLICK, // confirm\u6309\u94AE\u70B9\u51FB\n });\n\n if (userInfo?.security_account?.has_set_payment_password) {\n setPaymentVerify({\n visible: true,\n onVerifyCompleted: approveSignImpl,\n });\n } else if (\n method === SolanaRpcMethod.signAndSendTransaction ||\n method === SolanaRpcMethod.signTransaction ||\n method === SolanaRpcMethod.signAllTransactions ||\n modalOptions?.promptSettingConfig?.promptPaymentPasswordSettingWhenSign === PromptSettingType.everyAndNotSkip\n ) {\n // \u663E\u793A\u8BBE\u7F6E\u652F\u4ED8\u5BC6\u7801\n showSetPaymentPasswordOrConfirm(approveSignImpl);\n } else {\n approveSignImpl();\n }\n };\n\n const approveSignImpl = async () => {\n if (!method) return;\n setLoading(true);\n let signed;\n try {\n if (method === SolanaRpcMethod.signMessage) {\n const { signature } = await particleAuth.solana.signMessage(param as Uint8Array);\n signed = signature;\n } else if (method === SolanaRpcMethod.signAndSendTransaction) {\n const { signature } = await particleAuth.solana.signAndSendTransaction(\n param as Transaction | VersionedTransaction,\n chain.id\n );\n signed = signature;\n } else if (method === SolanaRpcMethod.signTransaction) {\n signed = await particleAuth.solana.signTransaction(param as Transaction | VersionedTransaction, chain.id);\n } else if (method === SolanaRpcMethod.signAllTransactions) {\n signed = await particleAuth.solana.signAllTransactions(\n param as (Transaction | VersionedTransaction)[],\n chain.id\n );\n } else {\n throw new Error('Unknown method');\n }\n\n analyticsRecord({\n // eslint-disable-next-line camelcase\n record_type: RecordType.PAGE_SIGN_CONFIRM_BUTTON_CLICK_SUCCESS, // confirm\u6210\u529F\n });\n } catch (e: any) {\n console.error('approveSignImpl error', method, e);\n analyticsRecord({\n // eslint-disable-next-line camelcase\n record_type: RecordType.PAGE_SIGN_CONFIRM_BUTTON_CLICK_FAILURE, // confirm\u5931\u8D25\n });\n\n if (e?.error_code === 50103 && !userInfo?.security_account?.has_set_payment_password) {\n loadsecurityAccounts();\n } else if (e?.message === 'Local Key not found' || e?.message === 'Master password decryption error') {\n navigate(AuthPage.MasterPasswordVerify);\n } else {\n errorHandle(e);\n }\n } finally {\n setLoading(false);\n }\n\n if (signed) {\n if (method === SolanaRpcMethod.signMessage && loginAuthorizationSign) {\n events.emit(AuthCoreModalEvent.LoginSuccess, {\n ...userInfo,\n authorization: {\n message: base58.encode(param as Uint8Array),\n signature: signed,\n },\n });\n } else {\n finallyHandle(signed);\n }\n }\n };\n\n const cancelSign = () => {\n if (loading) {\n return;\n }\n\n if (loginAuthorizationSign) {\n events.emit(AuthCoreModalEvent.LoginSuccess, userInfo);\n } else {\n finallyHandle(undefined, AuthError.userRejectedRequest());\n }\n };\n\n useEffect(() => {\n if (method === SolanaRpcMethod.signMessage) {\n setHeaderTitle(t('sign.signature_message') as string);\n setHeaderDes(t('sign.signature_title') as string);\n } else if (method === SolanaRpcMethod.signAndSendTransaction) {\n setHeaderTitle(t('sign.send_transaction') as string);\n setHeaderDes(t('sign.approve_and').format(getChainDisplayName(chain)));\n const serializeTx = (param as Transaction | VersionedTransaction).serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n deserializeTransaction([base58.encode(serializeTx)]);\n } else if (method === SolanaRpcMethod.signTransaction) {\n setHeaderTitle(t('sign.sign_transaction') as string);\n setHeaderDes(t('sign.sign_but') as string);\n const serializeTx = (param as Transaction | VersionedTransaction).serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n deserializeTransaction([base58.encode(serializeTx)]);\n } else if (method === SolanaRpcMethod.signAllTransactions) {\n setHeaderTitle(t('sign.sign_transaction') as string);\n setHeaderDes(t('sign.sign_but') as string);\n const serializeTxs = (param as (Transaction | VersionedTransaction)[]).map((tx) =>\n base58.encode(\n tx.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n })\n )\n );\n deserializeTransaction(serializeTxs);\n } else {\n throw new Error('Unknown method');\n }\n }, [param, t]);\n\n useEffect(() => {\n // init connect();\n particleAuth.solana.connect();\n }, []);\n\n const deserializeTransaction = (messages: string[]) => {\n particleAuth.solana\n .request({\n chainId: chain.id,\n method: SolanaEnhancedMethod.enhancedDeserializeTransaction,\n params: messages,\n })\n .then((result) => {\n setTransactionInfo(result);\n asyncFilter(async (info: any) => {\n const associatedTokenAddress = await solana.findAssociatedTokenAddress(\n particleAuth.solana.selectedAddress as string,\n info.mint\n );\n return info.associatedTokenAddress === associatedTokenAddress.toBase58();\n }, result?.estimatedChanges?.nfts).then((results) => {\n console.log('NFTChanges', results.length);\n setNftChanges(results);\n });\n\n asyncFilter(async (info: any) => {\n const associatedTokenAddress = await solana.findAssociatedTokenAddress(\n particleAuth.solana.selectedAddress as string,\n info.mint\n );\n return info.associatedTokenAddress === associatedTokenAddress.toBase58();\n }, result?.estimatedChanges?.tokens).then((results) => {\n console.log('TokenChanges', results.length);\n setTokenChanges(results);\n });\n })\n .catch((error) => {\n console.log('deserializeTransaction error', error);\n Modal.error({\n title: error.message ?? 'Deserialize Transaction Error',\n okCancel: true,\n cancelText: t('common.cancel'),\n okText: t('common.retry'),\n wrapClassName: 'auth-core-modal-error',\n getContainer: () => {\n return authCoreModal.rootBody as HTMLElement;\n },\n onOk: () => {\n deserializeTransaction(messages);\n },\n });\n });\n };\n\n const signMessage = () => {\n const textDecoder = new TextDecoder();\n const decodedString = textDecoder.decode(param as any);\n return (\n <div className='sign-message'>\n <div className={'message' + (hasSetPaymentPassword ? '' : ' no-password-tip')}>\n <div className='pre-wrap personal-message'>{decodedString}</div>\n </div>\n </div>\n );\n };\n\n const signTransaction = () => {\n return (\n <Tabs\n defaultActiveKey='1'\n items={[\n {\n label: t('sign.details'),\n key: '1',\n children: (\n <>\n <div className='balance-change'>\n <div className='title'>{t('sign.estimated_balance_change')}</div>\n <div className='change-body'>\n {transactionInfo?.estimatedChanges?.sols\n .filter((info) => info.address === (particleAuth?.solana?.selectedAddress as string))\n .map((info, index) => {\n return (\n <div className='change-title' key={`sol-change-${index}`}>\n SOL\n <div className='change-val' style={info.lamportsChange < 0 ? { color: '#ea4335' } : {}}>\n {info.lamportsChange < 0 ? '' : '+'}\n {formatTokenAmount(info.lamportsChange, 9)}\n </div>\n </div>\n );\n })}\n\n {nftChanges?.map((info, index) => {\n return (\n <div className='change-title' key={`nft-change-${index}`}>\n {info.name ? info.name : 'Unknown NFT'}\n <div className='change-val' style={info.amountChange < 0 ? { color: '#ea4335' } : {}}>\n {info.amountChange < 0 ? '' : '+'}\n {info.amountChange}\n </div>\n </div>\n );\n })}\n\n {tokenChanges?.map((info, index) => {\n return (\n <div className='change-title' key={`token-change-${index}`}>\n {info.name ? info.name : 'Unknown Token'}\n <div className='change-val' style={info.amountChange < 0 ? { color: '#ea4335' } : {}}>\n {info.amountChange < 0 ? '' : '+'}\n {formatTokenAmount(info.amountChange, info.decimals)}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className='net-fee solana'>\n <div className='title'>\n {t('sign.network_fee')}\n {transactionInfo && (\n <div className='fee-val'>{formatTokenAmount(transactionInfo.estimatedLamportsFee, 9)} SOL</div>\n )}\n </div>\n </div>\n </>\n ),\n },\n {\n label: t('sign.data'),\n key: '2',\n children: (\n <div>\n {transactionInfo?.instructions.map((instruction, index) => {\n return (\n <div className='inner-instruction' key={`instruction-${index}`}>\n <div className='inner-content'>\n <div className='content-item'>\n <div className='item'>\n <div className='item-0'>\n #{index + 1} - {t(`program.${instruction.type}`)}\n </div>\n <div className='item-1 mt10'>\n {t('sign.program_id')}\n <span>{shortString(instruction.programId)}</span>\n </div>\n <div className='item-1 mt15'>\n {t('sign.data')}\n <span>{shortString(instruction.data)}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n ),\n },\n ]}\n />\n );\n };\n\n return (\n <div className='info-sign'>\n <style>{styles as unknown as string}</style>\n {!hasSetPaymentPassword && (\n <div className='has-payment-password' data-telegram={isTelegramWebApp()}>\n <div className='has-payment-password-icon'></div>\n <div className='has-payment-password-tip'>{t('account.waring_tip1')}</div>\n <div className='has-payment-password-set' onClick={setPaymentPassword}>\n {t('account.set')}\n </div>\n </div>\n )}\n <div className={'scroll-part' + (hasSetPaymentPassword ? '' : ' no-password-tip')}>\n <Menu userInfo={userInfo} transactionInfo={transactionInfo} />\n <div className='info-request'>{headerTitle}</div>\n <div className='info-title'>\n <img src={getChainIcon(chain)} alt='' />\n {getChainDisplayName(chain)}\n </div>\n <CopyToClipboard\n text={particleAuth.solana.selectedAddress as string}\n onCopy={() => message.success(t('new.copied_to'))}\n >\n <div className='info-address'>\n {shortAddress}\n <div className='copy-icon'>\n <IconCopy />\n </div>\n </div>\n </CopyToClipboard>\n <div className='info-des'>{headerDes}</div>\n <div className='apart-line'></div>\n {method === SolanaRpcMethod.signMessage && signMessage()}\n {method !== SolanaRpcMethod.signMessage && signTransaction()}\n </div>\n\n <div className='btn-box'>\n <div>\n <Button className='btn-cancel' onClick={cancelSign}>\n {t('common.cancel')}\n </Button>\n <Button className='btn-approve' onClick={approveSign} loading={loading}>\n {t('common.confirm')}\n </Button>\n </div>\n <PowerFooter></PowerFooter>\n </div>\n </div>\n );\n}\n\nexport default InfoSign;\n", "import type { PublicKey } from '@solana/web3.js';\n\nconst SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL';\n\nconst solana = {\n async findAssociatedTokenAddress(walletAddress: string, tokenMintAddress: string): Promise<PublicKey> {\n const { PublicKey } = await import('@solana/web3.js');\n const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');\n return PublicKey.findProgramAddressSync(\n [\n new PublicKey(walletAddress).toBuffer(),\n TOKEN_PROGRAM_ID.toBuffer(),\n new PublicKey(tokenMintAddress).toBuffer(),\n ],\n new PublicKey(SPL_ASSOCIATED_TOKEN_ACCOUNT_PROGRAM_ID)\n )[0];\n },\n};\n\nexport default solana;\n"],
"mappings": "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",
"names": ["_a", "info_sign_default"]
}