Added Near Protocol to examples (#59)
Co-authored-by: Ben Kremer <contact@bkrem.dev>
This commit is contained in:
@@ -4,6 +4,7 @@ import * as eip155 from "./eip155";
|
||||
import * as cosmos from "./cosmos";
|
||||
import * as polkadot from "./polkadot";
|
||||
import * as solana from "./solana";
|
||||
import * as near from "./near";
|
||||
|
||||
import { ChainMetadata, ChainRequestRender } from "../helpers";
|
||||
|
||||
@@ -18,6 +19,8 @@ export function getChainMetadata(chainId: string): ChainMetadata {
|
||||
return polkadot.getChainMetadata(chainId);
|
||||
case "solana":
|
||||
return solana.getChainMetadata(chainId);
|
||||
case "near":
|
||||
return near.getChainMetadata(chainId);
|
||||
default:
|
||||
throw new Error(`No metadata handler for namespace ${namespace}`);
|
||||
}
|
||||
@@ -35,6 +38,8 @@ export function getChainRequestRender(
|
||||
return cosmos.getChainRequestRender(request);
|
||||
case "polkadot":
|
||||
return polkadot.getChainRequestRender(request);
|
||||
case "near":
|
||||
return near.getChainRequestRender(request);
|
||||
default:
|
||||
throw new Error(`No render handler for namespace ${namespace}`);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
import { JsonRpcRequest } from "@walletconnect/jsonrpc-utils";
|
||||
import { ChainsMap } from "caip-api";
|
||||
|
||||
import { NamespaceMetadata, ChainMetadata, ChainRequestRender } from "../helpers";
|
||||
|
||||
export const NearMetadata: NamespaceMetadata = {
|
||||
"testnet": {
|
||||
logo: "https://avatars.githubusercontent.com/u/7613128?s=200&v=4",
|
||||
rgb: "27, 31, 53",
|
||||
}
|
||||
};
|
||||
|
||||
// TODO: add `near` namespace to `caip-api` package to avoid manual specification here.
|
||||
export const NearChainData: ChainsMap = {
|
||||
"testnet": {
|
||||
"name": "NEAR Testnet",
|
||||
"id": "near:testnet",
|
||||
"rpc": [
|
||||
"https://rpc.testnet.near.org"
|
||||
],
|
||||
"slip44": 397,
|
||||
"testnet": true
|
||||
},
|
||||
};
|
||||
|
||||
export function getChainMetadata(chainId: string): ChainMetadata {
|
||||
const reference = chainId.split(":")[1];
|
||||
const metadata = NearMetadata[reference];
|
||||
if (typeof metadata === "undefined") {
|
||||
throw new Error(`No chain metadata found for chainId: ${chainId}`);
|
||||
}
|
||||
return metadata;
|
||||
}
|
||||
|
||||
export function getChainRequestRender(request: JsonRpcRequest): ChainRequestRender[] {
|
||||
let params = [{ label: "Method", value: request.method }];
|
||||
|
||||
switch (request.method) {
|
||||
default:
|
||||
params = [
|
||||
...params,
|
||||
{
|
||||
label: "params",
|
||||
value: JSON.stringify(request.params, null, "\t"),
|
||||
},
|
||||
];
|
||||
break;
|
||||
}
|
||||
return params;
|
||||
}
|
||||
@@ -20,6 +20,7 @@ export const DEFAULT_TEST_CHAINS = [
|
||||
"eip155:44787",
|
||||
"solana:8E9rvCKLFQia2Y35HXjjpWzj8weVo44K",
|
||||
"polkadot:e143f23803ac50e8f6f8e62695d1ce9e",
|
||||
"near:testnet"
|
||||
];
|
||||
|
||||
export const DEFAULT_CHAINS = [...DEFAULT_MAIN_CHAINS, ...DEFAULT_TEST_CHAINS];
|
||||
@@ -82,6 +83,19 @@ export enum DEFAULT_POLKADOT_METHODS {
|
||||
|
||||
export enum DEFAULT_POLKADOT_EVENTS {}
|
||||
|
||||
/**
|
||||
* NEAR
|
||||
*/
|
||||
export enum DEFAULT_NEAR_METHODS {
|
||||
NEAR_SIGN_IN = 'near_signIn',
|
||||
NEAR_SIGN_OUT = 'near_signOut',
|
||||
NEAR_GET_ACCOUNTS = 'near_getAccounts',
|
||||
NEAR_SIGN_AND_SEND_TRANSACTION = 'near_signAndSendTransaction',
|
||||
NEAR_SIGN_AND_SEND_TRANSACTIONS = 'near_signAndSendTransactions',
|
||||
}
|
||||
|
||||
export enum DEFAULT_NEAR_EVENTS {}
|
||||
|
||||
export const DEFAULT_GITHUB_REPO_URL =
|
||||
"https://github.com/WalletConnect/web-examples/tree/main/dapps/react-dapp-v2";
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import { SolanaChainData } from "../chains/solana";
|
||||
import { PolkadotChainData } from "../chains/polkadot";
|
||||
|
||||
import { ChainNamespaces, getAllChainNamespaces } from "../helpers";
|
||||
import { NearChainData } from "../chains/near";
|
||||
|
||||
/**
|
||||
* Types
|
||||
@@ -44,6 +45,8 @@ export function ChainDataContextProvider({
|
||||
chains = SolanaChainData;
|
||||
} else if (namespace === "polkadot") {
|
||||
chains = PolkadotChainData;
|
||||
} else if (namespace === "near") {
|
||||
chains = NearChainData;
|
||||
} else {
|
||||
chains = await apiGetChainNamespace(namespace);
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ import {
|
||||
DEFAULT_EIP155_METHODS,
|
||||
DEFAULT_SOLANA_METHODS,
|
||||
DEFAULT_POLKADOT_METHODS,
|
||||
DEFAULT_NEAR_METHODS,
|
||||
} from "../constants";
|
||||
import { useChainData } from "./ChainDataContext";
|
||||
import { signatureVerify, cryptoWaitReady } from "@polkadot/util-crypto";
|
||||
@@ -67,6 +68,10 @@ interface IContext {
|
||||
testSignMessage: TRpcRequestCallback;
|
||||
testSignTransaction: TRpcRequestCallback;
|
||||
};
|
||||
nearRpc: {
|
||||
testSignAndSendTransaction: TRpcRequestCallback;
|
||||
testSignAndSendTransactions: TRpcRequestCallback;
|
||||
};
|
||||
rpcResult?: IFormattedRpcResponse | null;
|
||||
isRpcRequestPending: boolean;
|
||||
isTestnet: boolean;
|
||||
@@ -690,6 +695,95 @@ export function JsonRpcContextProvider({
|
||||
},
|
||||
),
|
||||
};
|
||||
|
||||
// -------- NEAR RPC METHODS --------
|
||||
|
||||
const nearRpc = {
|
||||
testSignAndSendTransaction: _createJsonRpcRequestHandler(
|
||||
async (chainId: string, address: string): Promise<IFormattedRpcResponse> => {
|
||||
const method = DEFAULT_NEAR_METHODS.NEAR_SIGN_AND_SEND_TRANSACTION
|
||||
const result = await client!.request({
|
||||
topic: session!.topic,
|
||||
chainId,
|
||||
request: {
|
||||
method,
|
||||
params: {
|
||||
transaction: {
|
||||
signerId: address,
|
||||
receiverId: "guest-book.testnet",
|
||||
actions: [{
|
||||
type: "FunctionCall",
|
||||
params: {
|
||||
methodName: "addMessage",
|
||||
args: { text: "Hello from Wallet Connect!" },
|
||||
gas: "30000000000000",
|
||||
deposit: "0",
|
||||
}
|
||||
}]
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
method,
|
||||
address,
|
||||
valid: true,
|
||||
result: JSON.stringify((result as any).transaction),
|
||||
};
|
||||
}
|
||||
),
|
||||
testSignAndSendTransactions: _createJsonRpcRequestHandler(
|
||||
async (chainId: string, address: string): Promise<IFormattedRpcResponse> => {
|
||||
const method = DEFAULT_NEAR_METHODS.NEAR_SIGN_AND_SEND_TRANSACTIONS
|
||||
const result = await client!.request({
|
||||
topic: session!.topic,
|
||||
chainId,
|
||||
request: {
|
||||
method,
|
||||
params: {
|
||||
transactions: [
|
||||
{
|
||||
signerId: address,
|
||||
receiverId: "guest-book.testnet",
|
||||
actions: [{
|
||||
type: "FunctionCall",
|
||||
params: {
|
||||
methodName: "addMessage",
|
||||
args: { text: "Hello from Wallet Connect! (1/2)" },
|
||||
gas: "30000000000000",
|
||||
deposit: "0",
|
||||
}
|
||||
}]
|
||||
},
|
||||
{
|
||||
signerId: address,
|
||||
receiverId: "guest-book.testnet",
|
||||
actions: [{
|
||||
type: "FunctionCall",
|
||||
params: {
|
||||
methodName: "addMessage",
|
||||
args: { text: "Hello from Wallet Connect! (2/2)" },
|
||||
gas: "30000000000000",
|
||||
deposit: "0",
|
||||
}
|
||||
}]
|
||||
}
|
||||
],
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
method,
|
||||
address,
|
||||
valid: true,
|
||||
result: JSON.stringify((result as any).map((r: any) => r.transaction)),
|
||||
};
|
||||
}
|
||||
),
|
||||
};
|
||||
|
||||
return (
|
||||
<JsonRpcContext.Provider
|
||||
value={{
|
||||
@@ -698,6 +792,7 @@ export function JsonRpcContextProvider({
|
||||
cosmosRpc,
|
||||
solanaRpc,
|
||||
polkadotRpc,
|
||||
nearRpc,
|
||||
rpcResult: result,
|
||||
isRpcRequestPending: pending,
|
||||
isTestnet,
|
||||
|
||||
@@ -8,6 +8,8 @@ import {
|
||||
DEFAULT_SOLANA_METHODS,
|
||||
DEFAULT_POLKADOT_EVENTS,
|
||||
DEFAULT_POLKADOT_METHODS,
|
||||
DEFAULT_NEAR_METHODS,
|
||||
DEFAULT_NEAR_EVENTS,
|
||||
} from "../constants";
|
||||
|
||||
export const getNamespacesFromChains = (chains: string[]) => {
|
||||
@@ -32,6 +34,8 @@ export const getSupportedMethodsByNamespace = (namespace: string) => {
|
||||
return Object.values(DEFAULT_SOLANA_METHODS);
|
||||
case "polkadot":
|
||||
return Object.values(DEFAULT_POLKADOT_METHODS);
|
||||
case "near":
|
||||
return Object.values(DEFAULT_NEAR_METHODS);
|
||||
default:
|
||||
throw new Error(`No default methods for namespace: ${namespace}`);
|
||||
}
|
||||
@@ -47,6 +51,8 @@ export const getSupportedEventsByNamespace = (namespace: string) => {
|
||||
return Object.values(DEFAULT_SOLANA_EVENTS);
|
||||
case "polkadot":
|
||||
return Object.values(DEFAULT_POLKADOT_EVENTS);
|
||||
case "near":
|
||||
return Object.values(DEFAULT_NEAR_EVENTS);
|
||||
default:
|
||||
throw new Error(`No default events for namespace: ${namespace}`);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
DEFAULT_SOLANA_METHODS,
|
||||
DEFAULT_POLKADOT_METHODS,
|
||||
DEFAULT_TEST_CHAINS,
|
||||
DEFAULT_NEAR_METHODS,
|
||||
} from "../constants";
|
||||
import { AccountAction, setLocaleStorageTestnetFlag } from "../helpers";
|
||||
import Toggle from "../components/Toggle";
|
||||
@@ -69,6 +70,7 @@ const Home: NextPage = () => {
|
||||
cosmosRpc,
|
||||
solanaRpc,
|
||||
polkadotRpc,
|
||||
nearRpc,
|
||||
isRpcRequestPending,
|
||||
rpcResult,
|
||||
isTestnet,
|
||||
@@ -210,6 +212,22 @@ const Home: NextPage = () => {
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
const getNearActions = (): AccountAction[] => {
|
||||
const onSignAndSendTransaction = async (chainId: string, address: string) => {
|
||||
openRequestModal();
|
||||
await nearRpc.testSignAndSendTransaction(chainId, address);
|
||||
};
|
||||
const onSignAndSendTransactions = async (chainId: string, address: string) => {
|
||||
openRequestModal();
|
||||
await nearRpc.testSignAndSendTransactions(chainId, address);
|
||||
};
|
||||
return [
|
||||
{ method: DEFAULT_NEAR_METHODS.NEAR_SIGN_AND_SEND_TRANSACTION, callback: onSignAndSendTransaction },
|
||||
{ method: DEFAULT_NEAR_METHODS.NEAR_SIGN_AND_SEND_TRANSACTIONS, callback: onSignAndSendTransactions },
|
||||
];
|
||||
};
|
||||
|
||||
const getBlockchainActions = (chainId: string) => {
|
||||
const [namespace] = chainId.split(":");
|
||||
switch (namespace) {
|
||||
@@ -221,6 +239,8 @@ const Home: NextPage = () => {
|
||||
return getSolanaActions();
|
||||
case "polkadot":
|
||||
return getPolkadotActions();
|
||||
case "near":
|
||||
return getNearActions();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user