This package contains helpers to use Viem with Turnkey.
We provide a Turnkey Custom Account (signer) which implements the signing APIs expected by Viem clients.
If you need a lower-level, fully typed HTTP client for interacting with Turnkey API, check out @turnkey/http
.
$ npm install viem @turnkey/viem
import { createAccount } from "@turnkey/viem";
import { TurnkeyClient } from "@turnkey/http";
import { ApiKeyStamper } from "@turnkey/api-key-stamper";
import { createWalletClient, http } from "viem";
import { sepolia } from "viem/chains";
async function main() {
// Create a Turnkey HTTP client with API key credentials
const httpClient = new TurnkeyClient(
{
baseUrl: "https://api.turnkey.com",
},
// This uses API key credentials.
// If you're using passkeys, use `@turnkey/webauthn-stamper` to collect webauthn signatures:
// new WebauthnStamper({...options...})
new ApiKeyStamper({
apiPublicKey: "...",
apiPrivateKey: "...",
}),
);
// Create the Viem custom account
const turnkeyAccount = await createAccount({
client: httpClient,
organizationId: "...",
signWith: "...",
// optional; will be fetched from Turnkey if not provided
ethereumAddress: "...",
});
// Below: standard Viem APIs are used, nothing special!
const client = createWalletClient({
account: turnkeyAccount,
chain: sepolia,
transport: http(`https://sepolia.infura.io/v3/$(YOUR_INFURA_API_KEY)`),
});
const transactionRequest = {
to: "0x08d2b0a37F869FF76BACB5Bab3278E26ab7067B7" as `0x${string}`,
value: 1000000000000000n, // 0.001 ETH
};
const txHash = await client.sendTransaction(transactionRequest);
console.log(`Success! Transaction broadcast with hash ${txHash}`);
}
main().catch((error) => {
console.error(error);
process.exit(1);
});
-
Copy
.env.example
to.env
$ cp .env.example .env
-
Start the Anvil node in one shell:
- Install Foundry & Anvil if you haven't done so already
- Add Foundry to your
$PATH
$ export PATH="$PATH:$HOME/.foundry/bin"
- Source your env e.g.
$ source ~/.zshrc
- Run
foundryup
to installAnvil
$ foundryup
- Start Anvil
$ pnpm anvil
-
Run the tests in a new shell:
$ pnpm test
-
@turnkey/example-with-viem
: example using this package to create, sign, and broadcast a transaction on Sepolia (Ethereum testnet) -
@turnkey/http
: lower-level fully typed HTTP client for interacting with Turnkey API -
@turnkey/api-key-stamper
: package to authenticate to Turnkey using API key credentials -
@turnkey/webauthn-stamper
: package to authenticate to Turnkey using Webauthn/passkeys.