UNPKG

@erc7824/nitrolite

Version:

The Nitrolite SDK empowers developers to build high-performance, scalable web3 applications using state channels. It's designed to provide near-instant transactions and significantly improved user experiences by minimizing direct blockchain interactions.

351 lines (350 loc) 16.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createAuthRequestMessage = createAuthRequestMessage; exports.createAuthVerifyMessageFromChallenge = createAuthVerifyMessageFromChallenge; exports.createAuthVerifyMessage = createAuthVerifyMessage; exports.createAuthVerifyMessageWithJWT = createAuthVerifyMessageWithJWT; exports.createPingMessage = createPingMessage; exports.createGetConfigMessage = createGetConfigMessage; exports.createGetUserTagMessage = createGetUserTagMessage; exports.createGetLedgerBalancesMessage = createGetLedgerBalancesMessage; exports.createGetLedgerEntriesMessage = createGetLedgerEntriesMessage; exports.createGetLedgerTransactionsMessage = createGetLedgerTransactionsMessage; exports.createGetAppDefinitionMessage = createGetAppDefinitionMessage; exports.createGetAppSessionsMessage = createGetAppSessionsMessage; exports.createAppSessionMessage = createAppSessionMessage; exports.createSubmitAppStateMessage = createSubmitAppStateMessage; exports.createCloseAppSessionMessage = createCloseAppSessionMessage; exports.createApplicationMessage = createApplicationMessage; exports.createCreateChannelMessage = createCreateChannelMessage; exports.createCloseChannelMessage = createCloseChannelMessage; exports.createResizeChannelMessage = createResizeChannelMessage; exports.createGetChannelsMessage = createGetChannelsMessage; exports.createGetRPCHistoryMessage = createGetRPCHistoryMessage; exports.createGetAssetsMessage = createGetAssetsMessage; exports.createTransferMessage = createTransferMessage; exports.createEIP712AuthMessageSigner = createEIP712AuthMessageSigner; exports.createECDSAMessageSigner = createECDSAMessageSigner; const viem_1 = require("viem"); const types_1 = require("./types"); const nitrolite_1 = require("./nitrolite"); const utils_1 = require("./utils"); const sign_1 = require("../utils/sign"); async function createAuthRequestMessage(params, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.AuthRequest, params, requestId, timestamp, }); return JSON.stringify(request); } async function createAuthVerifyMessageFromChallenge(signer, challenge, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { challenge: challenge }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.AuthVerify, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createAuthVerifyMessage(signer, challenge, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { challenge: challenge.params.challengeMessage }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.AuthVerify, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createAuthVerifyMessageWithJWT(jwtToken, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { jwt: jwtToken }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.AuthVerify, params, requestId, timestamp, }); return JSON.stringify(request); } async function createPingMessage(signer, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.Ping, params: {}, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetConfigMessage(signer, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetConfig, params: {}, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetUserTagMessage(signer, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetUserTag, params: {}, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetLedgerBalancesMessage(signer, participant, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { participant: participant }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetLedgerBalances, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetLedgerEntriesMessage(signer, accountId, asset, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { account_id: accountId, ...(asset ? { asset } : {}), }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetLedgerEntries, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetLedgerTransactionsMessage(signer, accountId, filters, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const filteredParams = {}; if (filters) { Object.entries(filters).forEach(([key, value]) => { if (value !== undefined && value !== null && value !== '') { filteredParams[key] = value; } }); } const params = { account_id: accountId, ...filteredParams, }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetLedgerTransactions, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetAppDefinitionMessage(signer, appSessionId, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { app_session_id: appSessionId }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetAppDefinition, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetAppSessionsMessage(signer, participant, status, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { participant, ...(status ? { status } : {}), }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetAppSessions, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createAppSessionMessage(signer, params, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.CreateAppSession, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createSubmitAppStateMessage(signer, params, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.SubmitAppState, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createCloseAppSessionMessage(signer, params, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.CloseAppSession, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createApplicationMessage(signer, appSessionId, messageParams, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createAppRequest({ method: types_1.RPCMethod.Message, params: messageParams, requestId, timestamp, }, appSessionId); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createCreateChannelMessage(signer, params, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.CreateChannel, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest, (_, value) => (typeof value === 'bigint' ? value.toString() : value)); } async function createCloseChannelMessage(signer, channelId, fundDestination, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { channel_id: channelId, funds_destination: fundDestination }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.CloseChannel, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createResizeChannelMessage(signer, params, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.ResizeChannel, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest, (_, value) => (typeof value === 'bigint' ? value.toString() : value)); } async function createGetChannelsMessage(signer, participant, status, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { ...(participant ? { participant } : {}), ...(status ? { status } : {}), }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetChannels, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetRPCHistoryMessage(signer, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetRPCHistory, params: {}, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createGetAssetsMessage(signer, chainId, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const params = { ...(chainId ? { chain_id: chainId } : {}), }; const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.GetAssets, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } async function createTransferMessage(signer, params, requestId = (0, utils_1.generateRequestId)(), timestamp = (0, utils_1.getCurrentTimestamp)()) { const hasDestination = !!params.destination; const hasDestinationTag = !!params.destination_user_tag; if (hasDestination === hasDestinationTag) { throw new Error(hasDestination ? 'Cannot provide both destination and destination_user_tag' : 'Either destination or destination_user_tag must be provided'); } const request = nitrolite_1.NitroliteRPC.createRequest({ method: types_1.RPCMethod.Transfer, params, requestId, timestamp, }); const signedRequest = await nitrolite_1.NitroliteRPC.signRequestMessage(request, signer); return JSON.stringify(signedRequest); } function createEIP712AuthMessageSigner(walletClient, partialMessage, domain) { return async (payload) => { const address = walletClient.account?.address; if (!address) { throw new Error('Wallet client is not connected or does not have an account.'); } const method = payload[1]; if (method !== types_1.RPCMethod.AuthVerify) { throw new Error(`This EIP-712 signer is designed only for the '${types_1.RPCMethod.AuthVerify}' method, but received '${method}'.`); } const params = payload[2]; if (!('challenge' in params) || typeof params.challenge !== 'string') { throw new Error('Invalid payload for AuthVerify: The challenge string is missing or malformed.'); } const challengeUUID = params.challenge; const message = { ...partialMessage, challenge: challengeUUID, wallet: address, }; try { const untypedMessage = { ...message }; const signature = await walletClient.signTypedData({ account: walletClient.account, domain, types: types_1.EIP712AuthTypes, primaryType: 'Policy', message: untypedMessage, }); return signature; } catch (eip712Error) { const errorMessage = eip712Error instanceof Error ? eip712Error.message : String(eip712Error); console.error('EIP-712 signing failed:', errorMessage); throw new Error(`EIP-712 signing failed: ${errorMessage}`); } }; } function createECDSAMessageSigner(privateKey) { return async (payload) => { try { const message = (0, viem_1.toHex)(JSON.stringify(payload, (_, v) => (typeof v === 'bigint' ? v.toString() : v))); return (0, sign_1.signRawECDSAMessage)(message, privateKey); } catch (error) { console.error('ECDSA signing failed:', error); throw new Error(`ECDSA signing failed: ${error}`); } }; }