Make Web3 unseen

Seamlessly onboard Web2-native users.

Web2 sign-in

Users see social login, a username/password, passcode, or magic link. You create a wallet for them behind the scenes.

No signing popups

No more context switching to read a confusing message.
Company logo for Kriyadex, a Shinami customer

Powered by Shinami

Company logo for Ethos, a Shinami customer

Powered by Shinami


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

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

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

await walletClient.executeGaslessTransaction(
  {{walletID}},
  sessionToken,
  {{transaction}}
);
  
 

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

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.executeGaslessTransaction(
  {{walletId}},
  sessionToken,
  {{gaslessTransaction}}
);
  
 

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

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.