@keyban/sdk-base
Version:
Keyban Javascript SDK provides core functionalities for the MPC wallet solution, supporting web and Node.js apps with TypeScript, custom storage, and Ethereum blockchain integration.
1 lines • 26.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/stellar/account.ts","../src/stellar/signer.ts","../src/stellar/client.ts"],"names":["TX_VALIDITY_DURATION","STELLAR_DECIMALS","BigNumber","StellarAccount","KeybanAccount","#signer","#rpcProvider","#horizonServer","rpcClient","rpcProvider","horizonServer","signer","publicKey","message","hash","Buffer","to","value","fee","SdkError","account","networkDetails","paymentTxBuilder","TransactionBuilder","BASE_FEE","formattedAmount","#isAccountCreated","Operation","Asset","paymentTx","signature","#submitTransaction","_to","operationCount","feesPerOperation","#recommendedFeesPerOperation","contractAddress","fees","assetCode","assetIssuer","asset","_params","tx","functionName","response","finalResponse","rpc","rawTx","networkPassphrase","setupTx","Transaction","address","max_fee","txHash","StellarSigner","#rpcClient","#clientShare","#publicKey","clientShare","StrKey","data","hexSignature","hint","xdr","keyHint","byte","i","a","ed25519","id","StellarClient","KeybanClientBase","#metadataConfig","config","metadataConfig","key","stellarPubKey","Horizon"],"mappings":"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","file":"stellar-REZKRHRW.mjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n Asset,\n BASE_FEE,\n Horizon,\n Operation,\n rpc,\n Transaction,\n TransactionBuilder,\n} from \"@stellar/stellar-sdk\";\nimport { BigNumber } from \"bignumber.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n Address,\n EstimateERC20TransferParams,\n EstimateNftTransferParams,\n FeesEstimation,\n Hash,\n Hex,\n KeybanAccount,\n SdkError,\n TransferERC20Params,\n TransferNftParams,\n} from \"~/index\";\nimport { RpcClient } from \"~/rpc\";\nimport { StellarSigner } from \"~/stellar/signer\";\n\nconst TX_VALIDITY_DURATION = 25; // Slightly below the default polling timeout of 30 seconds\nconst STELLAR_DECIMALS = 7;\nBigNumber.config({\n DECIMAL_PLACES: STELLAR_DECIMALS,\n});\n\nexport class StellarAccount extends KeybanAccount {\n address: string;\n publicKey: string;\n #signer: StellarSigner;\n #rpcProvider: rpc.Server;\n #horizonServer: Horizon.Server;\n\n constructor(\n rpcClient: RpcClient,\n rpcProvider: rpc.Server,\n horizonServer: Horizon.Server,\n signer: StellarSigner,\n publicKey: string,\n ) {\n super(rpcClient);\n\n this.#rpcProvider = rpcProvider;\n this.#horizonServer = horizonServer;\n this.#signer = signer;\n\n this.address = publicKey; // stellar addresses aren't hexa https://stellar.github.io/js-stellar-sdk/Address.html#Address\n this.publicKey = publicKey; // account.accountId == publicKey == address\n }\n\n async signMessage(message: string): Promise<Hex | string[]> {\n const hash = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(message),\n );\n const signedMessage = await this.#signer.sign(Buffer.from(hash));\n return signedMessage.toString(\"base64\");\n }\n\n async transfer(\n to: Address,\n value: bigint,\n fee?: StellarFeeDetails,\n ): Promise<string> {\n if (value <= 0n) {\n throw new SdkError(\n SdkError.types.AmountInvalid,\n \"KeybanAccount.transfer\",\n );\n }\n\n const [account, networkDetails] = await Promise.all([\n this.#rpcProvider.getAccount(this.address),\n this.#rpcProvider.getNetwork(),\n ]);\n\n const paymentTxBuilder = new TransactionBuilder(account, {\n fee: fee ?? BASE_FEE,\n networkPassphrase: networkDetails.passphrase,\n });\n const formattedAmount = BigNumber(value)\n .dividedBy(10 ** STELLAR_DECIMALS)\n .toString();\n const recipientExists = await this.#isAccountCreated(to);\n\n if (recipientExists) {\n paymentTxBuilder.addOperation(\n Operation.payment({\n destination: to,\n asset: Asset.native(),\n amount: formattedAmount,\n }),\n );\n } else {\n paymentTxBuilder.addOperation(\n Operation.createAccount({\n destination: to,\n startingBalance: formattedAmount,\n }),\n );\n }\n const paymentTx = paymentTxBuilder.setTimeout(TX_VALIDITY_DURATION).build();\n\n // sign the transaction\n const signature = await this.#signer.signDecorated(paymentTx.hash());\n paymentTx.addDecoratedSignature(signature);\n\n // submit the transaction to the network\n return this.#submitTransaction(paymentTx, \"transfer\");\n }\n\n async estimateTransfer(_to: Address): Promise<FeesEstimation> {\n const operationCount = 1n; // 1 operation for native transfer\n const feesPerOperation = await this.#recommendedFeesPerOperation();\n const maxFees = feesPerOperation * operationCount;\n return {\n maxFees,\n details: feesPerOperation.toString(),\n };\n }\n\n async transferERC20({\n contractAddress,\n to,\n value,\n fees,\n }: TransferERC20Params<StellarFeeDetails>): Promise<string> {\n const recipientExists = await this.#isAccountCreated(to);\n if (!recipientExists) {\n throw new SdkError(\n SdkError.types.AddressInvalid,\n \"KeybanAccount.transferERC20\",\n );\n }\n\n if (!/^[a-zA-Z0-9]+:[a-zA-Z0-9]+$/.test(contractAddress)) {\n throw new SdkError(\n SdkError.types.AddressInvalid,\n \"KeybanAccount.transferERC20\",\n );\n }\n\n if (to === this.address) {\n throw new SdkError(\n SdkError.types.RecipientAddressEqualsSender,\n \"KeybanAccount.transferERC20\",\n );\n }\n\n if (value <= 0n) {\n throw new SdkError(\n SdkError.types.AmountInvalid,\n \"KeybanAccount.transferERC20\",\n );\n }\n\n const [assetCode, assetIssuer] = contractAddress.split(\":\");\n const asset = new Asset(assetCode, assetIssuer);\n\n const [account, networkDetails] = await Promise.all([\n this.#rpcProvider.getAccount(this.address),\n this.#rpcProvider.getNetwork(),\n ]);\n\n const formattedAmount = BigNumber(value)\n .dividedBy(10 ** STELLAR_DECIMALS)\n .toString();\n\n const paymentTx = new TransactionBuilder(account, {\n fee: fees ?? BASE_FEE,\n networkPassphrase: networkDetails.passphrase,\n })\n .addOperation(\n Operation.payment({\n destination: to,\n asset,\n amount: formattedAmount,\n }),\n )\n .setTimeout(TX_VALIDITY_DURATION)\n .build();\n\n // sign the transaction\n const signature = await this.#signer.signDecorated(paymentTx.hash());\n paymentTx.addDecoratedSignature(signature);\n\n // submit the transaction to the network\n return this.#submitTransaction(paymentTx, \"transferERC20\");\n }\n\n async estimateERC20Transfer(\n _params: EstimateERC20TransferParams,\n ): Promise<FeesEstimation> {\n const operationCount = 1n; // 1 operation for native transfer\n const feesPerOperation = await this.#recommendedFeesPerOperation();\n const maxFees = feesPerOperation * operationCount;\n return {\n maxFees,\n details: feesPerOperation.toString(),\n };\n }\n\n transferNft(_params: TransferNftParams<StellarFeeDetails>): Promise<Hash> {\n throw new Error(\"transferNft not implemented.\");\n }\n\n estimateNftTransfer(\n _params: EstimateNftTransferParams,\n ): Promise<FeesEstimation> {\n throw new Error(\"estimateNftTransfer not implemented.\");\n }\n\n async #submitTransaction(\n tx: Transaction,\n functionName: string,\n ): Promise<string> {\n return this.#rpcProvider\n .sendTransaction(tx)\n .then(async (response) => {\n if (response.status !== \"PENDING\") {\n if (JSON.stringify(response).includes(\"txInsufficientBalance\")) {\n throw new SdkError(\n SdkError.types.InsufficientFunds,\n \"KeybanAccount.transferERC20\",\n );\n }\n throw new SdkError(\n SdkError.types.UnknownTransactionError,\n `KeybanAccount.${functionName}`,\n {\n SendTransactionResponse:\n response.errorResult?.result() ?? response,\n },\n );\n }\n return this.#rpcProvider.pollTransaction(response.hash);\n })\n .then((finalResponse) => {\n if (JSON.stringify(finalResponse).includes(\"txInsufficientBalance\")) {\n throw new SdkError(\n SdkError.types.InsufficientFunds,\n \"KeybanAccount.transferERC20\",\n );\n }\n switch (finalResponse.status) {\n case rpc.Api.GetTransactionStatus.NOT_FOUND:\n throw new SdkError(\n SdkError.types.UnknownTransactionError,\n `KeybanAccount.${functionName}`,\n {\n transactionResponse: JSON.stringify(finalResponse),\n },\n );\n case rpc.Api.GetTransactionStatus.FAILED:\n throw new SdkError(\n SdkError.types.UnknownTransactionError,\n `KeybanAccount.${functionName}`,\n {\n transactionResponse: finalResponse.resultXdr.result(),\n },\n );\n case rpc.Api.GetTransactionStatus.SUCCESS:\n return finalResponse.txHash;\n }\n });\n }\n\n async loyaltySetup(): Promise<void> {\n const exists = await this.#isAccountCreated(this.address);\n if (exists) {\n console.log(\"Stellar Account already setup for Loyalty, nothing to do.\");\n return;\n }\n console.log(\"Stellar Account not setup for Loyalty, setting it up now...\");\n // Init the account setup\n const rawTx = await this.rpcClient.call(\"loyalty\", \"initAccountSetup\");\n // Decode the raw transaction\n const { passphrase: networkPassphrase } =\n await this.#rpcProvider.getNetwork();\n const setupTx = new Transaction(rawTx, networkPassphrase);\n // sign the transaction\n const signature = await this.#signer.signDecorated(setupTx.hash());\n setupTx.addDecoratedSignature(signature);\n // serialize and submit the transaction to the network\n await this.rpcClient.call(\"loyalty\", \"submitAccountSetup\", setupTx.toXDR());\n }\n\n async loyaltyDestroy(): Promise<void> {\n const exists = await this.#isAccountCreated(this.address);\n if (!exists) {\n console.log(\"Stellar Account not setup for Loyalty, nothing to destroy.\");\n return;\n }\n console.log(\"Stellar Account setup for Loyalty, destroying it now...\");\n // Init the account destroy\n const rawTx = await this.rpcClient.call(\"loyalty\", \"initAccountDestroy\");\n // Decode the raw transaction\n const { passphrase: networkPassphrase } =\n await this.#rpcProvider.getNetwork();\n const setupTx = new Transaction(rawTx, networkPassphrase);\n // sign the transaction\n const signature = await this.#signer.signDecorated(setupTx.hash());\n setupTx.addDecoratedSignature(signature);\n // serialize and submit the transaction to the network\n await this.rpcClient.call(\n \"loyalty\",\n \"submitAccountDestroy\",\n setupTx.toXDR(),\n );\n }\n\n async #isAccountCreated(address: string): Promise<boolean> {\n try {\n await this.#rpcProvider.getAccount(address);\n return true;\n } catch {\n return false;\n }\n }\n\n async #recommendedFeesPerOperation(): Promise<bigint> {\n const { max_fee } = await this.#horizonServer.feeStats();\n return BigInt(max_fee.mode);\n }\n\n /**\n * Sign a transaction hash.\n * @param txHash - The transaction hash to sign.\n * @internal\n * @returns - The base64-encoded signature.\n */\n async signTransaction(txHash: string): Promise<string> {\n const hash = Buffer.from(txHash, \"hex\");\n const signature = await this.#signer.signDecorated(hash);\n return signature.toXDR(\"hex\");\n }\n}\n\n/**\n * Represents the fee details for Stellar transactions.\n * It corresponds to the fees per operation to be paid in case of a network congestion.\n * Otherwise it is always the base fee of 100 stroops (0.00001 XLM) per operation.\n */\nexport type StellarFeeDetails = string;\n","import { ed25519 } from \"@noble/curves/ed25519\";\nimport { KeypairType, StrKey, xdr } from \"@stellar/stellar-sdk\";\nimport { Buffer } from \"buffer\";\n\nimport { Hex } from \"~/index\";\nimport { RpcClient } from \"~/rpc\";\n\n/**\n * StellarSigner\n * This class provides functionality for signing transactions and messages on the Stellar blockchain.\n * It closely resembles the Keypair interface from the stellar-sdk, but its signing methods are asynchronous.\n */\nexport class StellarSigner {\n type: KeypairType = \"ed25519\";\n\n #rpcClient: RpcClient;\n #clientShare: string;\n #publicKey: Hex;\n\n constructor(rpcClient: RpcClient, clientShare: string, publicKey: Hex) {\n this.#rpcClient = rpcClient;\n this.#clientShare = clientShare;\n this.#publicKey = publicKey;\n }\n\n publicKey(): string {\n return StrKey.encodeEd25519PublicKey(this.rawPublicKey());\n }\n\n rawPublicKey(): Buffer {\n const publicKey = this.#publicKey.replace(/^0x/, \"\");\n return Buffer.from(publicKey, \"hex\");\n }\n\n async sign(data: Buffer): Promise<Buffer> {\n const hexSignature = await this.#rpcClient.call(\n \"eddsa\",\n \"sign\",\n this.#clientShare,\n data.toString(\"hex\"),\n );\n return Buffer.from(hexSignature, \"hex\");\n }\n\n async signDecorated(data: Buffer): Promise<xdr.DecoratedSignature> {\n const signature = await this.sign(data);\n const hint = this.signatureHint();\n\n return new xdr.DecoratedSignature({ hint, signature });\n }\n\n async signPayloadDecorated(data: Buffer): Promise<xdr.DecoratedSignature> {\n const signature = await this.sign(data);\n const keyHint = this.signatureHint();\n\n let hint = Buffer.from(data.slice(-4));\n if (hint.length < 4) {\n // append zeroes as needed\n hint = Buffer.concat([hint, Buffer.alloc(4 - data.length, 0)]);\n }\n\n return new xdr.DecoratedSignature({\n hint: hint.map((byte, i) => byte ^ keyHint[i]) as Buffer,\n signature,\n });\n }\n\n signatureHint(): Buffer {\n const a = this.xdrAccountId().toXDR();\n return a.slice(a.length - 4);\n }\n\n verify(data: Buffer, signature: Buffer): boolean {\n try {\n return ed25519.verify(signature, data, this.rawPublicKey());\n } catch {\n return false;\n }\n }\n\n xdrAccountId(): xdr.AccountId {\n return xdr.PublicKey.publicKeyTypeEd25519(this.rawPublicKey());\n }\n\n xdrPublicKey(): xdr.PublicKey {\n return xdr.PublicKey.publicKeyTypeEd25519(this.rawPublicKey());\n }\n\n xdrMuxedAccount(id: string): xdr.MuxedAccount {\n if (typeof id !== \"undefined\") {\n if (typeof id !== \"string\") {\n throw new TypeError(`expected string for ID, got ${typeof id}`);\n }\n\n return xdr.MuxedAccount.keyTypeMuxedEd25519(\n new xdr.MuxedAccountMed25519({\n id: xdr.Uint64.fromString(id),\n ed25519: this.rawPublicKey(),\n }),\n );\n }\n\n return xdr.MuxedAccount.keyTypeEd25519(this.rawPublicKey());\n }\n}\n","import { Horizon, rpc, StrKey } from \"@stellar/stellar-sdk\";\nimport { Buffer } from \"buffer\";\n\nimport { KeybanClientBase, KeybanClientConfig, MetadataConfig } from \"~/client\";\nimport { StellarAccount } from \"~/stellar/account\";\nimport { StellarSigner } from \"~/stellar/signer\";\n\nexport class StellarClient extends KeybanClientBase {\n #metadataConfig: Promise<MetadataConfig>;\n\n constructor(\n config: KeybanClientConfig,\n metadataConfig?: Promise<MetadataConfig>,\n ) {\n super(config, metadataConfig);\n this.#metadataConfig =\n metadataConfig ?? Promise.reject(new Error(\"metadataConfig is required\"));\n }\n\n async initialize(): Promise<StellarAccount> {\n const key = `eddsa:${this.network}`;\n\n let clientShare = await this.clientShareProvider.get(key);\n if (!clientShare) {\n clientShare = await this.rpcClient.call(\"eddsa\", \"dkg\");\n await this.clientShareProvider.set(key, clientShare);\n }\n\n const [config, publicKey] = await Promise.all([\n this.#metadataConfig,\n this.rpcClient.call(\"eddsa\", \"publicKey\", clientShare),\n ]);\n if (!config.network.horizonUrl) {\n throw new Error(\"Missing required horizonUrl in network config\");\n }\n\n const signer = new StellarSigner(this.rpcClient, clientShare, publicKey);\n\n const stellarPubKey = StrKey.encodeEd25519PublicKey(\n Buffer.from(publicKey, \"hex\"),\n );\n\n return new StellarAccount(\n this.rpcClient,\n new rpc.Server(config.network.rpcUrl),\n new Horizon.Server(config.network.horizonUrl),\n signer,\n stellarPubKey,\n );\n }\n}\n"]}