From 2763b05af4eb2b02ef8d36974f8d1140e7feec22 Mon Sep 17 00:00:00 2001
From: ChefJoJo <94336009+chef-jojo@users.noreply.github.com>
Date: Wed, 9 Nov 2022 14:08:58 +0800
Subject: [PATCH] feat(awgmi): Catch more wallets user reject error (#5242)
---
.changeset/pretty-mails-trade.md | 6 ++
packages/awgmi/README.md | 95 ++++++++++++++++++-
.../awgmi/core/src/accounts/signMessage.ts | 4 +-
packages/awgmi/core/src/client.ts | 1 +
packages/awgmi/core/src/connectors/blocto.ts | 18 +++-
packages/awgmi/core/src/connectors/martian.ts | 13 ++-
packages/awgmi/core/src/connectors/pontem.ts | 13 ++-
packages/awgmi/core/src/errors.ts | 4 +-
.../core/src/transactions/sendTransaction.ts | 4 +-
.../src/transactions/simulateTransaction.ts | 6 +-
packages/awgmi/package.json | 6 ++
packages/awgmi/src/index.ts | 21 ++--
12 files changed, 158 insertions(+), 33 deletions(-)
create mode 100644 .changeset/pretty-mails-trade.md
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'