@kyve/sdk-beta
Version:
<p align="center"> <a href="https://kyve.network"> <img src="https://user-images.githubusercontent.com/62398724/137493477-63868209-a19b-4efa-9413-f06d41197d6d.png" style="border-radius: 50%" height="96"> </a> <h3 align="center"><code>@kyve/sdk</
166 lines (162 loc) • 5.54 kB
text/typescript
import KyveClient from "../../src/clients/rpc-client/client";
import { SigningStargateClient } from "@cosmjs/stargate";
import { OfflineAminoSigner } from "@cosmjs/amino/build/signer";
import Mock = jest.Mock;
import { cosmos } from "@keplr-wallet/cosmos";
import TxRaw = cosmos.tx.v1beta1.TxRaw;
import { Secp256k1HdWallet, Secp256k1Wallet } from "@cosmjs/amino";
import { PREFIX } from "../../src/constants";
import KyveSDK from "../../src";
import { fromHex } from "@cosmjs/encoding";
import { KeplrAminoSigner } from "../../src/utils/keplr-helper";
import { Keplr } from "@keplr-wallet/types";
import { Network } from "../../src/constants";
const TEST_PRIVATE_KEY =
"3fff4f4365485545348c2fb5dd85775058b16b7c5117d9f2c8824d9e9e28dcef";
const TEST_MNEMONIC =
"slogan taxi lonely path hazard laundry cruise luggage exile upgrade figure toward";
const TEST_STRING = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
describe("sign string", () => {
let kyvePrivateKeySignerClient: KyveClient;
let kyveMnemonicSignerClient: KyveClient;
let kyveKeplrSignerClient: KyveClient;
let mockSign: Mock;
let mockSendTokens: Mock;
let mockGetBalance: Mock;
let mockKeplrAminoSign: Mock;
beforeEach(async () => {
mockSign = jest.fn(() => TxRaw.create());
mockSendTokens = jest.fn();
mockGetBalance = jest.fn(() => ({ amount: 0 }));
const mockNativeClient = {
simulate: () => Promise.resolve(1),
sign: mockSign,
sendTokens: mockSendTokens,
getBalance: mockGetBalance,
} as unknown as SigningStargateClient;
/** INIT clients with different amino signers **/
const aminoPrivateKeySigner = await Secp256k1Wallet.fromKey(
fromHex(TEST_PRIVATE_KEY),
PREFIX
);
const [accountKey] = await aminoPrivateKeySigner.getAccounts();
kyvePrivateKeySignerClient = new KyveClient(
mockNativeClient,
accountKey,
aminoPrivateKeySigner
);
const aminoMnemonicSigner = await Secp256k1HdWallet.fromMnemonic(
TEST_MNEMONIC,
{
prefix: PREFIX,
}
);
const [accMnemonic] = await aminoMnemonicSigner.getAccounts();
kyveMnemonicSignerClient = new KyveClient(
mockNativeClient,
accMnemonic,
aminoMnemonicSigner
);
mockKeplrAminoSign = jest.fn((...args) =>
aminoMnemonicSigner.signAmino.apply(aminoMnemonicSigner, [
args[1],
args[2],
])
);
const mockKeplr = {
signAmino: mockKeplrAminoSign,
getKey() {
return {
bech32Address: accMnemonic.address,
pubkey: accMnemonic.pubkey,
};
},
} as unknown as Keplr;
const aminoKeplrSigner = new KeplrAminoSigner(mockKeplr, {
chainId: "test-chain",
} as unknown as Network);
kyveKeplrSignerClient = new KyveClient(
mockNativeClient,
accMnemonic,
aminoKeplrSigner
);
});
describe("from private key", () => {
test("should verify same string as truthy", async () => {
const sign = await kyvePrivateKeySignerClient.signString(TEST_STRING);
const result = await KyveSDK.verifyString(
sign.signature,
TEST_STRING,
sign.pub_key.value
);
expect(result).toEqual(true);
});
test("should verify opposite string as falsy", async () => {
const sign = await kyvePrivateKeySignerClient.signString(
TEST_STRING + Date.now()
);
const result = await KyveSDK.verifyString(
sign.signature,
TEST_STRING,
sign.pub_key.value
);
expect(result).toEqual(false);
});
});
describe("from mnemonic", () => {
test("should verify same string as truthy", async () => {
const sign = await kyveMnemonicSignerClient.signString(TEST_STRING);
const result = await KyveSDK.verifyString(
sign.signature,
TEST_STRING,
sign.pub_key.value
);
expect(result).toEqual(true);
});
test("should verify opposite string as falsy", async () => {
const sign = await kyveMnemonicSignerClient.signString(
TEST_STRING + Date.now()
);
const result = await KyveSDK.verifyString(
sign.signature,
TEST_STRING,
sign.pub_key.value
);
expect(result).toEqual(false);
});
});
describe("from keplr", () => {
function verifyADR36Behavior() {
//https://docs.keplr.app/api/#request-signature-for-arbitrary-message
expect(mockKeplrAminoSign).toHaveBeenCalledTimes(1);
const [[_1, _2, signDoc]] = mockKeplrAminoSign.mock.calls;
expect(signDoc.chain_id).toEqual("");
expect(signDoc.account_number).toEqual("0");
expect(signDoc.fee).toEqual({ gas: "0", amount: [] });
expect(signDoc.msgs[0].type).toEqual("sign/MsgSignData");
expect(signDoc.memo).toEqual("");
}
test("should verify same string as truthy", async () => {
const sign = await kyveKeplrSignerClient.signString(TEST_STRING);
verifyADR36Behavior();
const result = KyveSDK.verifyString(
sign.signature,
TEST_STRING,
sign.pub_key.value
);
expect(result).toBeTruthy();
});
test("should verify opposite string as falsy", async () => {
const sign = await kyveKeplrSignerClient.signString(
TEST_STRING + Date.now()
);
const result = await KyveSDK.verifyString(
sign.signature,
TEST_STRING,
sign.pub_key.value
);
verifyADR36Behavior();
expect(result).toEqual(false);
});
});
});