GirinWallet supports XRPL and The Root Network via WalletConnect v2.
- XRPL Specs : https://docs.reown.com/advanced/multichain/rpc-reference/xrpl-rpc
- Support networks :
xrpl:0
(mainnet),xprl:1
(testnet) - Support methods :
xrpl_signTransaction
- Support networks :
- The Root Network Specs : https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc
- Support networks :
eip155:7668
(mainnet),eip155:7672
(porcini testnet) - Support methods :
personal_sign
,eth_sendTransaction
- Support networks :
To get started with WalletConnect integration, you'll first need a Project ID from cloud.reown.com.
If you don't have a Project ID, follow these steps:
-
Visit cloud.reown.com and sign up
-
Navigate to the
Projects
tab (skip the Quick Start guide as@reown/appkit
doesn't support XRPL) -
Create a new project by selecting "another kit" option
-
Add your Project ID to a
.env
file:NEXT_PUBLIC_PROJECT_ID=your-project-id
This example is constructed using the libraries below. You can also implement it by referring to the official WalletConnect v2 documentation.
yarn add @walletconnect/modal-sign-react @walletconnect/types @walletconnect/utils ethers
Add WalletConnectModalSign
component to your top-level component:
import { WalletConnectModalSign } from '@walletconnect/modal-sign-react';
import { getAppMetadata } from '@walletconnect/utils';
export default function Page() {
return (
<WalletConnectModalSign
projectId={process.env.NEXT_PUBLIC_PROJECT_ID}
metadata={getAppMetadata()}
/>
)
}
Connect your iOS or Android wallet by scanning a QR code. Connect through the namespace you need to connect to and get account information.
import { useConnect } from '@walletconnect/modal-sign-react';
import { Button } from '@/components/ui/button';
export function Connect() {
const { connect, loading: isConnecting } = useConnect({
requiredNamespaces: {
xrpl: {
chains: ['xrpl:0', 'xrpl:1'],
methods: ['xrpl_signTransaction'],
events: ['chainChanged', 'accountsChanged'],
},
eip155: {
chains: ['eip155:7668', 'eip155:7672'],
methods: ['eth_sendTransaction', 'personal_sign'],
events: ['chainChanged', 'accountsChanged'],
},
},
});
async function onConnect() {
try {
const session = await connect();
console.info('connect result', session);
} catch (err) {
console.error(err);
}
}
return (
<Button
size="default"
onClick={onConnect}
disabled={isConnecting}
className="w-fit"
>
Connect Wallet
</Button>
);
}
Disconnect from GirinWallet.
import { useDisconnect } from '@walletconnect/modal-sign-react';
import { getSdkError } from '@walletconnect/utils';
import { SessionTypes } from '@walletconnect/types';
import { Button } from '@/components/ui/button';
export function Disconnect({ session }: { session: SessionTypes.Struct }) {
const { disconnect, loading: isDisconnecting } = useDisconnect({
topic: session.topic,
reason: getSdkError('USER_DISCONNECTED'),
});
const onDisconnect = async () => {
try {
await disconnect();
console.info('disconnected');
} catch (err) {
console.error(err);
}
};
return (
<Button onClick={onDisconnect} disabled={isDisconnecting} className="w-fit">
Disconnect Wallet
</Button>
);
}
Below is an example of how to send a transaction to XRPL, TheRootNetwork. For detailed response, please check the XRPL, EVM specs in WalletConnect V2.
'use client';
import { useRequest } from '@walletconnect/modal-sign-react';
import { Button } from '@/components/ui/button';
import { NETWORK, NETWORK_MAP } from '@/lib/network';
interface Props {
topic: string;
account: string;
network: NETWORK;
amount: string;
destination: string;
}
// TODO
type XrplSignTransactionResponse = unknown;
type TrnSendTransactionResponse = unknown;
export function Send({ topic, network, account, amount, destination }: Props) {
const isXrpl = network.startsWith('xrpl');
// https://docs.reown.com/advanced/multichain/rpc-reference/xrpl-rpc#xrpl_signtransaction
const { request: xrplSendTransaction } =
useRequest<XrplSignTransactionResponse>({
chainId: network, // xrpl:0, xrpl:1
topic, // session.topic
request: {
method: 'xrpl_signTransaction',
params: {
tx_json: {
TransactionType: 'Payment',
Account: account,
Destination: destination,
Amount: amount,
},
},
},
});
// https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc#example-parameters-1
const { request: trnSendTransaction } =
useRequest<TrnSendTransactionResponse>({
chainId: network, // eip155:7668, eip155:7672
topic, // session.topic
request: {
method: 'eth_sendTransaction',
params: [
{
from: account,
to: destination,
gasPrice: '0x029104e28c',
gas: '0x5208',
value: '0x' + BigInt(amount).toString(16),
data: '0x',
},
],
},
});
const onSendTransaction = async () => {
const sendTransaction = isXrpl ? xrplSendTransaction : trnSendTransaction;
try {
const result = await sendTransaction();
console.info('sendTransaction result', result);
} catch (err) {
console.error(err);
}
};
return (
<Button
className="w-fit"
onClick={onSendTransaction}
disabled={!account || !amount || !destination}
>{`${isXrpl ? 'xrpl_signTransaction' : 'eth_sendTransaction'} to ${NETWORK_MAP[network]}`}</Button>
);
}
See the example below to see how to do personal_sign on TheRootNetwork. For more detailed answers, please check the EVM specs of WalletConnect V2.
'use client';
import { useRequest } from '@walletconnect/modal-sign-react';
import { Button } from '@/components/ui/button';
import { NETWORK, NETWORK_MAP } from '@/lib/network';
interface Props {
topic: string;
account: string;
network: NETWORK;
}
// TODO
type Response = unknown;
export function Sign({ topic, network, account }: Props) {
// https://docs.reown.com/advanced/multichain/rpc-reference/ethereum-rpc#personal_sign
const { request: signMessage } = useRequest<Response>({
chainId: network, // eip155:7668, eip155:7672
topic,
request: {
method: 'personal_sign',
params: ['Hello World', account],
},
});
const onSign = async () => {
try {
const data = await signMessage();
console.info('sign result', data);
} catch (err) {
console.error(err);
}
};
return (
<Button
className="w-fit"
onClick={onSign}
>{`personal_Sign to ${NETWORK_MAP[network]}`}</Button>
);
}
You can easily conduct integration tests with GirinWallet through the examples below.
- Demo : https://walletconnect-example.netlify.app/
- Source : https://github.com/girin-app/girin-walletconnect-example
yarn
yarn dev
#Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.