diff --git a/.changeset/pretty-mails-trade.md b/.changeset/pretty-mails-trade.md new file mode 100644 index 0000000000000..cfbacc12b1b8d --- /dev/null +++ b/.changeset/pretty-mails-trade.md @@ -0,0 +1,6 @@ +--- +"@pancakeswap/awgmi": patch +--- + +Catch more wallets user reject error for Petra, Martian, Blocto, Pontem + diff --git a/packages/awgmi/README.md b/packages/awgmi/README.md index cf99d0553e215..ec488aaa602cd 100644 --- a/packages/awgmi/README.md +++ b/packages/awgmi/README.md @@ -1,6 +1,14 @@ # @pancakeswap/awgmi -connect to Aptos with similar [wagmi](https://github.com/wagmi-dev/wagmi) React hooks. +Connect to Aptos with similar [wagmi](https://github.com/wagmi-dev/wagmi) React hooks. + +Support Aptos Wallet Connectors: +- Petra +- Martian +- Pontem +- Fewcha +- SafePal +- Trust Wallet ```jsx @@ -9,12 +17,26 @@ import { AwgmiConfig, useConnect, getDefaultProviders, + defaultChains, } from '@pancakeswap/awgmi'; import { PetraConnector } from '@pancakeswap/awgmi/connectors/petra' import { MartianConnector } from '@pancakeswap/awgmi/connectors/martain' +import { SafePalConnector } from '@pancakeswap/awgmi/connectors/safePal' +import { BloctoConnector } from '@pancakeswap/awgmi/connectors/blocto' +import { FewchaConnector } from '@pancakeswap/awgmi/connectors/fewcha' + + // import { mainnet, testnet } from '@pancakeswap/awgmi/core' +const chains = defaultChains // mainnet, testnet, devnet export const client = createClient({ - connectors: [new PetraConnector(), new MartianConnector()], + connectors: [ + new PetraConnector({ chains }), + new MartianConnector({ chains }), + new PetraConnector({ chains, options: { name: 'Trust Wallet', id: 'trustWallet' } }), + new SafePalConnector({ chains }), + new BloctoConnector({ chains, options: { appId: BLOCTO_APP_ID } }), + new FewchaConnector({ chains }), + ], provider: getDefaultProviders, autoConnect: true, }); @@ -23,8 +45,75 @@ export const client = createClient({ function App() { return ( - + ) } ``` + + +## Connector +```jsx +import { useConnect, useDisconnect } from '@pancakeswap/awgmi' + +function ConnectButton() { + const { connect, connectors } = useConnect() + + return ( +
+ {connectors.map((connector) => ( + + ))} +
+ ) +} +``` + + +## Hooks +```jsx +import { + useAccountBalance, + useAccountBalances, + useAccountResource, + useAccountResources, + useCoin, + useCoins, + useNetwork, + useSendTransaction, + useSimulateTransaction, + useTableItem, +} from '@pancakeswap/awgmi' +``` + +### Balance +```js +const { data } = useAccountBalance({ + address: Address, + coin: '0x1::aptos_coin::AptosCoin', + watch: true +}) +``` + +### Send Transaction +```js +import { UserRejectedRequestError } from '@pancakeswap/awgmi' + +const { sendTransactionAsync } = useSendTransaction() + +sendTransactionAsync({ + payload: { + type: 'entry_function_payload', + function: '
::message::set_message', + arguments: ['are we gonna make it?'], + type_arguments: [], + }, +}).catch(err => { + if (err instanceof UserRejectedRequestError) { + // handle user reject + } + // handle transaction error +}) +``` \ No newline at end of file diff --git a/packages/awgmi/core/src/accounts/signMessage.ts b/packages/awgmi/core/src/accounts/signMessage.ts index ffd2328431ffc..510ca0478fc08 100644 --- a/packages/awgmi/core/src/accounts/signMessage.ts +++ b/packages/awgmi/core/src/accounts/signMessage.ts @@ -1,4 +1,4 @@ -import { ConnectorNotFoundError, ProviderRpcError, UserRejectedRequestError } from '../errors' +import { ConnectorNotFoundError, WalletProviderError, UserRejectedRequestError } from '../errors' import { getClient } from '../client' import { SignMessagePayload, SignMessageResponse } from '../connectors' @@ -16,7 +16,7 @@ export async function signMessage(args: SignMessageArgs): Promise { clearState() { this.setState((x) => ({ ...x, + chains: undefined, connector: undefined, data: undefined, error: undefined, diff --git a/packages/awgmi/core/src/connectors/blocto.ts b/packages/awgmi/core/src/connectors/blocto.ts index 894a83072bfcf..3c96cd9bd0526 100644 --- a/packages/awgmi/core/src/connectors/blocto.ts +++ b/packages/awgmi/core/src/connectors/blocto.ts @@ -1,7 +1,12 @@ import type { AptosProviderInterface, AptosProviderConfig } from '@blocto/sdk' import { Types } from 'aptos' import { Chain } from '../chain' -import { ChainNotConfiguredError, ConnectorNotFoundError, ConnectorUnauthorizedError } from '../errors' +import { + ChainNotConfiguredError, + ConnectorNotFoundError, + ConnectorUnauthorizedError, + UserRejectedRequestError, +} from '../errors' import { Address } from '../types' import { Connector, ConnectorData, ConnectorTransactionResponse } from './base' import { Account, SignMessagePayload, SignMessageResponse } from './types' @@ -87,7 +92,16 @@ export class BloctoConnector extends Connector { const provider = await this.getProvider() if (!provider) throw new ConnectorNotFoundError() - return provider.signAndSubmitTransaction(transaction) + try { + const response = await provider.signAndSubmitTransaction(transaction) + return response + } catch (error) { + if ((error as any)?.message === 'User declined to send the transaction') { + throw new UserRejectedRequestError(error) + } else { + throw error + } + } } async signTransaction(transaction?: Types.TransactionPayload): Promise { diff --git a/packages/awgmi/core/src/connectors/martian.ts b/packages/awgmi/core/src/connectors/martian.ts index 9a7e528937ff2..ef6ef9fad9dec 100644 --- a/packages/awgmi/core/src/connectors/martian.ts +++ b/packages/awgmi/core/src/connectors/martian.ts @@ -1,7 +1,7 @@ import { Types } from 'aptos' import { Chain } from '../chain' import { Connector } from './base' -import { ConnectorNotFoundError } from '../errors' +import { ConnectorNotFoundError, UserRejectedRequestError } from '../errors' import { Address } from '../types' import { SignMessagePayload, SignMessageResponse } from './types' @@ -110,9 +110,16 @@ export class MartianConnector extends Connector { const provider = await this.getProvider() if (!provider) throw new ConnectorNotFoundError() - const response = await provider.signAndSubmit(payload) + let response + try { + response = await provider.signAndSubmit(payload) + } catch (error) { + if ((error as any)?.code === 1002) { + throw new UserRejectedRequestError(error) + } + } if (!response || !response.success) { + // TODO: unify WalletProviderError throw new Error('sign and submit failed') } - return response.result } diff --git a/packages/awgmi/core/src/errors.ts b/packages/awgmi/core/src/errors.ts index ec44a6a592c21..cc78e3de57a59 100644 --- a/packages/awgmi/core/src/errors.ts +++ b/packages/awgmi/core/src/errors.ts @@ -77,7 +77,7 @@ export class RpcError extends Error { * Error subclass implementing Ethereum Provider errors per EIP-1193. * @see https://eips.ethereum.org/EIPS/eip-1193 */ -export class ProviderRpcError extends RpcError { +export class WalletProviderError extends RpcError { /** * https://petra.app/docs/errors */ @@ -97,7 +97,7 @@ export class ProviderRpcError extends RpcError { } } -export class UserRejectedRequestError extends ProviderRpcError { +export class UserRejectedRequestError extends WalletProviderError { name = 'UserRejectedRequestError' constructor(error: unknown) { diff --git a/packages/awgmi/core/src/transactions/sendTransaction.ts b/packages/awgmi/core/src/transactions/sendTransaction.ts index 82dd02dc91b96..b97db02dc04a1 100644 --- a/packages/awgmi/core/src/transactions/sendTransaction.ts +++ b/packages/awgmi/core/src/transactions/sendTransaction.ts @@ -1,7 +1,7 @@ import { equalsIgnoreCase } from '@pancakeswap/utils/equalsIgnoreCase' import { Types } from 'aptos' import { getAccount } from '../accounts/account' -import { ChainMismatchError, ConnectorNotFoundError, ProviderRpcError, UserRejectedRequestError } from '../errors' +import { ChainMismatchError, ConnectorNotFoundError, WalletProviderError, UserRejectedRequestError } from '../errors' import { getNetwork } from '../network/network' import { getProvider } from '../providers' import { TransactionResponse } from './types' @@ -46,7 +46,7 @@ export async function sendTransaction({ } return response } catch (error) { - if ((error).code === 4001) throw new UserRejectedRequestError(error) + if ((error).code === 4001) throw new UserRejectedRequestError(error) throw error } } diff --git a/packages/awgmi/core/src/transactions/simulateTransaction.ts b/packages/awgmi/core/src/transactions/simulateTransaction.ts index 24eaa3aaecb54..1a5e7aa6fc903 100644 --- a/packages/awgmi/core/src/transactions/simulateTransaction.ts +++ b/packages/awgmi/core/src/transactions/simulateTransaction.ts @@ -1,7 +1,7 @@ import { HexString, TxnBuilderTypes, Types } from 'aptos' import { getAccount } from '../accounts/account' import { getClient } from '../client' -import { ProviderRpcError, SimulateTransactionError } from '../errors' +import { WalletProviderError, SimulateTransactionError } from '../errors' import { getProvider } from '../providers' export type SimulateTransactionArgs = { @@ -23,7 +23,7 @@ export async function simulateTransaction({ const { account } = getAccount() const provider = getProvider({ networkName }) - if (!account) throw new ProviderRpcError(4100, 'No Account') + if (!account) throw new WalletProviderError(4100, 'No Account') let { publicKey } = account @@ -34,7 +34,7 @@ export async function simulateTransaction({ publicKey = accountFromActiveConnector?.publicKey } - if (!publicKey) throw new ProviderRpcError(4100, 'Missing pubic key') + if (!publicKey) throw new WalletProviderError(4100, 'Missing pubic key') if (Array.isArray(publicKey)) { throw new Error('Multi sig not supported') diff --git a/packages/awgmi/package.json b/packages/awgmi/package.json index af6be9adadee2..2404edb10a3e5 100644 --- a/packages/awgmi/package.json +++ b/packages/awgmi/package.json @@ -1,5 +1,6 @@ { "name": "@pancakeswap/awgmi", + "license": "MIT", "version": "0.0.9", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -14,6 +15,11 @@ "use-sync-external-store": "^1.2.0", "zustand": "^4.1.1" }, + "keywords": [ + "pancakeswap", + "aptos", + "wallets" + ], "peerDependencies": { "@blocto/sdk": "^0.3.1", "aptos": "^1.3.16", diff --git a/packages/awgmi/src/index.ts b/packages/awgmi/src/index.ts index 57fe0eff45d55..4dabea06a1d76 100644 --- a/packages/awgmi/src/index.ts +++ b/packages/awgmi/src/index.ts @@ -1,4 +1,4 @@ -import { +export { defaultChain, defaultChains, APTOS_COIN, @@ -9,20 +9,15 @@ import { parseVmStatusError, isStructTag, getDefaultProviders, + UserRejectedRequestError, + SimulateTransactionError, + ConnectorNotFoundError, + ChainMismatchError, + ChainNotConfiguredError, + ConnectorUnauthorizedError, + ConnectorAlreadyConnectedError, } from '@pancakeswap/awgmi/core' -export { - defaultChain, - defaultChains, - APTOS_COIN, - isHexStringEquals, - isAccountAddress, - isPendingTransaction, - isUserTransaction, - parseVmStatusError, - isStructTag, - getDefaultProviders, -} export * from './client' export * from './context' export * from './hooks/useAccount'