Revert "Revert "Cosmos signature verification (#6)""

This reverts commit dad29d7611.
This commit is contained in:
Ben Kremer 2022-04-04 13:49:32 +02:00
parent 50881924fa
commit cda29b7ffd
7 changed files with 103 additions and 10 deletions

View File

@ -1,6 +1,11 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { version } from "@walletconnect/client/package.json"; import { version } from "@walletconnect/client/package.json";
import { formatDirectSignDoc, stringifySignDocValues } from "cosmos-wallet"; import {
formatDirectSignDoc,
stringifySignDocValues,
verifyAminoSignature,
verifyDirectSignature,
} from "cosmos-wallet";
import Banner from "./components/Banner"; import Banner from "./components/Banner";
import Blockchain from "./components/Blockchain"; import Blockchain from "./components/Blockchain";
@ -129,10 +134,12 @@ export default function App() {
params, params,
}); });
const valid = await verifyDirectSignature(address, result.signature, signDoc);
return { return {
method: "cosmos_signDirect", method: "cosmos_signDirect",
address, address,
valid: true, valid,
result: result.signature, result: result.signature,
}; };
}; };
@ -162,10 +169,12 @@ export default function App() {
params, params,
}); });
const valid = await verifyAminoSignature(address, result.signature, signDoc);
return { return {
method: "cosmos_signAmino", method: "cosmos_signAmino",
address, address,
valid: true, valid,
result: result.signature, result: result.signature,
}; };
}; };

View File

@ -0,0 +1,3 @@
NEXT_PUBLIC_PROJECT_ID=...
NEXT_PUBLIC_RELAY_URL=wss://relay.walletconnect.com

View File

@ -13,9 +13,23 @@ This example aims to demonstrate basic and advanced use cases enabled by WalletC
Eexample is built atop of [NextJS](https://nextjs.org/) in order to abstract complexity of setting up bundlers, routing etc. So there are few steps you need to follow in order to set everything up Eexample is built atop of [NextJS](https://nextjs.org/) in order to abstract complexity of setting up bundlers, routing etc. So there are few steps you need to follow in order to set everything up
1. Go to [WalletConnect Cloud](https://cloud.walletconnect.com/sign-in) and obtain a project id 1. Go to [WalletConnect Cloud](https://cloud.walletconnect.com/sign-in) and obtain a project id
2. Add your project details in [WalletConnectUtil.ts](https://github.com/WalletConnect/web-examples/blob/main/wallets/react-wallet-v2/src/utils/WalletConnectUtil.ts) file 2. Add your project details in [WalletConnectUtil.ts](https://github.com/WalletConnect/web-examples/blob/main/wallets/react-wallet-v2/src/utils/WalletConnectUtil.ts) file
3. Install dependencies `yarn install` or `npm install` 3. Install dependencies `yarn install` or `npm install`
4. Run `yarn dev` or `npm run dev` to start local development
4. Setup your environment variables
```bash
cp .env.local.example .env.local
```
Your `.env.local` now contains the following environment variables:
- `NEXT_PUBLIC_PROJECT_ID` (placeholder) - You can generate your own ProjectId at https://cloud.walletconnect.com
- `NEXT_PUBLIC_RELAY_URL` (already set)
5. Run `yarn dev` or `npm run dev` to start local development
## Navigating through example ## Navigating through example

View File

@ -2,7 +2,7 @@
"name": "react-wallet-v2", "name": "react-wallet-v2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev -p 3001",
"build": "next build", "build": "next build",
"start": "next start", "start": "next start",
"lint": "next lint" "lint": "next lint"
@ -17,6 +17,7 @@
"@walletconnect/client": "2.0.0-beta.26", "@walletconnect/client": "2.0.0-beta.26",
"@walletconnect/utils": "2.0.0-beta.26", "@walletconnect/utils": "2.0.0-beta.26",
"bs58": "5.0.0", "bs58": "5.0.0",
"cosmos-wallet": "^1.2.0",
"ethers": "5.6.0", "ethers": "5.6.0",
"framer-motion": "6.2.8", "framer-motion": "6.2.8",
"mnemonic-keyring": "1.4.0", "mnemonic-keyring": "1.4.0",

View File

@ -1,6 +1,6 @@
import { Secp256k1Wallet, StdSignDoc } from '@cosmjs/amino' import { Secp256k1Wallet, StdSignDoc } from '@cosmjs/amino'
import { fromHex } from '@cosmjs/encoding' import { fromHex } from '@cosmjs/encoding'
import { DirectSecp256k1Wallet, makeSignBytes } from '@cosmjs/proto-signing' import { DirectSecp256k1Wallet } from '@cosmjs/proto-signing'
// @ts-expect-error // @ts-expect-error
import { SignDoc } from '@cosmjs/proto-signing/build/codec/cosmos/tx/v1beta1/tx' import { SignDoc } from '@cosmjs/proto-signing/build/codec/cosmos/tx/v1beta1/tx'
import Keyring from 'mnemonic-keyring' import Keyring from 'mnemonic-keyring'
@ -54,9 +54,7 @@ export default class CosmosLib {
} }
public async signDirect(address: string, signDoc: SignDoc) { public async signDirect(address: string, signDoc: SignDoc) {
const signDocBytes = makeSignBytes(signDoc) return await this.directSigner.signDirect(address, signDoc)
// @ts-expect-error
return await this.directSigner.signDirect(address, signDocBytes)
} }
public async signAmino(address: string, signDoc: StdSignDoc) { public async signAmino(address: string, signDoc: StdSignDoc) {

View File

@ -4,6 +4,7 @@ import { getWalletAddressFromParams } from '@/utils/HelperUtil'
import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils' import { formatJsonRpcError, formatJsonRpcResult } from '@json-rpc-tools/utils'
import { RequestEvent } from '@walletconnect/types' import { RequestEvent } from '@walletconnect/types'
import { ERROR } from '@walletconnect/utils' import { ERROR } from '@walletconnect/utils'
import { parseSignDocValues } from 'cosmos-wallet'
export async function approveCosmosRequest(requestEvent: RequestEvent) { export async function approveCosmosRequest(requestEvent: RequestEvent) {
const { method, params, id } = requestEvent.request const { method, params, id } = requestEvent.request
@ -11,7 +12,10 @@ export async function approveCosmosRequest(requestEvent: RequestEvent) {
switch (method) { switch (method) {
case COSMOS_SIGNING_METHODS.COSMOS_SIGN_DIRECT: case COSMOS_SIGNING_METHODS.COSMOS_SIGN_DIRECT:
const signedDirect = await wallet.signDirect(params.signerAddress, params.signDoc) const signedDirect = await wallet.signDirect(
params.signerAddress,
parseSignDocValues(params.signDoc)
)
return formatJsonRpcResult(id, signedDirect.signature) return formatJsonRpcResult(id, signedDirect.signature)
case COSMOS_SIGNING_METHODS.COSMOS_SIGN_AMINO: case COSMOS_SIGNING_METHODS.COSMOS_SIGN_AMINO:

View File

@ -153,6 +153,16 @@
"@cosmjs/math" "0.27.1" "@cosmjs/math" "0.27.1"
"@cosmjs/utils" "0.27.1" "@cosmjs/utils" "0.27.1"
"@cosmjs/amino@^0.25.4", "@cosmjs/amino@^0.25.6":
version "0.25.6"
resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.25.6.tgz#cdf9632253bfab7b1d2ef967124953d7bf16351f"
integrity sha512-9dXN2W7LHjDtJUGNsQ9ok0DfxeN3ca/TXnxCR3Ikh/5YqBqxI8Gel1J9PQO9L6EheYyh045Wff4bsMaLjyEeqQ==
dependencies:
"@cosmjs/crypto" "^0.25.6"
"@cosmjs/encoding" "^0.25.6"
"@cosmjs/math" "^0.25.6"
"@cosmjs/utils" "^0.25.6"
"@cosmjs/crypto@0.27.1": "@cosmjs/crypto@0.27.1":
version "0.27.1" version "0.27.1"
resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.27.1.tgz#271c853089a3baf3acd6cf0b2122fd49f8815743" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.27.1.tgz#271c853089a3baf3acd6cf0b2122fd49f8815743"
@ -169,6 +179,22 @@
ripemd160 "^2.0.2" ripemd160 "^2.0.2"
sha.js "^2.4.11" sha.js "^2.4.11"
"@cosmjs/crypto@^0.25.6":
version "0.25.6"
resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.25.6.tgz#695d2d0d2195bdbdd5825d415385646244900bbb"
integrity sha512-ec+YcQLrg2ibcxtNrh4FqQnG9kG9IE/Aik2NH6+OXQdFU/qFuBTxSFcKDgzzBOChwlkXwydllM9Jjbp+dgIzRw==
dependencies:
"@cosmjs/encoding" "^0.25.6"
"@cosmjs/math" "^0.25.6"
"@cosmjs/utils" "^0.25.6"
bip39 "^3.0.2"
bn.js "^4.11.8"
elliptic "^6.5.3"
js-sha3 "^0.8.0"
libsodium-wrappers "^0.7.6"
ripemd160 "^2.0.2"
sha.js "^2.4.11"
"@cosmjs/encoding@0.27.1": "@cosmjs/encoding@0.27.1":
version "0.27.1" version "0.27.1"
resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.27.1.tgz#3cd5bc0af743485eb2578cdb08cfa84c86d610e1" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.27.1.tgz#3cd5bc0af743485eb2578cdb08cfa84c86d610e1"
@ -178,6 +204,15 @@
bech32 "^1.1.4" bech32 "^1.1.4"
readonly-date "^1.0.0" readonly-date "^1.0.0"
"@cosmjs/encoding@^0.25.6":
version "0.25.6"
resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.25.6.tgz#da741a33eaf063a6d3611d7d68db5ca3938e0ef5"
integrity sha512-0imUOB8XkUstI216uznPaX1hqgvLQ2Xso3zJj5IV5oJuNlsfDj9nt/iQxXWbJuettc6gvrFfpf+Vw2vBZSZ75g==
dependencies:
base64-js "^1.3.0"
bech32 "^1.1.4"
readonly-date "^1.0.0"
"@cosmjs/math@0.27.1": "@cosmjs/math@0.27.1":
version "0.27.1" version "0.27.1"
resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.27.1.tgz#be78857b008ffc6b1ed6fecaa1c4cd5bc38c07d7" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.27.1.tgz#be78857b008ffc6b1ed6fecaa1c4cd5bc38c07d7"
@ -185,6 +220,13 @@
dependencies: dependencies:
bn.js "^5.2.0" bn.js "^5.2.0"
"@cosmjs/math@^0.25.6":
version "0.25.6"
resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.25.6.tgz#25c7b106aaded889a5b80784693caa9e654b0c28"
integrity sha512-Fmyc9FJ8KMU34n7rdapMJrT/8rx5WhMw2F7WLBu7AVLcBh0yWsXIcMSJCoPHTOnMIiABjXsnrrwEaLrOOBfu6A==
dependencies:
bn.js "^4.11.8"
"@cosmjs/proto-signing@0.27.1": "@cosmjs/proto-signing@0.27.1":
version "0.27.1" version "0.27.1"
resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.27.1.tgz#1f8f662550aab012d957d02f43c77d914c2ae0db" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.27.1.tgz#1f8f662550aab012d957d02f43c77d914c2ae0db"
@ -197,11 +239,25 @@
long "^4.0.0" long "^4.0.0"
protobufjs "~6.10.2" protobufjs "~6.10.2"
"@cosmjs/proto-signing@^0.25.4":
version "0.25.6"
resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.25.6.tgz#d9fc57b8e0a46cda97e192bd0435157b24949ff8"
integrity sha512-JpQ+Vnv9s6i3x8f3Jo0lJZ3VMnj3R5sMgX+8ti1LtB7qEYRR85qbDrEG9hDGIKqJJabvrAuCHnO6hYi0vJEJHA==
dependencies:
"@cosmjs/amino" "^0.25.6"
long "^4.0.0"
protobufjs "~6.10.2"
"@cosmjs/utils@0.27.1": "@cosmjs/utils@0.27.1":
version "0.27.1" version "0.27.1"
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.27.1.tgz#1c8efde17256346ef142a3bd15158ee4055470e2" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.27.1.tgz#1c8efde17256346ef142a3bd15158ee4055470e2"
integrity sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg== integrity sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==
"@cosmjs/utils@^0.25.6":
version "0.25.6"
resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.25.6.tgz#934d9a967180baa66163847616a74358732227ca"
integrity sha512-ofOYiuxVKNo238vCPPlaDzqPXy2AQ/5/nashBo5rvPZJkxt9LciGfUEQWPCOb1BIJDNx2Dzu0z4XCf/dwzl0Dg==
"@emotion/is-prop-valid@^0.8.2", "@emotion/is-prop-valid@^0.8.8": "@emotion/is-prop-valid@^0.8.2", "@emotion/is-prop-valid@^0.8.8":
version "0.8.8" version "0.8.8"
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a"
@ -1773,6 +1829,14 @@ cosmjs-types@^0.4.0:
long "^4.0.0" long "^4.0.0"
protobufjs "~6.11.2" protobufjs "~6.11.2"
cosmos-wallet@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/cosmos-wallet/-/cosmos-wallet-1.2.0.tgz#1243066fe933cf5482de1aec0b96169cebe867c6"
integrity sha512-lMEpNhjN6FHU6c8l/lYi1hWU/74bOlTmo3pz0mwVpCHjNSe5u7sZCO7j0dndd3oV0tM8tj/u3eJa4NgZxG9a0Q==
dependencies:
"@cosmjs/amino" "^0.25.4"
"@cosmjs/proto-signing" "^0.25.4"
create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"