Skip to content

Commit

Permalink
add ethers tests
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewkmin committed Sep 18, 2023
1 parent e3604aa commit c15a9ac
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 11 deletions.
1 change: 1 addition & 0 deletions examples/with-ethers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"private": true,
"scripts": {
"start": "pnpm -w run build-all && tsx src/index.ts",
"start-advanced": "pnpm -w run build-all && tsx src/advanced.ts",
"start-legacy-sepolia": "pnpm -w run build-all && tsx src/legacySepolia.ts",
"clean": "rimraf ./dist ./.cache",
"typecheck": "tsc --noEmit"
Expand Down
115 changes: 115 additions & 0 deletions examples/with-ethers/src/advanced.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
import * as path from "path";
import * as dotenv from "dotenv";

// Load environment variables from `.env.local`
dotenv.config({ path: path.resolve(process.cwd(), ".env.local") });

import { TurnkeySigner } from "@turnkey/ethers";
import { ethers } from "ethers";
import { TurnkeyClient } from "@turnkey/http";
import { ApiKeyStamper } from "@turnkey/api-key-stamper";
import { createNewEthereumPrivateKey } from "./createNewEthereumPrivateKey";

async function main() {
if (!process.env.PRIVATE_KEY_ID) {
// If you don't specify a `PRIVATE_KEY_ID`, we'll create one for you via calling the Turnkey API.
await createNewEthereumPrivateKey();
return;
}

const turnkeyClient = new TurnkeyClient(
{
baseUrl: process.env.BASE_URL!,
},
new ApiKeyStamper({
apiPublicKey: process.env.API_PUBLIC_KEY!,
apiPrivateKey: process.env.API_PRIVATE_KEY!,
})
);

// Initialize a Turnkey Signer
const turnkeySigner = new TurnkeySigner({
client: turnkeyClient,
organizationId: process.env.ORGANIZATION_ID!,
privateKeyId: process.env.PRIVATE_KEY_ID!,
});

// Bring your own provider (such as Alchemy or Infura: https://docs.ethers.org/v5/api/providers/)
const network = "goerli";
const provider = new ethers.providers.InfuraProvider(network);
const connectedSigner = turnkeySigner.connect(provider);
const address = await connectedSigner.getAddress();

print("Address:", address);

const baseMessage = "Hello Turnkey";

// 1. Sign a raw hex message
const hexMessage = ethers.utils.hexlify(
ethers.utils.toUtf8Bytes(baseMessage)
);
let signature = await connectedSigner.signMessage(hexMessage);
let recoveredAddress = ethers.utils.verifyMessage(hexMessage, signature);

print("Turnkey-powered signature - raw hex message:", `${signature}`);
assertEqual(recoveredAddress, address);

// 2. Sign a raw bytes message
const bytesMessage = ethers.utils.toUtf8Bytes(baseMessage);
signature = await connectedSigner.signMessage(bytesMessage);
recoveredAddress = ethers.utils.verifyMessage(bytesMessage, signature);

print("Turnkey-powered signature - raw bytes message:", `${signature}`);
assertEqual(recoveredAddress, address);

// 3. Sign typed data (EIP-712)
const typedData = {
types: {
// Note that we do not need to include `EIP712Domain` as a type here, as Ethers will automatically inject it for us
Person: [
{ name: "name", type: "string" },
{ name: "wallet", type: "address" },
],
},
domain: {
name: "EIP712 Test",
version: "1",
},
primaryType: "Person",
message: {
name: "Alice",
wallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
},
};

signature = await connectedSigner.signTypedData(
typedData.domain,
typedData.types,
typedData.message
);

recoveredAddress = ethers.utils.verifyTypedData(
typedData.domain,
typedData.types,
typedData.message,
signature
);

print("Turnkey-powered signature - typed data (EIP-712):", `${signature}`);
assertEqual(recoveredAddress, address);
}

main().catch((error) => {
console.error(error);
process.exit(1);
});

function print(header: string, body: string): void {
console.log(`${header}\n\t${body}\n`);
}

function assertEqual<T>(left: T, right: T) {
if (left !== right) {
throw new Error(`${JSON.stringify(left)} !== ${JSON.stringify(right)}`);
}
}
11 changes: 1 addition & 10 deletions examples/with-ethers/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ethers } from "ethers";
import { TurnkeyClient } from "@turnkey/http";
import { ApiKeyStamper } from "@turnkey/api-key-stamper";
import { createNewEthereumPrivateKey } from "./createNewEthereumPrivateKey";
import { print, assertEqual } from "./util";
import WETH_TOKEN_ABI from "./weth-contract-abi.json";

const WETH_TOKEN_ADDRESS_GOERLI = "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6";
Expand Down Expand Up @@ -123,13 +124,3 @@ main().catch((error) => {
console.error(error);
process.exit(1);
});

function print(header: string, body: string): void {
console.log(`${header}\n\t${body}\n`);
}

function assertEqual<T>(left: T, right: T) {
if (left !== right) {
throw new Error(`${JSON.stringify(left)} !== ${JSON.stringify(right)}`);
}
}
9 changes: 9 additions & 0 deletions examples/with-ethers/src/util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export function print(header: string, body: string): void {
console.log(`${header}\n\t${body}\n`);
}

export function assertEqual<T>(left: T, right: T) {
if (left !== right) {
throw new Error(`${JSON.stringify(left)} !== ${JSON.stringify(right)}`);
}
}
4 changes: 3 additions & 1 deletion examples/with-viem/src/advanced.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ async function main() {
});

const address = client.account.address;
print("Address:", address);

const baseMessage = "Hello Turnkey";

// 1. Sign a raw hex message
Expand Down Expand Up @@ -118,7 +120,7 @@ async function main() {
signature,
});

print("Turnkey-powered signature - typed data:", `${signature}`);
print("Turnkey-powered signature - typed data (EIP-712):", `${signature}`);
assertEqual(address, recoveredAddress);
}

Expand Down

0 comments on commit c15a9ac

Please sign in to comment.