New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@silencelaboratories/walletprovider-sdk

Package Overview
Dependencies
Maintainers
11
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@silencelaboratories/walletprovider-sdk

Frontend SDK for Wallet Providers

0.4.1
latest
npm
Version published
Weekly downloads
1K
-1.95%
Maintainers
11
Weekly downloads
 
Created
Source

walletprovider-sdk

The client library for Silent Network Wallet Provider Service.

  • Installing
  • Quick start
  • Documentation
  • Features
  • Development

Installing

npm i @silencelaboratories/walletprovider-sdk

Quick start

Check the demo for a quick start guide.

Documentation

For description of classes, interfaces, types, please refer to documentation.

Features

  • Authentication
  • Keygen
  • Signing

Overview

The library provides API to authenticate, generate keys, and sign messages against the Silent Network. Before sending request for a distributed key or signature, users need to be authenticated to the Silent Network.

Once authenticated, users register an ephemeral signing key pair and associate it with their identity. The ephemeral signing keys can later be used to authorize signing requests for duration of the session without the need for repeated user interaction, providing a seamless and secure authentication mechanism.

Authentication

Users authenticate to Silent Network using 2 methods Wallet-based or Passkey.

  • Wallet-based authenticate users using their digital wallet, it runs at the same time users start doing keygen.

  • Passkey has 2 steps: register and login. The user registers a passkey with the network, then logs in with the passkey while starting the keygen process.

The ephemeral public claim will be associated with both EOAAuth and PasskeyAuth objects.

  • Users will use EphAuth to do non-interactive authenticate during signing.
  • The library supports 2 signing algorithms for ephemeral signing keys: secp256k1, ed25519

Keygen

The full working example is in the demo. The core object to use is the NetworkSigner. It allows to generate keys and do signatures.

In order to create your keys, you need two other components. The WalletProviderServiceClient that connects to the Backend part of the SDK, and the authenticator module.

Authenticate with EOA wallet

We provide EOA authentication via EOAAuth module. Let's create the NetworkSigner with associated EOAAuth object.

const algSign = 'secp256k1'; // Signing algorithms of ephemeral key
// Generate ephemeral secret key esk
const sk = generateEphPrivateKey(algSign);
// Derive public part epk from esk
const ephPK = getEphPublicKey(sk, algSign);
// Arbitrary ID to identify the ephemeral key
const ephId = uuidv4();
// Create ephemeral key claim instance based on the ephemeral key
const ephClaim = new EphKeyClaim(
  ephId,
  ephPK,
  algSign,
  // Lifetime of one hour
  60 * 60,
);

// Create EOA authenticator, signature will include epk
const eoaAuth = new EOAAuth(
  accountsFromBrowserWallet[0],
  new BrowserWallet(),
  ephClaim
);

// Create a client that connects to the backend service
const wpClient = await createWalletProviderService(clusterConfig);

// Create a new signer instance
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, eoaAuth);

Now you can generate a key, using the generateKey method. The method accepts optional permissions. No permissions means allow all operations.

const permissions = {
  permissions: [
    {
      type: 'erc20',
      method: 'approve',
      to: '0x1234567890123456789012345678901234567890',
      args: {
        spender: '0x1234567890123456789012345678901234567890',
        value: 10000,
        eq: '<',
      },
    },
  ],
};

// Generate a new key
let resp: KeygenResponse = await sdk.generateKey(JSON.stringify(permissions));

Calling this method will cause to the Digital Wallet window to pop up, requesting the User to sign the request.

The returned KeygenResponse contains keyId and publicKey. The publicKey is the public part of the key generated by Silent Network. Use the keyId in subsequent calls to sign.

The ephemeral sk key can be later used in subsequent signgen requests for authenticating.

Authenticate with Passkey

First, we need to register user passkey to the network. We provide Passkey register via PasskeyRegister module.

const wpClient = await createWalletProviderService(clusterConfig);
const rpConfig: RelyingPartyConfig = {
  rpId: 'localhost',
  rpName: 'http://localhost:5173',
};
const userId = uuidv4();
const passkeyUser = {
  id: userId,
  displayName: 'Alice',
  name: 'alice@gmail.com ' + userId, // For development purposes
};

const passkeyAuth = new PasskeyRegister(rpConfig, passkeyUser);
// Create a new signer instance
const sdk = new NetworkSigner(wpClient, +threshold, +partiesNumber, passkeyAuth);

// Register a new passkey
let resp: RegisterPasskeyResponse = await sdk.registerPasskey();

We provide Passkey login authentication via PasskeyAuth module. Let's create the NetworkSigner with associated PasskeyAuth object.

const algSign = 'secp256k1'; // Signing algorithms of ephemeral key
// Generate ephemeral secret key esk
const sk = generateEphPrivateKey(algSign);
// Derive public part epk from esk
const ephPK = getEphPublicKey(sk, algSign);
// Arbitrary ID to identify the ephemeral key
const ephId = uuidv4();
// Create ephemeral key claim instance based on the ephemeral key
const ephClaim = new EphKeyClaim(
  ephId,
  ephPK,
  // Lifetime of one hour
  60 * 60,
);
// Create a client that connects to the backend service
const wpClient = await createWalletProviderService(clusterConfig);
// Here we configure the relying party for local development
const rpConfig: RelyingPartyConfig = {
  rpId: 'localhost',
  rpName: 'http://localhost:5173',
};

// Get passkey credential id from your storage
const credentialId = getPasskeyCredentialId();
// Create Passkey authenticator, signature will include epk
const passkeyAuth = new PasskeyAuth(
  rpConfig,
  // We will do passkey auth/login with the provided credentialId
  credentialId,
  ephClaim,
);

// Create a new signer instance
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, passkeyAuth);

Now you can generate a key like in the EOA example by calling the generateKey method.

Calling this method will prompt the device to request Passkey User Verification. Once user verification is done, the KeygenResponse is returned.

The sk key can be later used in subsequent signgen requests.

Signing

The full signing example is here.

The workflow is similar to the keygen process. The core objects to use are the NetworkSigner, WalletProviderServiceClient, and the ephemeral authenticator module.

const authModule = new EphAuth(selectedEphId, ephSK, selectedEphSignAlg);
// Create a new signer instance
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, authModule);

Use the NetworkSigner.signMessage method in order to generate a signature.

const signMessage = new SignRequestBuilder()
    .setRequest(
      uuidv4(),
      JSON.stringify({
        userOperation: {
          sender: '0x8d4cb2540d993fe34c646299f1ab4af3012ff34c',
          nonce: '0x7',
          initCode: '0x',
          callData: '0000...',
          callGasLimit: '0x18473',
          verificationGasLimit: '0x18473',
          preVerificationGas: '66768',
          maxFeePerGas: '',
          maxPriorityFeePerGas: '',
          paymasterAndData: '0x',
        },
        entryPointVersion: 'v0.6.0',
        entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',
        chainId: 80002,
      }),
      'accountAbstractionTx',
    )
    .setRequest(
      uuidv4(),
      '4549502d313931206d657373616765',
      'rawBytes',
    )
    .build();

let resp = await sdk.signMessage(selectedKeyId, signMessage);

The SignResponse contains the signature sign and the recovery ID recid.

Development

Build the library

npm i
npm run build

The output will be in the dist folder.

End to end tests

Please refer to README.md for instructions how to execute them.

Generate the documentation

npm run docs

Lint the code

./local_ci.sh

FAQs

Package last updated on 31 Jan 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts