Overview
This library is the result of Hedera community collaboration to bring Hedera into the
WalletConnect ecosystem and vice versa.
The goal of this repository is to be a reference for wallets and dApps integrating the
WalletConnect <> Hedera JSON-RPC reference. Additionally, this library is meant to be included
in projects supporting WalletConnect and Hedera, providing utility functions useful to
validating requests and resposes in both the WalletConnect JSON-RPC context as well as the
Hedera context.
A few useful resources include:
WalletConnect brings the ecosystem together by enabling wallets and apps to securely connect
and interact.
-- https://walletconnect.com
Hedera aims to be:
The open source public ledger for everyone
-- https://hedera.com
This package managed by the Hedera community and is intended to be a standard for ecosystem
wallets and dApp providers utilizing WalletConnect as a their
communications protocol. It utilizes the
@hashgraph/sdk
and provides functions to
facilitate implementing the
WalletConnect <> Hedera JSON-RPC spec
which has been defined through the collaborative HIP process in
HIP-820.
This library facilitates the implementation of the WalletConnect <> Hedera Spec which allows
wallets and dApps to natively integrate with Hedera. It provides additional, out of network
functionality with the hedera_signMessage
function.
In short, it uses the Hedera javascript SDK to build transactions, serialize them, send to
wallets for processing and return responses back to dApps.
Please note, this is distinct from the
Implementation of Ethereum JSON-RPC APIs for Hedera.
At the time of this writing, "the Hedera JSON-RPC relay implementation is in beta, offers
limited functionality today, and is only available to developers."
The relay and this library have different intentions and serve different purposes - namely
native Hedera integration vs. Ethereum compatability layers to ease developer onboarding for
those more familiar with the Ethereum ecosystem.
Set up
To start using WalletConnect, sign up for an account at https://cloud.walletconnect.com. You
will use your project id when initializing client libraries.
It is important to understand core WalletConnect concepts when integrating this library. Please
reference the WalletConnect documentation.
Usage
Upon successfully configuring your dApp and/or wallet to manage WalletConnect sessions, you can
use this library’s functions to easily create and handle requests for the Hedera network.
DApps
Signer
This library provides a DAppSigner
class that implements the @hashgraph/sdk
's Signer
interface. You may use the DAppSigner
class to sign and execute transactions on the Hedera
network.
Get Signer
After you have paired your wallet with your dApp, you can get the signer from the
DAppConnector
instance:
const signer = dAppConnector.signers[0]
Or, if multiple signers are available, you can find the signer by account ID:
const signer = dAppConnector.signers.find(
(signer_) => signer_.getAccountId().toString() === '0.0.100',
)
Sign Transactions
const transaction = new TransferTransaction()
.addHbarTransfer('0.0.100', new Hbar(-1))
.addHbarTransfer('0.0.101', new Hbar(1))
await transaction.freezeWithSigner(signer)
const signedTransaction = await signer.signTransaction(transaction)
Sign and Execute Transactions
const transaction = new TransferTransaction()
.addHbarTransfer('0.0.100', new Hbar(-1))
.addHbarTransfer('0.0.101', new Hbar(1))
await transaction.freezeWithSigner(signer)
const transactionResponse = await transaction.executeWithSigner(signer)
Sign and verify messages
const text = 'Example message to sign'
const base64String = btoa(text)
const sigMaps = await signer.sign([base64StringToUint8Array(base64String)])
const verifiedResult = verifySignerSignature(base64String, sigMaps[0], publicKey)
Wallet
This library provides a Wallet class that extends the
Web3Wallet
class provided by WalletConnect class
Event Listeners
WalletConnect emits various events during a session. Listen to these events to synchronize the
state of your application:
signClient.on('session_proposal', (event) => {
})
signClient.on('session_request', (event) => {
})
signClient.on('session_delete', (event) => {
})
Pairing with dApps
Pairing establishes a connection between the wallet and a dApp. Once paired, the dApp can send
session requests to the wallet.
a. Pairing via URI
If a dApp shares a URI for pairing:
await signClient.core.pairing.pair({ uri: 'RECEIVED_URI' })
Upon successful pairing, the session_proposal
event will be triggered.
b. Pairing via QR Codes
For a better user experience, dApps often share QR codes that wallets can scan to establish a
pairing. Use a QR code scanning library to scan and obtain the URI, then proceed with pairing:
const scannedUri = '...'
await signClient.core.pairing.pair({ uri: scannedUri })
Handling Session Proposals
Upon receiving a session_proposal
event, display the proposal details to the user. Allow them
to approve or reject the session:
Handling Session Requests
Upon receiving a session_request
event, process the request. For instance, if the dApp
requests a transaction to be signed:
Demo & docs
This repository includes a vanilla html/css/javascript implementation with a dApp and wallet
example useful for testing and development while integrating WalletConnect and Hedera.
The docs site utilizes Typedoc to generate a library documentation site
at https://wc.hgraph.app/docs/
The demo source code lives in ./src/examples/typescript
and is available at
https://wc.hgraph.app
Passing tests
git commit -Ss "the commit message"