UNPKG

@shogun-sdk/accounts

Version:

Shogun with Turnkey: configs, encryption, authentication with Telegram/Turnkey OIDC, etc.

100 lines (88 loc) 3.06 kB
import { VersionedTransaction } from '@solana/web3.js'; export const makeExternalRequest = async (apiDomain: string, endpoint: string, data: any) => { const response = await fetch(`${apiDomain}${endpoint}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }); if (!response.ok) { throw new Error(`External request failed: ${response.statusText}`); } return response.json(); }; export const makeExternalGetRequest = async (apiDomain: string, endpoint: string, params?: Record<string, string>) => { const url = new URL(`${apiDomain}${endpoint}`); if (params) { Object.entries(params).forEach(([key, value]) => { url.searchParams.append(key, value); }); } const response = await fetch(url.toString(), { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); if (!response.ok) { throw new Error(`External request failed: ${response.statusText}`); } return response.json(); }; const safeSerialize = (data: any) => { return JSON.parse(JSON.stringify(data, (_key, value) => (typeof value === 'bigint' ? value.toString() : value))); }; export const createExternalSigner = ( apiDomain: string, externalSubOrgId: string, chainId: number, signWith?: string | null, ) => { return { account: signWith, writeContract: (data: any) => { // Attempt to safely serialize BigInt values to string const safeData = safeSerialize(data); return makeExternalRequest(apiDomain, '/api/turnkey/external-transaction', { orgId: externalSubOrgId, transactionData: safeData, type: 'writeContract', address: signWith || data.account, chainId, }); }, sendTransaction: (data: any) => { // Attempt to safely serialize BigInt values to string const safeData = safeSerialize(data); return makeExternalRequest(apiDomain, '/api/turnkey/external-transaction', { orgId: externalSubOrgId, transactionData: safeData, type: 'sendTransaction', address: signWith || data.account, chainId, }); }, signAllTransactions: (transactions: any, address: any) => { return makeExternalRequest(apiDomain, '/api/turnkey/external-transaction', { orgId: externalSubOrgId, transactions: transactions, address: address, type: 'signAllTransactions', chainId, }); }, addSignature: (transaction: VersionedTransaction, address: any) => { const serializedTransaction: Uint8Array<ArrayBufferLike> = transaction.serialize(); // Convert the serialized Uint8Array to a base64 string const base64Transaction = Buffer.from(serializedTransaction).toString('base64'); return makeExternalRequest(apiDomain, '/api/turnkey/external-transaction', { orgId: externalSubOrgId, transactionData: base64Transaction, address: address, type: 'addSignature', chainId, }); }, } as any; };