Immersive UX

Make Web3 unseen

Onboard both Web2 and Web3 users to your app

Custom Authentication

Create wallets for users instead of requiring them to already have one.

Remove Signing Popups

Avoid context switching and latency.

Powering top apps on Sui

Powering innovative crypto teams


import { KeyClient, WalletClient } from "@shinami/clients";

const keyClient = new KeyClient({{walletServicesAccessKey}});
const walletClient = new WalletClient({{walletServicesAccessKey}});

const sessionToken = await keyClient.createSession({{walletSecret}});

// Execute a Sui transaction and cover the small gas fee for your user. For example,
// upgrading a NFT that represents an in-game item as they level it up.
const response = await walletClient.executeGaslessTransactionBlock(
  {{walletId}},
  sessionToken,
  gaslessTransactionBytesBase64,
  {{gasBudget}}
);
  
 

import { ZkProverClient, ZkWalletClient } from "@shinami/clients";

const zkw = new ZkWalletClient({{walletServicesAccessKey}});
const zkp = new ZkProverClient({{walletServicesAccessKey}});

// Prepare a nonce according to the zkLogin requirements.
// Obtain a valid jwt with that nonce from a supported OpenID provider.

const { salt, address } = await zkw.getOrCreateZkLoginWallet({{jwt}});

const { zkProof } = await zkp.createZkLoginProof(
  {{jwt}},
  {{maxEpoch}},
  {{ephemeralPublicKey}},
  {{jwtRandomness}},
  salt
);

// Now you can sign transaction blocks with the ephemeralPrivateKey, 
// and assemble the zkLogin signature using the zkProof.