walletprovider-sdk
The frontend library for Silent Network.
Demo
Under the demo directory we provide the sample webpage that shows example usage of the library.
In order to run it execute the following:
npm install
npm run build
cd demo
npm install
npm run dev
The demo fetches configuration from the .env
file. We provided example .env
here.
The demo communicates with backend service. Run it before using the demo page.
Using the library
The library is published on npmjs registry.
Install it in your project as usual:
npm i @silencelaboratories/walletprovider-sdk
The backend
The library communicates with backend service. The example implementation of such service is accessible here. Please refer to backend documentation in order to run the service.
Frontend uses WalletProviderServiceClient object in order to connect to the backend and send requests.
Documentation
For description of classes, interfaces, types, please refer to documentation.
Authentication
Users authenticate using an EOA wallet during key generation and register an ephemeral signing key pair and associates it with their identity.
Frontend can later use the ephemeral signing key pair to authorize signing requests for duration of the session without the need for repeated user interaction, providing a seamless and secure authentication mechanism.
We use EOAAuth to authenticate the user during keygen. The EOAAuth
object is created with the user's wallet address, ephemeral public key, and lifetime of the key in seconds.
We then use EphAuth to authenticate the user during signing. The EphAuth
object is created with the user's wallet address and ephemeral keypair.
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, you need two other components. The WalletProviderServiceClient that connects to the Backend part of the SDK, and the authentication module. Currently we provide EOA authentication via EOAAuth.
Let's create the NetworkSigner
const sk = ed.utils.randomPrivateKey();
ephSK = sk;
ephPK = await ed.getPublicKeyAsync(sk);
const wpClient = await createWalletProviderService(clusterConfig);
const eoaAuth = new EOAAuth(
accountsFromBrowserWallet[0],
new BrowserWallet(),
ephPK,
60 * 60,
);
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, eoaAuth);
Now you can generate a key, using the authenticateAndCreateKey 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: '<',
},
},
],
};
let resp: KeygenResponse = await sdk.authenticateAndCreateKey(JSON.stringify(permissions));
Calling this method will cause to the Browser Wallet window to pop up, requesting the User to sign the request. After execution KeygenResponse is returned.
The 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 esk
key can be later used by the frontend in subsequent signgen requests for authenticating.
Signing
The full signing example is here.
Let's create NetworkSigner for signing. Note the EphAuth
is used to avoid user interaction when generating the signatures.
const authModule = new EphAuth(accountsFromBrowserWallet[0], ephSK!);
const sdk = new NetworkSigner(wpClient, threshold, partiesNumber, authModule);
Use the NetworkSigner.authenticateAndSign method in order to generate a signature.
let signMessage = JSON.stringify({
userOperation: {
sender: '0x8d4cb2540d993fe34c646299f1ab4af3012ff34c',
nonce: '0x7',
initCode: '',
callData: '0000189a...',
callGasLimit: '123130',
verificationGasLimit: '153427',
preVerificationGas: '66768',
maxFeePerGas: '',
maxPriorityFeePerGas: '',
paymasterAndData: '',
},
entryPointVersion: 'v0.6.0',
entryPointAddress: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',
chainId: 80002,
});
let resp = await sdk.authenticateAndSign(selectedKeyId, signMessage);
The SignResponse contains the signature sign
and the recovery ID recid
.
Install dependencies
npm install
Build
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.
Format the code
npm run format
Generate the documentation
npm run docs