@sovereign-sdk/web3 0.13.1 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +111 -7
- package/dist/index.d.ts +111 -7
- package/dist/index.js +412 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +412 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/addresses.ts","../src/rollup/rollup.ts","../src/errors.ts","../src/subscriptions.ts","../src/rollup/standard-rollup.ts","../src/rollup/solana-signable-rollup.ts"],"sourcesContent":["export * from \"./addresses\";\nexport * from \"./rollup\";\nexport * from \"./errors\";\nexport * from \"./type-spec\";\nexport { type EventPayload, Subscription } from \"./subscriptions\";\nexport * as SovereignClient from \"@sovereign-sdk/client\";\n","import { type HexString, ensureBytes } from \"@sovereign-sdk/utils\";\nimport { bech32m } from \"bech32\";\n\n/**\n * Encodes a public key as a bech32m address with the given human-readable part (hrp).\n *\n * @param publicKey - The public key to encode, as a hex string or Uint8Array.\n * @param hrp - The human-readable part for the bech32m address (e.g., \"sov\").\n * @param concatPublicKey - Optional. If provided, only the first `concatPublicKey` bytes of the public key are used.\n * @returns The bech32m-encoded address as a string.\n * @throws {Error} If the public key is not a valid hex string or Uint8Array.\n */\nexport function addressFromPublicKey(\n publicKey: HexString | Uint8Array,\n hrp: string,\n concatPublicKey = 28,\n): string {\n let publicKeyBytes = ensureBytes(publicKey);\n\n if (concatPublicKey !== publicKey.length) {\n publicKeyBytes = publicKeyBytes.slice(0, concatPublicKey);\n }\n\n const words = bech32m.toWords(publicKeyBytes);\n return bech32m.encode(hrp, words);\n}\n","import SovereignClient from \"@sovereign-sdk/client\";\nimport type { APIError } from \"@sovereign-sdk/client\";\nimport type { RollupSchema, Serializer } from \"@sovereign-sdk/serializers\";\nimport type { Signer } from \"@sovereign-sdk/signers\";\nimport { bytesToHex, hexToBytes } from \"@sovereign-sdk/utils\";\nimport { Base64 } from \"js-base64\";\nimport { VersionMismatchError } from \"../errors\";\nimport {\n type Subscription,\n type SubscriptionToCallbackMap,\n createSubscription,\n} from \"../subscriptions\";\nimport type { BaseTypeSpec } from \"../type-spec\";\nimport type { DeepPartial } from \"../utils\";\n\nexport type UnsignedTransactionContext<\n S extends BaseTypeSpec,\n C extends RollupContext,\n> = {\n runtimeCall: S[\"RuntimeCall\"];\n // Provides the ability to override the generation data instead of retrieving it automatically.\n overrides: DeepPartial<S[\"UnsignedTransaction\"]>;\n rollup: Rollup<S, C>;\n};\n\nexport type TransactionContext<\n S extends BaseTypeSpec,\n C extends RollupContext,\n> = {\n unsignedTx: S[\"UnsignedTransaction\"];\n sender: Uint8Array;\n signature: Uint8Array;\n rollup: Rollup<S, C>;\n};\n\nexport type TypeBuilder<S extends BaseTypeSpec, C extends RollupContext> = {\n unsignedTransaction: (\n context: UnsignedTransactionContext<S, C>,\n ) => Promise<S[\"UnsignedTransaction\"]>;\n\n transaction: (context: TransactionContext<S, C>) => Promise<S[\"Transaction\"]>;\n};\n\n/**\n * Arbitrary context that is associated with the rollup.\n */\nexport type RollupContext = Record<string, unknown>;\n\n/**\n * The configuration for a rollup client.\n */\nexport type RollupConfig<C extends RollupContext> = {\n /**\n * The base URL of the rollup full node API.\n */\n url?: string;\n /**\n * The Sovereign SDK client to use for the rollup.\n * If not provided, the default client will be used using {@link PartialRollupConfig.url}.\n */\n client: SovereignClient;\n /**\n * Creates the serializer instance to use for the rollup.\n *\n * This can be called more than once, for example if the chain hash changes (i.e a new rollup version)\n * is detected then it will be called again with the new rollup schema.\n */\n getSerializer: (schema: RollupSchema) => Serializer;\n /**\n * Arbitrary context that is associated with the rollup.\n */\n context: C;\n /**\n * The endpoint path for submitting transactions.\n * Defaults to \"/sequencer/txs\", the standard Sovereign SDK endpoint.\n * Can be overridden if your rollup is configured to expose non-standard endpoints in\n * order to support multiple different transaction encoding or authentication schemes.\n */\n txSubmissionEndpoint: string;\n};\n\n/**\n * The result of signing and submitting a transaction.\n *\n * @template Tx The type of the transaction\n */\nexport type TransactionResult<Tx> = {\n /**\n * The response from the sequencer.\n */\n response: SovereignClient.Sequencer.TxCreateResponse;\n /**\n * The transaction that was submitted.\n */\n transaction: Tx;\n};\n\n/**\n * The parameters for signing and submitting a transaction.\n */\nexport type SignerParams = {\n /**\n * The signer to use for signing the transaction.\n */\n signer: Signer;\n};\n\n/**\n * The parameters for calling executing a runtime call transaction.\n */\nexport type CallParams<S extends BaseTypeSpec> = {\n overrides?: DeepPartial<S[\"UnsignedTransaction\"]>;\n} & SignerParams;\n\n/**\n * A generic rollup client.\n *\n * @template S - The type specification for the rollup.\n * If not provided, the base type specification will be used which uses `any` for all types.\n * @template C - The context for the rollup.\n */\nexport class Rollup<S extends BaseTypeSpec, C extends RollupContext> {\n private readonly _config: RollupConfig<C>;\n private readonly _typeBuilder: TypeBuilder<S, C>;\n private _chainHash?: Uint8Array;\n private _serializer?: Serializer;\n\n /**\n * Creates a new rollup client.\n *\n * @param config - The configuration for the rollup client.\n * @param typeBuilder - The type builder for the rollup.\n */\n constructor(config: RollupConfig<C>, typeBuilder: TypeBuilder<S, C>) {\n this._config = config;\n this._typeBuilder = typeBuilder;\n }\n\n /**\n * Retrieve dedup information about the provided address.\n *\n * @param publicKey - The public key to dedup.\n * TODO: How to add param for generation explicitly\n */\n async dedup(publicKey: Uint8Array): Promise<S[\"Dedup\"]> {\n // for public key credential id is just its bytes representation\n const credentialId = bytesToHex(publicKey);\n const response = await this.rollup.addresses.dedup(credentialId);\n return response as S[\"Dedup\"];\n }\n\n /**\n * Submits a transaction to the rollup.\n *\n * The endpoint used for submission can be overridden via the options.path parameter.\n * If not specified, the rollup's configured txSubmissionEndpoint will be used.\n *\n * @param transaction - The transaction to submit.\n * @param {SovereignClient.RequestOptions} options - The options for the request.\n */\n async submitTransaction(\n transaction: S[\"Transaction\"],\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const serializer = await this.serializer();\n const serializedTx = serializer.serializeTx(transaction);\n // Stainless RequestOptions is generic internally, causing issues for `body` and `query`.\n // That's fine since we supply the `body` and transaction submission doesn't take query parameters.\n // So we hack around this by destructuring them out.\n const { body: _, query: __, path, ...requestOptions } = options || {};\n const txSubmissionEndpoint = path || this._config.txSubmissionEndpoint;\n\n return this.http\n .post<SovereignClient.Sequencer.TxCreateResponse>(txSubmissionEndpoint, {\n body: { body: Base64.fromUint8Array(serializedTx) },\n ...requestOptions,\n })\n .catch(async (e) => {\n if (isVersionMismatchError(e as APIError)) {\n const oldVersion = bytesToHex(await this.chainHash());\n const { schema, chain_hash: newVersion } = await this.rollup.schema();\n this._chainHash = hexToBytes(newVersion);\n this._serializer = this._config.getSerializer(schema);\n\n // bytesToHex returns without 0x prefix, but server returns with 0x prefix\n if (`0x${oldVersion}` !== newVersion) {\n throw new VersionMismatchError(\n \"Schema version mismatch when submitting transaction\",\n newVersion,\n oldVersion,\n );\n }\n }\n throw e;\n });\n }\n\n /**\n * Signs and submits a transaction to the rollup.\n * Utilizes the provided signer to sign the transaction.\n *\n * @param unsignedTx - The unsigned transaction to sign and submit.\n * @param {SignerParams} params - The params for signing and submitting the transaction.\n * @param {SovereignClient.RequestOptions} options - The options for the request.\n * @param endpoint - Optional endpoint override. If not specified, uses the rollup's configured txSubmissionEndpoint.\n */\n async signAndSubmitTransaction(\n unsignedTx: S[\"UnsignedTransaction\"],\n { signer }: SignerParams,\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<S[\"Transaction\"]>> {\n const tx = await this.signTransaction(unsignedTx, signer);\n const result = await this.submitTransaction(tx, options);\n\n return { transaction: tx, response: result };\n }\n\n /**\n * Performs a runtime call transaction.\n * Utilizes the provided signer to sign the transaction.\n *\n * @param runtimeCall - The runtime message to call.\n * @param {CallParams<S>} params - The params for submitting a runtime call transaction.\n * @param {SovereignClient.RequestOptions} options - The options for the request.\n */\n async call(\n runtimeCall: S[\"RuntimeCall\"],\n { signer, overrides }: CallParams<S>,\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<S[\"Transaction\"]>> {\n const context = {\n runtimeCall,\n rollup: this,\n overrides: overrides ?? ({} as DeepPartial<S[\"UnsignedTransaction\"]>),\n };\n const unsignedTx = await this._typeBuilder.unsignedTransaction(context);\n\n return this.signAndSubmitTransaction(\n unsignedTx,\n {\n signer,\n },\n options,\n );\n }\n\n /**\n * Prepares a runtime call by creating and signing a transaction without submitting it.\n * This is useful for scenarios where you need the signed transaction for later submission\n * or for analysis purposes.\n *\n * @param runtimeCall - The runtime message to prepare.\n * @param params - The parameters for preparing the call.\n * @param params.signer - The signer to use for signing the transaction.\n * @param params.overrides - Optional overrides for the unsigned transaction.\n * @returns A promise that resolves to the signed transaction.\n */\n async prepareCall(\n runtimeCall: S[\"RuntimeCall\"],\n { signer, overrides }: CallParams<S>,\n ): Promise<S[\"Transaction\"]> {\n const context = {\n runtimeCall,\n rollup: this,\n overrides: overrides ?? ({} as DeepPartial<S[\"UnsignedTransaction\"]>),\n };\n const unsignedTx = await this._typeBuilder.unsignedTransaction(context);\n return this.signTransaction(unsignedTx, signer);\n }\n\n /**\n * Signs an unsigned transaction using the provided signer.\n * Creates a signature by combining the serialized unsigned transaction with the chain hash,\n * then constructs a fully signed transaction.\n *\n * @param unsignedTx - The unsigned transaction to sign.\n * @param signer - The signer to use for signing the transaction.\n * @returns A promise that resolves to the signed transaction.\n */\n async signTransaction(\n unsignedTx: S[\"UnsignedTransaction\"],\n signer: Signer,\n ): Promise<S[\"Transaction\"]> {\n const serializer = await this.serializer();\n const serializedUnsignedTx = serializer.serializeUnsignedTx(unsignedTx);\n const chainHash = await this.chainHash();\n const signature = await signer.sign(\n new Uint8Array([...serializedUnsignedTx, ...chainHash]),\n );\n const publicKey = await signer.publicKey();\n const context = {\n unsignedTx,\n sender: publicKey,\n signature,\n rollup: this,\n };\n return this._typeBuilder.transaction(context);\n }\n\n /**\n * Create a subscription to events emitted over websockets by the rollup.\n */\n subscribe<T extends keyof SubscriptionToCallbackMap>(\n type: T,\n callback: SubscriptionToCallbackMap[T],\n ): Subscription {\n return createSubscription(type, callback, this.http);\n }\n\n /**\n * Performs a healthcheck against the rollup to determine if it is currently healthy.\n *\n * @param timeout - Request timeout in milliseconds.\n * @returns `true` if the rollup is considered healthy otherwise `false`.\n */\n async healthcheck(timeout = 5000): Promise<boolean> {\n try {\n await this.http.get(\"/healthcheck\", { timeout, maxRetries: 1 });\n return true;\n } catch (e) {\n return !(e instanceof SovereignClient.APIConnectionError);\n }\n }\n\n /**\n * A ledger client that can be used to query the ledger.\n */\n get ledger(): SovereignClient.Ledger {\n return this.http.ledger;\n }\n\n /**\n * A sequencer client that can be used to submit transactions & batches to the rollup.\n */\n get sequencer(): SovereignClient.Sequencer {\n return this.http.sequencer;\n }\n\n /**\n * A rollup client that can be used to perform operations on the rollup.\n */\n get rollup(): SovereignClient.Rollup {\n return this.http.rollup;\n }\n\n /**\n * A client that can be used to perform HTTP requests to the Sovereign API.\n * This can be used as an escape hatch to execute arbitrary requests to the Sovereign API\n * if the operation is not supported by `ledger`, `sequencer`, or `rollup` clients.\n */\n get http(): SovereignClient {\n return this._config.client;\n }\n\n /**\n * Pre-fetches the rollup schema, populating the serializer and chain hash caches.\n * Call this during initialization to avoid the latency of lazy-loading on the first transaction.\n */\n hydrate(): Promise<void> {\n return this._fetchSchema();\n }\n\n /**\n * The serializer for the rollup.\n * Can be used to serialize transactions, runtime calls, etc.\n */\n async serializer(): Promise<Serializer> {\n if (!this._serializer) await this._fetchSchema();\n // _fetchSchema always sets _serializer\n return this._serializer as Serializer;\n }\n\n /**\n * The context for the rollup.\n */\n get context(): C {\n return this._config.context;\n }\n\n async chainHash(): Promise<Uint8Array> {\n if (!this._chainHash) await this._fetchSchema();\n // _fetchSchema always sets _chainHash\n return this._chainHash as Uint8Array;\n }\n\n private async _fetchSchema(): Promise<void> {\n const { schema, chain_hash } = await this.rollup.schema();\n this._serializer = this._config.getSerializer(schema);\n this._chainHash = hexToBytes(chain_hash);\n }\n}\n\nfunction isVersionMismatchError(e: APIError): boolean {\n if (\n // biome-ignore lint/suspicious/noExplicitAny: yolo\n (e.error as any)?.details?.error?.includes(\"Signature verification failed\")\n ) {\n return true;\n }\n\n return false;\n}\n","/**\n * Base error class for Sovereign SDK Web3.\n */\nexport class SovereignError extends Error {\n constructor(message: string) {\n super(message);\n\n this.name = this.constructor.name;\n this.stack = new Error().stack;\n }\n}\n\nexport class InvalidRollupConfigError extends SovereignError {}\n\nexport class VersionMismatchError extends SovereignError {\n public readonly newVersion: string;\n public readonly currentVersion: string;\n public readonly retryable: boolean;\n\n constructor(message: string, newVersion: string, currentVersion: string) {\n super(message);\n\n this.newVersion = newVersion;\n this.currentVersion = currentVersion;\n this.retryable = newVersion !== currentVersion;\n }\n}\n\nexport class SchemaError extends SovereignError {\n public readonly schema: object;\n public readonly reason: string;\n\n constructor(message: string, reason: string, schema: object) {\n super(`${message}: ${reason}`);\n\n this.reason = reason;\n this.schema = schema;\n }\n}\n","import type SovereignSDK from \"@sovereign-sdk/client\";\nimport IsoWebSocket from \"isomorphic-ws\";\nimport { WebSocket } from \"partysocket\";\nimport { SovereignError } from \"./errors\";\n\ntype Url = string;\n\nexport function httpToWebSocket(url: string) {\n return url.replace(/^http(s?):\\/\\//, (_, s) => `ws${s}://`);\n}\n\nexport type Subscription = {\n /** Url providing the subscription. */\n url: Url;\n /** Unsubscribe this subscription. */\n unsubscribe: () => void;\n};\n\ntype SubscriptionEntry = {\n websocket: WebSocket;\n // biome-ignore lint/suspicious/noExplicitAny: allow\n callbacks: Array<(...args: any[]) => void>;\n};\n\nexport const _subscriptions: Record<Url, SubscriptionEntry> = {};\n\n/** Subscribe to the provided websocket url & call the provided callback on messages received. */\nexport function subscribe(\n url: Url,\n // biome-ignore lint/suspicious/noExplicitAny: allow\n callback: (...args: any[]) => void,\n): Subscription {\n const subscription = _subscriptions[url];\n\n if (!subscription) {\n const websocket = new WebSocket(url, [], { WebSocket: IsoWebSocket });\n // bun compatibility: https://github.com/partykit/partykit/issues/774\n websocket.binaryType = \"arraybuffer\";\n\n _subscriptions[url] = {\n websocket,\n callbacks: [callback],\n };\n\n websocket.addEventListener(\"message\", (message) => {\n const data = JSON.parse(message.data);\n const callbacks = _subscriptions[url]?.callbacks;\n if (callbacks) {\n for (const cb of callbacks) {\n cb(data);\n }\n }\n });\n websocket.addEventListener(\"error\", (e) =>\n console.log(\"Websocket error\", e),\n );\n } else {\n subscription.callbacks.push(callback);\n }\n\n const callbackIndex = _subscriptions[url]?.callbacks.length - 1;\n\n return {\n get url() {\n return url;\n },\n unsubscribe() {\n const subscription = _subscriptions[url];\n\n if (!subscription) {\n return;\n }\n\n subscription.callbacks.splice(callbackIndex, 1);\n\n if (!subscription.callbacks.length) {\n subscription.websocket.close();\n delete _subscriptions[url];\n }\n },\n };\n}\n\nexport type EventPayload = {\n tx_hash: string;\n type: \"event\";\n number: number;\n key: string;\n value: Record<string, unknown>;\n module: {\n type: \"moduleRef\";\n name: string;\n };\n};\n\nexport interface SubscriptionToCallbackMap {\n events: (event: EventPayload) => Promise<void>;\n}\n\nexport function createSubscription<T extends keyof SubscriptionToCallbackMap>(\n subscription: T,\n callback: SubscriptionToCallbackMap[T],\n client: SovereignSDK,\n): Subscription {\n switch (subscription) {\n case \"events\": {\n const url = client.buildURL(\"/sequencer/events/ws\", {});\n return subscribe(\n httpToWebSocket(url),\n callback as SubscriptionToCallbackMap[\"events\"],\n );\n }\n default:\n throw new SovereignError(`Invalid subscription type '${subscription}'`);\n }\n}\n","import SovereignClient from \"@sovereign-sdk/client\";\nimport { JsSerializer } from \"@sovereign-sdk/serializers\";\nimport type {\n Transaction,\n TxDetails,\n UnsignedTransaction,\n} from \"@sovereign-sdk/types\";\nimport { bytesToHex } from \"@sovereign-sdk/utils\";\nimport type { DeepPartial } from \"../utils\";\nimport {\n Rollup,\n type RollupConfig,\n type SignerParams,\n type TransactionContext,\n type TypeBuilder,\n type UnsignedTransactionContext,\n} from \"./rollup\";\n\nexport type Dedup = {\n nonce: number;\n};\n\nexport type StandardRollupContext = {\n defaultTxDetails: TxDetails;\n};\n\nexport type StandardRollupSpec<RuntimeCall> = {\n UnsignedTransaction: UnsignedTransaction<RuntimeCall>;\n Transaction: Transaction<RuntimeCall>;\n RuntimeCall: RuntimeCall;\n Dedup: Dedup;\n};\n\nconst useOrFetchUniqueness = async <S extends StandardRollupSpec<unknown>>({\n overrides,\n}: Omit<\n UnsignedTransactionContext<S, StandardRollupContext>,\n \"runtimeCall\"\n>) => {\n if (overrides?.uniqueness) {\n return overrides.uniqueness;\n }\n\n return { generation: Date.now() };\n};\n\nexport function standardTypeBuilder<\n S extends StandardRollupSpec<unknown>,\n>(): TypeBuilder<S, StandardRollupContext> {\n return {\n async unsignedTransaction(\n context: UnsignedTransactionContext<S, StandardRollupContext>,\n ) {\n const { rollup, runtimeCall } = context;\n const { uniqueness: _, ...overrides } = context.overrides;\n const uniqueness = await useOrFetchUniqueness(context);\n const details: TxDetails = {\n ...rollup.context.defaultTxDetails,\n ...overrides.details,\n };\n\n return {\n runtime_call: runtimeCall,\n uniqueness,\n details,\n } as S[\"UnsignedTransaction\"];\n },\n async transaction({\n sender,\n signature,\n unsignedTx,\n }: TransactionContext<S, StandardRollupContext>) {\n return {\n V0: {\n pub_key: bytesToHex(sender),\n signature: bytesToHex(signature),\n ...unsignedTx,\n },\n };\n },\n };\n}\n\n/**\n * The parameters for simulating a runtime call transaction.\n */\nexport type SimulateParams = Omit<\n SovereignClient.RollupSimulateParams,\n \"call\" | \"sender\"\n> &\n SignerParams;\n\nexport class StandardRollup<RuntimeCall> extends Rollup<\n StandardRollupSpec<RuntimeCall>,\n StandardRollupContext\n> {\n /**\n * Simulates a runtime call transaction.\n *\n * This method can be useful to estimate the gas cost of a runtime call transaction.\n *\n * @param runtimeMessage - The runtime message to call.\n */\n async simulate(\n runtimeMessage: StandardRollupSpec<RuntimeCall>[\"RuntimeCall\"],\n { signer }: SimulateParams,\n ): Promise<SovereignClient.Rollup.RollupSimulateResponse> {\n const publicKey = await signer.publicKey();\n const sender = bytesToHex(publicKey);\n const call = runtimeMessage as { [key: string]: unknown };\n\n return this.rollup.simulate({ sender, call });\n }\n}\n\nexport const DEFAULT_TX_DETAILS: Omit<TxDetails, \"chain_id\"> = {\n max_priority_fee_bips: 0,\n max_fee: \"100000000\",\n gas_limit: null,\n};\n\nasync function buildContext<C extends StandardRollupContext>(\n client: SovereignClient,\n context?: DeepPartial<C>,\n): Promise<C> {\n const defaultTxDetails = {\n ...DEFAULT_TX_DETAILS,\n ...context?.defaultTxDetails,\n };\n\n if (!defaultTxDetails.chain_id) {\n const { chain_id } = await client.rollup.constants();\n\n defaultTxDetails.chain_id = chain_id;\n }\n\n return {\n defaultTxDetails,\n } as C;\n}\n\nexport async function createStandardRollup<\n RuntimeCall,\n C extends StandardRollupContext = StandardRollupContext,\n>(\n rollupConfig?: Partial<RollupConfig<DeepPartial<C>>>,\n typeBuilderOverrides?: Partial<\n TypeBuilder<StandardRollupSpec<RuntimeCall>, C>\n >,\n) {\n const config = rollupConfig ?? {};\n const client = config.client ?? new SovereignClient({ baseURL: config.url });\n const getSerializer =\n config.getSerializer ?? ((schema) => new JsSerializer(schema));\n const context = await buildContext<C>(client, config.context);\n\n // Default to the standard transaction submission endpoint\n const txSubmissionEndpoint = config.txSubmissionEndpoint ?? \"/sequencer/txs\";\n\n return new StandardRollup<RuntimeCall>(\n {\n ...config,\n client,\n getSerializer,\n context,\n txSubmissionEndpoint,\n },\n {\n ...standardTypeBuilder(),\n ...typeBuilderOverrides,\n },\n );\n}\n","import type SovereignClient from \"@sovereign-sdk/client\";\nimport { type Signer, isLedgerSolanaSigner } from \"@sovereign-sdk/signers\";\nimport type { Transaction, UnsignedTransaction } from \"@sovereign-sdk/types\";\nimport { Base64 } from \"js-base64\";\nimport type { Subscription, SubscriptionToCallbackMap } from \"../subscriptions\";\nimport type { DeepPartial } from \"../utils\";\nimport type { RollupConfig, TransactionResult } from \"./rollup\";\nimport {\n type StandardRollup,\n type StandardRollupContext,\n type StandardRollupSpec,\n createStandardRollup,\n standardTypeBuilder,\n} from \"./standard-rollup\";\n\nexport type SolanaOffchainUnsignedTransaction<RuntimeCall> =\n UnsignedTransaction<RuntimeCall> & {\n chain_name: string;\n };\n\nexport type SolanaOffchainSimpleMessage = {\n signed_message: Uint8Array;\n chain_hash: Uint8Array;\n pubkey: Uint8Array;\n signature: Uint8Array;\n};\n\nexport type SolanaOffchainSpecCompliantMessage = {\n signed_message_with_preamble: Uint8Array;\n signature: Uint8Array;\n};\n\nexport type Authenticator =\n | \"standard\"\n | \"solanaSimple\"\n | \"solana\"\n | \"solanaAuto\";\n\n// Borsh serialization constants\nconst VEC_LENGTH_PREFIX_SIZE = 4;\nconst CHAIN_HASH_SIZE = 32;\nconst PUBKEY_SIZE = 32;\nconst SIGNATURE_SIZE = 64;\nconst PREAMBLE_LENGTH = 85;\n\n// Solana preamble constants\nconst SIGNING_DOMAIN = new Uint8Array([\n 0xff,\n ...new TextEncoder().encode(\"solana offchain\"),\n]);\nconst HEADER_VERSION = 0;\nconst MESSAGE_FORMAT = 0;\nconst SINGLE_SIGNER_COUNT = 1;\n\n/**\n * Creates a Solana offchain message preamble according to the spec.\n * See https://docs.anza.xyz/proposals/off-chain-message-signing#message-preamble\n */\nexport function createSolanaPreamble(\n pubkey: Uint8Array,\n chainHash: Uint8Array,\n messageLength: number,\n): Uint8Array {\n const preamble = new Uint8Array(PREAMBLE_LENGTH);\n let offset = 0;\n\n // signing_domain: [u8; 16] = b\"\\xffsolana offchain\"\n preamble.set(SIGNING_DOMAIN, offset);\n offset += 16;\n\n // header_version: u8 = 0 (ASCII format, hw-wallet compatible)\n preamble[offset] = HEADER_VERSION;\n offset += 1;\n\n // application_domain: [u8; 32] (chain_hash)\n preamble.set(chainHash, offset);\n offset += 32;\n\n // message_format: u8 = 0 (ASCII format)\n preamble[offset] = MESSAGE_FORMAT;\n offset += 1;\n\n // signer_count: u8 = 1 (single signer)\n preamble[offset] = SINGLE_SIGNER_COUNT;\n offset += 1;\n\n // signer: [u8; 32] (public key)\n preamble.set(pubkey, offset);\n offset += 32;\n\n // message_length: [u8; 2] (little-endian u16)\n new DataView(preamble.buffer, offset).setUint16(0, messageLength, true);\n\n return preamble;\n}\n\nexport class SolanaSignableRollup<RuntimeCall> {\n private inner: StandardRollup<RuntimeCall>;\n private solanaEndpoint: string;\n private typeBuilder = standardTypeBuilder<StandardRollupSpec<RuntimeCall>>();\n\n constructor(\n inner: StandardRollup<RuntimeCall>,\n solanaEndpoint = \"/sequencer/accept-solana-offchain-tx\",\n ) {\n this.inner = inner;\n this.solanaEndpoint = solanaEndpoint;\n }\n\n /**\n * Determines the appropriate authenticator based on the signer type.\n * Returns \"solana\" for LedgerSolanaSigner (hardware wallet with spec-compliant signing)\n * and \"solanaSimple\" for software signers.\n */\n private getAutoAuthenticator(signer: Signer): \"solana\" | \"solanaSimple\" {\n return isLedgerSolanaSigner(signer) ? \"solana\" : \"solanaSimple\";\n }\n\n /**\n * Submits serialized data to the Solana endpoint.\n */\n private async submitSerializedMessage(\n serializedMessage: Uint8Array,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n return await this.inner.http.post<SovereignClient.Sequencer.TxCreateResponse>(\n this.solanaEndpoint,\n {\n // Match AcceptTx shape used by standard sequencer endpoints.\n body: { body: Base64.fromUint8Array(serializedMessage) },\n },\n );\n }\n\n /**\n * Submits a Solana offchain message to the rollup.\n */\n private async submitSolanaMessage(\n solanaMessage: SolanaOffchainSimpleMessage,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const serializedMessage = this.serializeSolanaMessage(solanaMessage);\n return this.submitSerializedMessage(serializedMessage);\n }\n\n /**\n * Submits a Solana spec-compliant message to the rollup.\n */\n private async submitSolanaSpecMessage(\n solanaMessage: SolanaOffchainSpecCompliantMessage,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const serializedMessage = this.serializeSolanaSpecMessage(solanaMessage);\n return this.submitSerializedMessage(serializedMessage);\n }\n\n /**\n * Helper to build an unsigned transaction using the standard type builder.\n */\n private async buildUnsignedTransaction(\n runtimeCall: RuntimeCall,\n overrides?: DeepPartial<UnsignedTransaction<RuntimeCall>>,\n ): Promise<UnsignedTransaction<RuntimeCall>> {\n return this.typeBuilder.unsignedTransaction({\n runtimeCall,\n overrides: overrides ?? {},\n rollup: this.inner,\n });\n }\n\n /**\n * Helper to build a transaction result object.\n */\n private async buildTransactionResult(\n response: SovereignClient.Sequencer.TxCreateResponse,\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n pubkey: Uint8Array,\n signature: Uint8Array,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const transaction = await this.typeBuilder.transaction({\n unsignedTx,\n sender: pubkey,\n signature,\n rollup: this.inner,\n });\n return { response, transaction };\n }\n\n /**\n * Helper to create and serialize a SolanaOffchainUnsignedTransaction to JSON bytes.\n */\n private async createSolanaJsonBytes(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n ): Promise<Uint8Array> {\n const serializer = await this.inner.serializer();\n const schema = serializer.schema;\n const chainName = schema.chain_data.chain_name || \"\";\n\n const solanaUnsignedTx: SolanaOffchainUnsignedTransaction<RuntimeCall> = {\n runtime_call: unsignedTx.runtime_call,\n uniqueness: unsignedTx.uniqueness,\n details: unsignedTx.details,\n chain_name: chainName,\n };\n\n // JSON serialize the Solana unsigned transaction\n return new TextEncoder().encode(JSON.stringify(solanaUnsignedTx));\n }\n\n /**\n * Signs an unsigned transaction using Solana offchain simple signing and submits it.\n * Returns the transaction result in the same format as standard rollup.\n */\n private async signWithSolanaSimpleAndSubmit(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n signer: Signer,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const jsonBytes = await this.createSolanaJsonBytes(unsignedTx);\n\n const pubkey = await signer.publicKey();\n const chainHash = await this.inner.chainHash();\n\n const signature = await signer.sign(jsonBytes);\n\n // Build and submit result\n const solanaMessage: SolanaOffchainSimpleMessage = {\n signed_message: jsonBytes,\n chain_hash: chainHash,\n pubkey: pubkey,\n signature: signature,\n };\n\n const response = await this.submitSolanaMessage(solanaMessage);\n return this.buildTransactionResult(response, unsignedTx, pubkey, signature);\n }\n\n /**\n * Signs an unsigned transaction using Solana spec-compliant signing and submits it.\n * Returns the transaction result in the same format as standard rollup.\n */\n private async signWithSolanaSpecAndSubmit(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n signer: Signer,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const jsonBytes = await this.createSolanaJsonBytes(unsignedTx);\n\n const pubkey = await signer.publicKey();\n const chainHash = await this.inner.chainHash();\n\n // Create preamble and combine with message\n const preamble = createSolanaPreamble(pubkey, chainHash, jsonBytes.length);\n const signedMessageWithPreamble = new Uint8Array(\n preamble.length + jsonBytes.length,\n );\n signedMessageWithPreamble.set(preamble, 0);\n signedMessageWithPreamble.set(jsonBytes, preamble.length);\n const signature = await signer.sign(signedMessageWithPreamble);\n\n // Build and submit result\n const solanaMessage: SolanaOffchainSpecCompliantMessage = {\n signed_message_with_preamble: signedMessageWithPreamble,\n signature: signature,\n };\n\n const response = await this.submitSolanaSpecMessage(solanaMessage);\n return this.buildTransactionResult(response, unsignedTx, pubkey, signature);\n }\n\n /**\n * Performs a runtime call transaction with the specified authenticator.\n *\n * @param runtimeCall - The runtime call to execute\n * @param params - Parameters including signer, authenticator type, and optional overrides\n * @param options - Optional request options\n * @returns The transaction result including hash and transaction object\n */\n async call(\n runtimeCall: RuntimeCall,\n params: {\n signer: Signer;\n authenticator: Authenticator;\n overrides?: DeepPartial<UnsignedTransaction<RuntimeCall>>;\n },\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const authenticator =\n params.authenticator === \"solanaAuto\"\n ? this.getAutoAuthenticator(params.signer)\n : params.authenticator;\n\n // Dispatch based on authenticator\n switch (authenticator) {\n case \"standard\":\n return this.inner.call(\n runtimeCall,\n {\n signer: params.signer,\n overrides: params.overrides,\n },\n options,\n );\n case \"solanaSimple\": {\n const unsignedTx = await this.buildUnsignedTransaction(\n runtimeCall,\n params.overrides,\n );\n return this.signWithSolanaSimpleAndSubmit(unsignedTx, params.signer);\n }\n case \"solana\": {\n const unsignedTx = await this.buildUnsignedTransaction(\n runtimeCall,\n params.overrides,\n );\n return this.signWithSolanaSpecAndSubmit(unsignedTx, params.signer);\n }\n default:\n throw new Error(`Unsupported authenticator: ${authenticator}`);\n }\n }\n\n /**\n * Signs and submits a transaction with the specified authenticator.\n *\n * @param unsignedTx - The unsigned transaction to sign and submit\n * @param params - Parameters including signer and authenticator type\n * @param options - Optional request options\n * @returns The transaction result\n */\n async signAndSubmitTransaction(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n params: { signer: Signer; authenticator: Authenticator },\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const authenticator =\n params.authenticator === \"solanaAuto\"\n ? this.getAutoAuthenticator(params.signer)\n : params.authenticator;\n\n switch (authenticator) {\n case \"standard\":\n return this.inner.signAndSubmitTransaction(\n unsignedTx,\n {\n signer: params.signer,\n },\n options,\n );\n case \"solanaSimple\":\n return this.signWithSolanaSimpleAndSubmit(unsignedTx, params.signer);\n case \"solana\":\n return this.signWithSolanaSpecAndSubmit(unsignedTx, params.signer);\n default:\n throw new Error(`Unsupported authenticator: ${authenticator}`);\n }\n }\n\n /**\n * Submits a standard transaction.\n */\n async submitTransaction(\n transaction: StandardRollupSpec<RuntimeCall>[\"Transaction\"],\n authenticator: \"standard\",\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse>;\n\n /**\n * Submits a Solana offchain message.\n */\n async submitTransaction(\n transaction: SolanaOffchainSimpleMessage,\n authenticator: \"solanaSimple\",\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse>;\n\n /**\n * Submits a Solana spec-compliant message.\n */\n async submitTransaction(\n transaction: SolanaOffchainSpecCompliantMessage,\n authenticator: \"solana\",\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse>;\n\n /**\n * Submits a transaction with the specified authenticator.\n *\n * @param transaction - Either a standard transaction or a Solana message\n * @param authenticator - The authenticator type to use\n * @param options - Optional request options\n * @returns The transaction response\n */\n async submitTransaction(\n transaction:\n | StandardRollupSpec<RuntimeCall>[\"Transaction\"]\n | SolanaOffchainSimpleMessage\n | SolanaOffchainSpecCompliantMessage,\n authenticator: Authenticator,\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n switch (authenticator) {\n case \"standard\":\n return this.inner.submitTransaction(\n transaction as StandardRollupSpec<RuntimeCall>[\"Transaction\"],\n options,\n );\n case \"solanaSimple\": {\n // For Solana simple, we expect a SolanaOffchainSimpleMessage\n const solanaMessage = transaction as SolanaOffchainSimpleMessage;\n return await this.submitSolanaMessage(solanaMessage);\n }\n case \"solana\": {\n // For Solana spec-compliant, we expect a SolanaOffchainSpecCompliantMessage\n const solanaMessage = transaction as SolanaOffchainSpecCompliantMessage;\n return await this.submitSolanaSpecMessage(solanaMessage);\n }\n default:\n throw new Error(`Unsupported authenticator: ${authenticator}`);\n }\n }\n\n async simulate(\n runtimeMessage: RuntimeCall,\n params: Parameters<StandardRollup<RuntimeCall>[\"simulate\"]>[1],\n ) {\n return this.inner.simulate(runtimeMessage, params);\n }\n\n async dedup(address: Uint8Array) {\n return this.inner.dedup(address);\n }\n\n async serializer() {\n return this.inner.serializer();\n }\n\n async chainHash() {\n return this.inner.chainHash();\n }\n\n /**\n * Pre-fetches the rollup schema, populating the serializer and chain hash caches.\n * Call this during initialization to avoid the latency of lazy-loading on the first transaction.\n */\n hydrate(): Promise<void> {\n return this.inner.hydrate();\n }\n\n async healthcheck(timeout?: number) {\n return this.inner.healthcheck(timeout);\n }\n\n subscribe<T extends keyof SubscriptionToCallbackMap>(\n type: T,\n callback: SubscriptionToCallbackMap[T],\n ): Subscription {\n return this.inner.subscribe(type, callback);\n }\n\n get context() {\n return this.inner.context;\n }\n\n get ledger() {\n return this.inner.ledger;\n }\n\n get sequencer() {\n return this.inner.sequencer;\n }\n\n get rollup() {\n return this.inner.rollup;\n }\n\n get http() {\n return this.inner.http;\n }\n\n /**\n * Helper method to serialize a SolanaOffchainSimpleMessage using borsh encoding.\n */\n private serializeSolanaMessage(\n message: SolanaOffchainSimpleMessage,\n ): Uint8Array {\n // Validate message field lengths\n if (message.chain_hash.length !== CHAIN_HASH_SIZE) {\n throw new Error(\n `Invalid chain hash length: expected ${CHAIN_HASH_SIZE} bytes, got ${message.chain_hash.length}`,\n );\n }\n\n if (message.pubkey.length !== PUBKEY_SIZE) {\n throw new Error(\n `Invalid public key length: expected ${PUBKEY_SIZE} bytes, got ${message.pubkey.length}`,\n );\n }\n\n if (message.signature.length !== SIGNATURE_SIZE) {\n throw new Error(\n `Invalid signature length: expected ${SIGNATURE_SIZE} bytes, got ${message.signature.length}`,\n );\n }\n\n // Calculate total size using constants\n const totalSize =\n VEC_LENGTH_PREFIX_SIZE +\n message.signed_message.length +\n CHAIN_HASH_SIZE +\n PUBKEY_SIZE +\n SIGNATURE_SIZE;\n\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // Serialize Vec<u8> with length prefix (little-endian u32)\n const view = new DataView(buffer.buffer);\n view.setUint32(offset, message.signed_message.length, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n buffer.set(message.signed_message, offset);\n offset += message.signed_message.length;\n\n // Serialize chain_hash [u8; 32]\n buffer.set(message.chain_hash, offset);\n offset += CHAIN_HASH_SIZE;\n\n // Serialize pubkey [u8; 32]\n buffer.set(message.pubkey, offset);\n offset += PUBKEY_SIZE;\n\n // Serialize signature [u8; 64]\n buffer.set(message.signature, offset);\n\n return buffer;\n }\n\n /**\n * Helper method to serialize a SolanaOffchainSpecCompliantMessage using borsh encoding.\n */\n private serializeSolanaSpecMessage(\n message: SolanaOffchainSpecCompliantMessage,\n ): Uint8Array {\n // Validate signature length\n if (message.signature.length !== SIGNATURE_SIZE) {\n throw new Error(\n `Invalid signature length: expected ${SIGNATURE_SIZE} bytes, got ${message.signature.length}`,\n );\n }\n\n // Calculate total size\n const totalSize =\n VEC_LENGTH_PREFIX_SIZE +\n message.signed_message_with_preamble.length +\n SIGNATURE_SIZE;\n\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // Serialize Vec<u8> with length prefix (little-endian u32)\n const view = new DataView(buffer.buffer);\n view.setUint32(offset, message.signed_message_with_preamble.length, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n buffer.set(message.signed_message_with_preamble, offset);\n offset += message.signed_message_with_preamble.length;\n\n // Serialize signature [u8; 64]\n buffer.set(message.signature, offset);\n\n return buffer;\n }\n}\n\nexport async function createSolanaSignableRollup<RuntimeCall>(\n rollupConfig?: Partial<RollupConfig<DeepPartial<StandardRollupContext>>>,\n solanaEndpoint = \"/sequencer/accept-solana-offchain-tx\",\n) {\n // Create a standard rollup first\n const standardRollup = await createStandardRollup<RuntimeCall>(rollupConfig);\n\n // Wrap it with SolanaSignableRollup\n return new SolanaSignableRollup<RuntimeCall>(standardRollup, solanaEndpoint);\n}\n"],"mappings":"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","names":["SovereignClient","import_utils","IsoWebSocket","subscription","SovereignClient","import_client","import_utils","SovereignClient","import_js_base64","SovereignClient"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/addresses.ts","../src/rollup/rollup.ts","../src/errors.ts","../src/subscriptions.ts","../src/rollup/standard-rollup.ts","../src/rollup/solana-signable-rollup.ts"],"sourcesContent":["export * from \"./addresses\";\nexport * from \"./rollup\";\nexport * from \"./errors\";\nexport * from \"./type-spec\";\nexport { type EventPayload, Subscription } from \"./subscriptions\";\nexport * as SovereignClient from \"@sovereign-sdk/client\";\n","import { type HexString, ensureBytes } from \"@sovereign-sdk/utils\";\nimport { bech32m } from \"bech32\";\n\n/**\n * Encodes a public key as a bech32m address with the given human-readable part (hrp).\n *\n * @param publicKey - The public key to encode, as a hex string or Uint8Array.\n * @param hrp - The human-readable part for the bech32m address (e.g., \"sov\").\n * @param concatPublicKey - Optional. If provided, only the first `concatPublicKey` bytes of the public key are used.\n * @returns The bech32m-encoded address as a string.\n * @throws {Error} If the public key is not a valid hex string or Uint8Array.\n */\nexport function addressFromPublicKey(\n publicKey: HexString | Uint8Array,\n hrp: string,\n concatPublicKey = 28,\n): string {\n let publicKeyBytes = ensureBytes(publicKey);\n\n if (concatPublicKey !== publicKey.length) {\n publicKeyBytes = publicKeyBytes.slice(0, concatPublicKey);\n }\n\n const words = bech32m.toWords(publicKeyBytes);\n return bech32m.encode(hrp, words);\n}\n","import SovereignClient from \"@sovereign-sdk/client\";\nimport type { APIError } from \"@sovereign-sdk/client\";\nimport type { RollupSchema, Serializer } from \"@sovereign-sdk/serializers\";\nimport type { Signer } from \"@sovereign-sdk/signers\";\nimport { bytesToHex, hexToBytes } from \"@sovereign-sdk/utils\";\nimport { Base64 } from \"js-base64\";\nimport { VersionMismatchError } from \"../errors\";\nimport {\n type Subscription,\n type SubscriptionToCallbackMap,\n createSubscription,\n} from \"../subscriptions\";\nimport type { BaseTypeSpec } from \"../type-spec\";\nimport type { DeepPartial } from \"../utils\";\n\nexport type UnsignedTransactionContext<\n S extends BaseTypeSpec,\n C extends RollupContext,\n> = {\n runtimeCall: S[\"RuntimeCall\"];\n // Provides the ability to override the generation data instead of retrieving it automatically.\n overrides: DeepPartial<S[\"UnsignedTransaction\"]>;\n rollup: Rollup<S, C>;\n};\n\nexport type TransactionContext<\n S extends BaseTypeSpec,\n C extends RollupContext,\n> = {\n unsignedTx: S[\"UnsignedTransaction\"];\n sender: Uint8Array;\n signature: Uint8Array;\n rollup: Rollup<S, C>;\n};\n\nexport type TypeBuilder<S extends BaseTypeSpec, C extends RollupContext> = {\n unsignedTransaction: (\n context: UnsignedTransactionContext<S, C>,\n ) => Promise<S[\"UnsignedTransaction\"]>;\n\n transaction: (context: TransactionContext<S, C>) => Promise<S[\"Transaction\"]>;\n};\n\n/**\n * Arbitrary context that is associated with the rollup.\n */\nexport type RollupContext = Record<string, unknown>;\n\n/**\n * The configuration for a rollup client.\n */\nexport type RollupConfig<C extends RollupContext> = {\n /**\n * The base URL of the rollup full node API.\n */\n url?: string;\n /**\n * The Sovereign SDK client to use for the rollup.\n * If not provided, the default client will be used using {@link PartialRollupConfig.url}.\n */\n client: SovereignClient;\n /**\n * Creates the serializer instance to use for the rollup.\n *\n * This can be called more than once, for example if the chain hash changes (i.e a new rollup version)\n * is detected then it will be called again with the new rollup schema.\n */\n getSerializer: (schema: RollupSchema) => Serializer;\n /**\n * Arbitrary context that is associated with the rollup.\n */\n context: C;\n /**\n * The endpoint path for submitting transactions.\n * Defaults to \"/sequencer/txs\", the standard Sovereign SDK endpoint.\n * Can be overridden if your rollup is configured to expose non-standard endpoints in\n * order to support multiple different transaction encoding or authentication schemes.\n */\n txSubmissionEndpoint: string;\n};\n\n/**\n * The result of signing and submitting a transaction.\n *\n * @template Tx The type of the transaction\n */\nexport type TransactionResult<Tx> = {\n /**\n * The response from the sequencer.\n */\n response: SovereignClient.Sequencer.TxCreateResponse;\n /**\n * The transaction that was submitted.\n */\n transaction: Tx;\n};\n\n/**\n * The parameters for signing and submitting a transaction.\n */\nexport type SignerParams = {\n /**\n * The signer to use for signing the transaction.\n */\n signer: Signer;\n};\n\n/**\n * The parameters for calling executing a runtime call transaction.\n */\nexport type CallParams<S extends BaseTypeSpec> = {\n overrides?: DeepPartial<S[\"UnsignedTransaction\"]>;\n} & SignerParams;\n\n/**\n * A generic rollup client.\n *\n * @template S - The type specification for the rollup.\n * If not provided, the base type specification will be used which uses `any` for all types.\n * @template C - The context for the rollup.\n */\nexport class Rollup<S extends BaseTypeSpec, C extends RollupContext> {\n private readonly _config: RollupConfig<C>;\n private readonly _typeBuilder: TypeBuilder<S, C>;\n private _chainHash?: Uint8Array;\n private _serializer?: Serializer;\n\n /**\n * Creates a new rollup client.\n *\n * @param config - The configuration for the rollup client.\n * @param typeBuilder - The type builder for the rollup.\n */\n constructor(config: RollupConfig<C>, typeBuilder: TypeBuilder<S, C>) {\n this._config = config;\n this._typeBuilder = typeBuilder;\n }\n\n /**\n * Retrieve dedup information about the provided address.\n *\n * @param publicKey - The public key to dedup.\n * TODO: How to add param for generation explicitly\n */\n async dedup(publicKey: Uint8Array): Promise<S[\"Dedup\"]> {\n // for public key credential id is just its bytes representation\n const credentialId = bytesToHex(publicKey);\n const response = await this.rollup.addresses.dedup(credentialId);\n return response as S[\"Dedup\"];\n }\n\n /**\n * Submits a transaction to the rollup.\n *\n * The endpoint used for submission can be overridden via the options.path parameter.\n * If not specified, the rollup's configured txSubmissionEndpoint will be used.\n *\n * @param transaction - The transaction to submit.\n * @param {SovereignClient.RequestOptions} options - The options for the request.\n */\n async submitTransaction(\n transaction: S[\"Transaction\"],\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const serializer = await this.serializer();\n const serializedTx = serializer.serializeTx(transaction);\n // Stainless RequestOptions is generic internally, causing issues for `body` and `query`.\n // That's fine since we supply the `body` and transaction submission doesn't take query parameters.\n // So we hack around this by destructuring them out.\n const { body: _, query: __, path, ...requestOptions } = options || {};\n const txSubmissionEndpoint = path || this._config.txSubmissionEndpoint;\n\n return this.http\n .post<SovereignClient.Sequencer.TxCreateResponse>(txSubmissionEndpoint, {\n body: { body: Base64.fromUint8Array(serializedTx) },\n ...requestOptions,\n })\n .catch(async (e) => {\n if (isVersionMismatchError(e as APIError)) {\n const oldVersion = bytesToHex(await this.chainHash());\n const { schema, chain_hash: newVersion } = await this.rollup.schema();\n this._chainHash = hexToBytes(newVersion);\n this._serializer = this._config.getSerializer(schema);\n\n // bytesToHex returns without 0x prefix, but server returns with 0x prefix\n if (`0x${oldVersion}` !== newVersion) {\n throw new VersionMismatchError(\n \"Schema version mismatch when submitting transaction\",\n newVersion,\n oldVersion,\n );\n }\n }\n throw e;\n });\n }\n\n /**\n * Signs and submits a transaction to the rollup.\n * Utilizes the provided signer to sign the transaction.\n *\n * @param unsignedTx - The unsigned transaction to sign and submit.\n * @param {SignerParams} params - The params for signing and submitting the transaction.\n * @param {SovereignClient.RequestOptions} options - The options for the request.\n * @param endpoint - Optional endpoint override. If not specified, uses the rollup's configured txSubmissionEndpoint.\n */\n async signAndSubmitTransaction(\n unsignedTx: S[\"UnsignedTransaction\"],\n { signer }: SignerParams,\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<S[\"Transaction\"]>> {\n const tx = await this.signTransaction(unsignedTx, signer);\n const result = await this.submitTransaction(tx, options);\n\n return { transaction: tx, response: result };\n }\n\n /**\n * Performs a runtime call transaction.\n * Utilizes the provided signer to sign the transaction.\n *\n * @param runtimeCall - The runtime message to call.\n * @param {CallParams<S>} params - The params for submitting a runtime call transaction.\n * @param {SovereignClient.RequestOptions} options - The options for the request.\n */\n async call(\n runtimeCall: S[\"RuntimeCall\"],\n { signer, overrides }: CallParams<S>,\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<S[\"Transaction\"]>> {\n const context = {\n runtimeCall,\n rollup: this,\n overrides: overrides ?? ({} as DeepPartial<S[\"UnsignedTransaction\"]>),\n };\n const unsignedTx = await this._typeBuilder.unsignedTransaction(context);\n\n return this.signAndSubmitTransaction(\n unsignedTx,\n {\n signer,\n },\n options,\n );\n }\n\n /**\n * Prepares a runtime call by creating and signing a transaction without submitting it.\n * This is useful for scenarios where you need the signed transaction for later submission\n * or for analysis purposes.\n *\n * @param runtimeCall - The runtime message to prepare.\n * @param params - The parameters for preparing the call.\n * @param params.signer - The signer to use for signing the transaction.\n * @param params.overrides - Optional overrides for the unsigned transaction.\n * @returns A promise that resolves to the signed transaction.\n */\n async prepareCall(\n runtimeCall: S[\"RuntimeCall\"],\n { signer, overrides }: CallParams<S>,\n ): Promise<S[\"Transaction\"]> {\n const context = {\n runtimeCall,\n rollup: this,\n overrides: overrides ?? ({} as DeepPartial<S[\"UnsignedTransaction\"]>),\n };\n const unsignedTx = await this._typeBuilder.unsignedTransaction(context);\n return this.signTransaction(unsignedTx, signer);\n }\n\n /**\n * Signs an unsigned transaction using the provided signer.\n * Creates a signature by combining the serialized unsigned transaction with the chain hash,\n * then constructs a fully signed transaction.\n *\n * @param unsignedTx - The unsigned transaction to sign.\n * @param signer - The signer to use for signing the transaction.\n * @returns A promise that resolves to the signed transaction.\n */\n async signTransaction(\n unsignedTx: S[\"UnsignedTransaction\"],\n signer: Signer,\n ): Promise<S[\"Transaction\"]> {\n const serializer = await this.serializer();\n const serializedUnsignedTx = serializer.serializeUnsignedTx(unsignedTx);\n const chainHash = await this.chainHash();\n const signature = await signer.sign(\n new Uint8Array([...serializedUnsignedTx, ...chainHash]),\n );\n const publicKey = await signer.publicKey();\n const context = {\n unsignedTx,\n sender: publicKey,\n signature,\n rollup: this,\n };\n return this._typeBuilder.transaction(context);\n }\n\n /**\n * Create a subscription to events emitted over websockets by the rollup.\n */\n subscribe<T extends keyof SubscriptionToCallbackMap>(\n type: T,\n callback: SubscriptionToCallbackMap[T],\n ): Subscription {\n return createSubscription(type, callback, this.http);\n }\n\n /**\n * Performs a healthcheck against the rollup to determine if it is currently healthy.\n *\n * @param timeout - Request timeout in milliseconds.\n * @returns `true` if the rollup is considered healthy otherwise `false`.\n */\n async healthcheck(timeout = 5000): Promise<boolean> {\n try {\n await this.http.get(\"/healthcheck\", { timeout, maxRetries: 1 });\n return true;\n } catch (e) {\n return !(e instanceof SovereignClient.APIConnectionError);\n }\n }\n\n /**\n * A ledger client that can be used to query the ledger.\n */\n get ledger(): SovereignClient.Ledger {\n return this.http.ledger;\n }\n\n /**\n * A sequencer client that can be used to submit transactions & batches to the rollup.\n */\n get sequencer(): SovereignClient.Sequencer {\n return this.http.sequencer;\n }\n\n /**\n * A rollup client that can be used to perform operations on the rollup.\n */\n get rollup(): SovereignClient.Rollup {\n return this.http.rollup;\n }\n\n /**\n * A client that can be used to perform HTTP requests to the Sovereign API.\n * This can be used as an escape hatch to execute arbitrary requests to the Sovereign API\n * if the operation is not supported by `ledger`, `sequencer`, or `rollup` clients.\n */\n get http(): SovereignClient {\n return this._config.client;\n }\n\n /**\n * Pre-fetches the rollup schema, populating the serializer and chain hash caches.\n * Call this during initialization to avoid the latency of lazy-loading on the first transaction.\n */\n hydrate(): Promise<void> {\n return this._fetchSchema();\n }\n\n /**\n * The serializer for the rollup.\n * Can be used to serialize transactions, runtime calls, etc.\n */\n async serializer(): Promise<Serializer> {\n if (!this._serializer) await this._fetchSchema();\n // _fetchSchema always sets _serializer\n return this._serializer as Serializer;\n }\n\n /**\n * The context for the rollup.\n */\n get context(): C {\n return this._config.context;\n }\n\n async chainHash(): Promise<Uint8Array> {\n if (!this._chainHash) await this._fetchSchema();\n // _fetchSchema always sets _chainHash\n return this._chainHash as Uint8Array;\n }\n\n private async _fetchSchema(): Promise<void> {\n const { schema, chain_hash } = await this.rollup.schema();\n this._serializer = this._config.getSerializer(schema);\n this._chainHash = hexToBytes(chain_hash);\n }\n}\n\nfunction isVersionMismatchError(e: APIError): boolean {\n if (\n // biome-ignore lint/suspicious/noExplicitAny: yolo\n (e.error as any)?.details?.error?.includes(\"Signature verification failed\")\n ) {\n return true;\n }\n\n return false;\n}\n","/**\n * Base error class for Sovereign SDK Web3.\n */\nexport class SovereignError extends Error {\n constructor(message: string) {\n super(message);\n\n this.name = this.constructor.name;\n this.stack = new Error().stack;\n }\n}\n\nexport class InvalidRollupConfigError extends SovereignError {}\n\nexport class VersionMismatchError extends SovereignError {\n public readonly newVersion: string;\n public readonly currentVersion: string;\n public readonly retryable: boolean;\n\n constructor(message: string, newVersion: string, currentVersion: string) {\n super(message);\n\n this.newVersion = newVersion;\n this.currentVersion = currentVersion;\n this.retryable = newVersion !== currentVersion;\n }\n}\n\nexport class SchemaError extends SovereignError {\n public readonly schema: object;\n public readonly reason: string;\n\n constructor(message: string, reason: string, schema: object) {\n super(`${message}: ${reason}`);\n\n this.reason = reason;\n this.schema = schema;\n }\n}\n","import type SovereignSDK from \"@sovereign-sdk/client\";\nimport IsoWebSocket from \"isomorphic-ws\";\nimport { WebSocket } from \"partysocket\";\nimport { SovereignError } from \"./errors\";\n\ntype Url = string;\n\nexport function httpToWebSocket(url: string) {\n return url.replace(/^http(s?):\\/\\//, (_, s) => `ws${s}://`);\n}\n\nexport type Subscription = {\n /** Url providing the subscription. */\n url: Url;\n /** Unsubscribe this subscription. */\n unsubscribe: () => void;\n};\n\ntype SubscriptionEntry = {\n websocket: WebSocket;\n // biome-ignore lint/suspicious/noExplicitAny: allow\n callbacks: Array<(...args: any[]) => void>;\n};\n\nexport const _subscriptions: Record<Url, SubscriptionEntry> = {};\n\n/** Subscribe to the provided websocket url & call the provided callback on messages received. */\nexport function subscribe(\n url: Url,\n // biome-ignore lint/suspicious/noExplicitAny: allow\n callback: (...args: any[]) => void,\n): Subscription {\n const subscription = _subscriptions[url];\n\n if (!subscription) {\n const websocket = new WebSocket(url, [], { WebSocket: IsoWebSocket });\n // bun compatibility: https://github.com/partykit/partykit/issues/774\n websocket.binaryType = \"arraybuffer\";\n\n _subscriptions[url] = {\n websocket,\n callbacks: [callback],\n };\n\n websocket.addEventListener(\"message\", (message) => {\n const data = JSON.parse(message.data);\n const callbacks = _subscriptions[url]?.callbacks;\n if (callbacks) {\n for (const cb of callbacks) {\n cb(data);\n }\n }\n });\n websocket.addEventListener(\"error\", (e) =>\n console.log(\"Websocket error\", e),\n );\n } else {\n subscription.callbacks.push(callback);\n }\n\n const callbackIndex = _subscriptions[url]?.callbacks.length - 1;\n\n return {\n get url() {\n return url;\n },\n unsubscribe() {\n const subscription = _subscriptions[url];\n\n if (!subscription) {\n return;\n }\n\n subscription.callbacks.splice(callbackIndex, 1);\n\n if (!subscription.callbacks.length) {\n subscription.websocket.close();\n delete _subscriptions[url];\n }\n },\n };\n}\n\nexport type EventPayload = {\n tx_hash: string;\n type: \"event\";\n number: number;\n key: string;\n value: Record<string, unknown>;\n module: {\n type: \"moduleRef\";\n name: string;\n };\n};\n\nexport interface SubscriptionToCallbackMap {\n events: (event: EventPayload) => Promise<void>;\n}\n\nexport function createSubscription<T extends keyof SubscriptionToCallbackMap>(\n subscription: T,\n callback: SubscriptionToCallbackMap[T],\n client: SovereignSDK,\n): Subscription {\n switch (subscription) {\n case \"events\": {\n const url = client.buildURL(\"/sequencer/events/ws\", {});\n return subscribe(\n httpToWebSocket(url),\n callback as SubscriptionToCallbackMap[\"events\"],\n );\n }\n default:\n throw new SovereignError(`Invalid subscription type '${subscription}'`);\n }\n}\n","import SovereignClient from \"@sovereign-sdk/client\";\nimport { JsSerializer } from \"@sovereign-sdk/serializers\";\nimport type {\n Transaction,\n TxDetails,\n UnsignedTransaction,\n} from \"@sovereign-sdk/types\";\nimport { bytesToHex } from \"@sovereign-sdk/utils\";\nimport type { DeepPartial } from \"../utils\";\nimport {\n Rollup,\n type RollupConfig,\n type SignerParams,\n type TransactionContext,\n type TypeBuilder,\n type UnsignedTransactionContext,\n} from \"./rollup\";\n\nexport type Dedup = {\n nonce: number;\n};\n\nexport type StandardRollupContext = {\n defaultTxDetails: TxDetails;\n};\n\nexport type StandardRollupSpec<RuntimeCall> = {\n UnsignedTransaction: UnsignedTransaction<RuntimeCall>;\n Transaction: Transaction<RuntimeCall>;\n RuntimeCall: RuntimeCall;\n Dedup: Dedup;\n};\n\nconst useOrFetchUniqueness = async <S extends StandardRollupSpec<unknown>>({\n overrides,\n}: Omit<\n UnsignedTransactionContext<S, StandardRollupContext>,\n \"runtimeCall\"\n>) => {\n if (overrides?.uniqueness) {\n return overrides.uniqueness;\n }\n\n return { generation: Date.now() };\n};\n\nexport function standardTypeBuilder<\n S extends StandardRollupSpec<unknown>,\n>(): TypeBuilder<S, StandardRollupContext> {\n return {\n async unsignedTransaction(\n context: UnsignedTransactionContext<S, StandardRollupContext>,\n ) {\n const { rollup, runtimeCall } = context;\n const { uniqueness: _, ...overrides } = context.overrides;\n const uniqueness = await useOrFetchUniqueness(context);\n const details: TxDetails = {\n ...rollup.context.defaultTxDetails,\n ...overrides.details,\n };\n\n return {\n runtime_call: runtimeCall,\n uniqueness,\n details,\n } as S[\"UnsignedTransaction\"];\n },\n async transaction({\n sender,\n signature,\n unsignedTx,\n }: TransactionContext<S, StandardRollupContext>) {\n return {\n V0: {\n pub_key: bytesToHex(sender),\n signature: bytesToHex(signature),\n ...unsignedTx,\n },\n };\n },\n };\n}\n\n/**\n * The parameters for simulating a runtime call transaction.\n */\nexport type SimulateParams = Omit<\n SovereignClient.RollupSimulateParams,\n \"call\" | \"sender\"\n> &\n SignerParams;\n\nexport class StandardRollup<RuntimeCall> extends Rollup<\n StandardRollupSpec<RuntimeCall>,\n StandardRollupContext\n> {\n /**\n * Simulates a runtime call transaction.\n *\n * This method can be useful to estimate the gas cost of a runtime call transaction.\n *\n * @param runtimeMessage - The runtime message to call.\n */\n async simulate(\n runtimeMessage: StandardRollupSpec<RuntimeCall>[\"RuntimeCall\"],\n { signer }: SimulateParams,\n ): Promise<SovereignClient.Rollup.RollupSimulateResponse> {\n const publicKey = await signer.publicKey();\n const sender = bytesToHex(publicKey);\n const call = runtimeMessage as { [key: string]: unknown };\n\n return this.rollup.simulate({ sender, call });\n }\n}\n\nexport const DEFAULT_TX_DETAILS: Omit<TxDetails, \"chain_id\"> = {\n max_priority_fee_bips: 0,\n max_fee: \"100000000\",\n gas_limit: null,\n};\n\nasync function buildContext<C extends StandardRollupContext>(\n client: SovereignClient,\n context?: DeepPartial<C>,\n): Promise<C> {\n const defaultTxDetails = {\n ...DEFAULT_TX_DETAILS,\n ...context?.defaultTxDetails,\n };\n\n if (!defaultTxDetails.chain_id) {\n const { chain_id } = await client.rollup.constants();\n\n defaultTxDetails.chain_id = chain_id;\n }\n\n return {\n defaultTxDetails,\n } as C;\n}\n\nexport async function createStandardRollup<\n RuntimeCall,\n C extends StandardRollupContext = StandardRollupContext,\n>(\n rollupConfig?: Partial<RollupConfig<DeepPartial<C>>>,\n typeBuilderOverrides?: Partial<\n TypeBuilder<StandardRollupSpec<RuntimeCall>, C>\n >,\n) {\n const config = rollupConfig ?? {};\n const client = config.client ?? new SovereignClient({ baseURL: config.url });\n const getSerializer =\n config.getSerializer ?? ((schema) => new JsSerializer(schema));\n const context = await buildContext<C>(client, config.context);\n\n // Default to the standard transaction submission endpoint\n const txSubmissionEndpoint = config.txSubmissionEndpoint ?? \"/sequencer/txs\";\n\n return new StandardRollup<RuntimeCall>(\n {\n ...config,\n client,\n getSerializer,\n context,\n txSubmissionEndpoint,\n },\n {\n ...standardTypeBuilder(),\n ...typeBuilderOverrides,\n },\n );\n}\n","import type SovereignClient from \"@sovereign-sdk/client\";\nimport { type Signer, isLedgerSolanaSigner } from \"@sovereign-sdk/signers\";\nimport type {\n Transaction,\n TransactionV1,\n UnsignedTransaction,\n} from \"@sovereign-sdk/types\";\nimport { bytesToHex, hexToBytes } from \"@sovereign-sdk/utils\";\nimport bs58 from \"bs58\";\nimport { Base64 } from \"js-base64\";\nimport type { Subscription, SubscriptionToCallbackMap } from \"../subscriptions\";\nimport type { DeepPartial } from \"../utils\";\nimport type { RollupConfig, TransactionResult } from \"./rollup\";\nimport {\n type StandardRollup,\n type StandardRollupContext,\n type StandardRollupSpec,\n createStandardRollup,\n standardTypeBuilder,\n} from \"./standard-rollup\";\n\nexport type SolanaOffchainUnsignedTransaction<RuntimeCall> =\n UnsignedTransaction<RuntimeCall> & {\n chain_name: string;\n };\n\nexport type SolanaOffchainUnsignedTransactionV1<RuntimeCall> =\n SolanaOffchainUnsignedTransaction<RuntimeCall> & {\n multisig_id: string;\n version: number;\n };\n\nexport type SolanaOffchainSimpleMessage = {\n signed_message: Uint8Array;\n chain_hash: Uint8Array;\n pubkey: Uint8Array;\n signature: Uint8Array;\n};\n\nexport type SolanaOffchainSpecCompliantMessage = {\n signed_message_with_preamble: Uint8Array;\n signature: Uint8Array;\n};\n\nexport type SolanaOffchainSimpleMultisigMessage = {\n /** Wire format: [0x80][JSON payload]. The 0x80 prefix is a parsing discriminator only. */\n wire_bytes: Uint8Array;\n chain_hash: Uint8Array;\n signatures: Array<{ signature: Uint8Array; pub_key: Uint8Array }>;\n unused_pub_keys: Uint8Array[];\n min_signers: number;\n};\n\nexport type SolanaOffchainSpecCompliantMultisigMessage = {\n signed_message_with_preamble: Uint8Array;\n signatures: Uint8Array[];\n signer_bitfield: number;\n min_signers: number;\n};\n\nexport type Authenticator =\n | \"standard\"\n | \"solanaSimple\"\n | \"solana\"\n | \"solanaAuto\";\n\nexport type SolanaMultisigAuthenticator = \"solanaSimple\" | \"solana\";\n\ntype SolanaMultisigParams = {\n multisigAddress: Uint8Array;\n multisigPubkeys: Uint8Array[];\n};\n\nexport type SolanaMultisigSubmitParams =\n | {\n authenticator: \"standard\";\n }\n | ({ authenticator: SolanaMultisigAuthenticator } & SolanaMultisigParams);\n\nexport type SolanaMultisigSignParams = SolanaMultisigSubmitParams & {\n signer: Signer;\n};\n\n/**\n * Discriminator byte prepended to the wire bytes in the multisig simple format.\n * Used only for borsh-level format routing — not part of the signed content.\n * Matches `MULTISIG_SIMPLE_DISCRIMINATOR` on the Rust side.\n */\nconst MULTISIG_SIMPLE_DISCRIMINATOR = 0x80;\n\n// Borsh serialization constants\nconst VEC_LENGTH_PREFIX_SIZE = 4;\nconst CHAIN_HASH_SIZE = 32;\nconst PUBKEY_SIZE = 32;\nconst SIGNATURE_SIZE = 64;\nconst MULTISIG_PREAMBLE_FIXED_LENGTH = 53;\nconst MAX_MULTISIG_SIGNERS = 21; // TODO - is there any way we could get it from Rust rather than hard-coding here\n\n// Solana preamble constants\nconst SIGNING_DOMAIN = new Uint8Array([\n 0xff,\n ...new TextEncoder().encode(\"solana offchain\"),\n]);\nconst HEADER_VERSION = 0;\nconst MESSAGE_FORMAT = 0;\n\nfunction compareByteArrays(left: Uint8Array, right: Uint8Array): number {\n const minLength = Math.min(left.length, right.length);\n\n for (let i = 0; i < minLength; i++) {\n if (left[i] !== right[i]) {\n return left[i] - right[i];\n }\n }\n\n return left.length - right.length;\n}\n\nfunction createSolanaPreamble(\n pubkeys: Uint8Array[],\n chainHash: Uint8Array,\n messageLength: number,\n): Uint8Array {\n if (pubkeys.length < 1 || pubkeys.length > MAX_MULTISIG_SIGNERS) {\n throw new Error(\n `Invalid signer count: expected 1-${MAX_MULTISIG_SIGNERS} signers, got ${pubkeys.length}`,\n );\n }\n\n const preamble = new Uint8Array(\n MULTISIG_PREAMBLE_FIXED_LENGTH + pubkeys.length * PUBKEY_SIZE,\n );\n let offset = 0;\n\n preamble.set(SIGNING_DOMAIN, offset);\n offset += 16;\n\n preamble[offset] = HEADER_VERSION;\n offset += 1;\n\n preamble.set(chainHash, offset);\n offset += 32;\n\n preamble[offset] = MESSAGE_FORMAT;\n offset += 1;\n\n preamble[offset] = pubkeys.length;\n offset += 1;\n\n for (const pubkey of pubkeys) {\n if (pubkey.length !== PUBKEY_SIZE) {\n throw new Error(\n `Invalid public key length: expected ${PUBKEY_SIZE} bytes, got ${pubkey.length}`,\n );\n }\n\n preamble.set(pubkey, offset);\n offset += PUBKEY_SIZE;\n }\n\n new DataView(preamble.buffer, offset).setUint16(0, messageLength, true);\n\n return preamble;\n}\n\nexport class SolanaSignableRollup<RuntimeCall> {\n private inner: StandardRollup<RuntimeCall>;\n private solanaEndpoint: string;\n private typeBuilder = standardTypeBuilder<StandardRollupSpec<RuntimeCall>>();\n\n constructor(\n inner: StandardRollup<RuntimeCall>,\n solanaEndpoint = \"/sequencer/accept-solana-offchain-tx\",\n ) {\n this.inner = inner;\n this.solanaEndpoint = solanaEndpoint;\n }\n\n /**\n * Determines the appropriate authenticator based on the signer type.\n * Returns \"solana\" for LedgerSolanaSigner (hardware wallet with spec-compliant signing)\n * and \"solanaSimple\" for software signers.\n */\n private getAutoAuthenticator(signer: Signer): \"solana\" | \"solanaSimple\" {\n return isLedgerSolanaSigner(signer) ? \"solana\" : \"solanaSimple\";\n }\n\n /**\n * Submits serialized data to the Solana endpoint.\n */\n private async submitSerializedMessage(\n serializedMessage: Uint8Array,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n return await this.inner.http.post<SovereignClient.Sequencer.TxCreateResponse>(\n this.solanaEndpoint,\n {\n // Match AcceptTx shape used by standard sequencer endpoints.\n body: { body: Base64.fromUint8Array(serializedMessage) },\n },\n );\n }\n\n /**\n * Submits a Solana offchain message to the rollup.\n */\n private async submitSolanaMessage(\n solanaMessage: SolanaOffchainSimpleMessage,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const serializedMessage = this.serializeSolanaMessage(solanaMessage);\n return this.submitSerializedMessage(serializedMessage);\n }\n\n /**\n * Submits a Solana spec-compliant message to the rollup.\n */\n private async submitSolanaSpecMessage(\n solanaMessage: SolanaOffchainSpecCompliantMessage,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const serializedMessage = this.serializeSolanaSpecMessage(solanaMessage);\n return this.submitSerializedMessage(serializedMessage);\n }\n\n /**\n * Submits a Solana spec-compliant multisig message to the rollup.\n */\n private async submitSolanaSpecMultisigMessage(\n solanaMessage: SolanaOffchainSpecCompliantMultisigMessage,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const serializedMessage =\n this.serializeSolanaSpecMultisigMessage(solanaMessage);\n return this.submitSerializedMessage(serializedMessage);\n }\n\n /**\n * Helper to build an unsigned transaction using the standard type builder.\n */\n private async buildUnsignedTransaction(\n runtimeCall: RuntimeCall,\n overrides?: DeepPartial<UnsignedTransaction<RuntimeCall>>,\n ): Promise<UnsignedTransaction<RuntimeCall>> {\n return this.typeBuilder.unsignedTransaction({\n runtimeCall,\n overrides: overrides ?? {},\n rollup: this.inner,\n });\n }\n\n /**\n * Helper to build a transaction result object.\n */\n private async buildTransactionResult(\n response: SovereignClient.Sequencer.TxCreateResponse,\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n pubkey: Uint8Array,\n signature: Uint8Array,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const transaction = await this.typeBuilder.transaction({\n unsignedTx,\n sender: pubkey,\n signature,\n rollup: this.inner,\n });\n return { response, transaction };\n }\n\n /**\n * Concatenates a Solana preamble with the message bytes it signs.\n */\n private combinePreambleAndMessage(\n preamble: Uint8Array,\n message: Uint8Array,\n ): Uint8Array {\n const signedMessage = new Uint8Array(preamble.length + message.length);\n signedMessage.set(preamble, 0);\n signedMessage.set(message, preamble.length);\n return signedMessage;\n }\n\n /**\n * Validates and canonicalizes the multisig pubkey list.\n * The canonical order is lexicographic by raw pubkey bytes.\n */\n private canonicalizeMultisigPubkeys(\n multisigPubkeys?: Uint8Array[],\n ): Uint8Array[] {\n if (!multisigPubkeys) {\n throw new Error(\n \"multisigPubkeys is required for Solana multisig transactions\",\n );\n }\n\n if (\n multisigPubkeys.length < 2 ||\n multisigPubkeys.length > MAX_MULTISIG_SIGNERS\n ) {\n throw new Error(\n `Invalid multisig signer count: expected 2-${MAX_MULTISIG_SIGNERS} signers, got ${multisigPubkeys.length}`,\n );\n }\n\n const seenPubkeys = new Set<string>();\n for (const pubkey of multisigPubkeys) {\n if (pubkey.length !== PUBKEY_SIZE) {\n throw new Error(\n `Invalid public key length: expected ${PUBKEY_SIZE} bytes, got ${pubkey.length}`,\n );\n }\n\n const pubkeyHex = bytesToHex(pubkey);\n if (seenPubkeys.has(pubkeyHex)) {\n throw new Error(`Duplicate multisig public key provided: ${pubkeyHex}`);\n }\n seenPubkeys.add(pubkeyHex);\n }\n\n return [...multisigPubkeys].sort(compareByteArrays);\n }\n\n /**\n * Helper to create and serialize a SolanaOffchainUnsignedTransaction to JSON bytes.\n */\n private async createSolanaJsonBytes(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n ): Promise<Uint8Array> {\n const serializer = await this.inner.serializer();\n const schema = serializer.schema;\n const chainName = schema.chain_data.chain_name || \"\";\n\n const solanaUnsignedTx: SolanaOffchainUnsignedTransaction<RuntimeCall> = {\n runtime_call: unsignedTx.runtime_call,\n uniqueness: unsignedTx.uniqueness,\n details: unsignedTx.details,\n chain_name: chainName,\n };\n\n // JSON serialize the Solana unsigned transaction\n return new TextEncoder().encode(JSON.stringify(solanaUnsignedTx));\n }\n\n /**\n * Signs an unsigned transaction using Solana offchain simple signing and submits it.\n * Returns the transaction result in the same format as standard rollup.\n */\n private async signWithSolanaSimpleAndSubmit(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n signer: Signer,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const jsonBytes = await this.createSolanaJsonBytes(unsignedTx);\n\n const pubkey = await signer.publicKey();\n const chainHash = await this.inner.chainHash();\n\n const signature = await signer.sign(jsonBytes);\n\n // Build and submit result\n const solanaMessage: SolanaOffchainSimpleMessage = {\n signed_message: jsonBytes,\n chain_hash: chainHash,\n pubkey: pubkey,\n signature: signature,\n };\n\n const response = await this.submitSolanaMessage(solanaMessage);\n return this.buildTransactionResult(response, unsignedTx, pubkey, signature);\n }\n\n /**\n * Signs an unsigned transaction using Solana spec-compliant signing and submits it.\n * Returns the transaction result in the same format as standard rollup.\n */\n private async signWithSolanaSpecAndSubmit(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n signer: Signer,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const jsonBytes = await this.createSolanaJsonBytes(unsignedTx);\n\n const pubkey = await signer.publicKey();\n const chainHash = await this.inner.chainHash();\n\n // Create preamble and combine with message\n const preamble = createSolanaPreamble(\n [pubkey],\n chainHash,\n jsonBytes.length,\n );\n const signedMessageWithPreamble = this.combinePreambleAndMessage(\n preamble,\n jsonBytes,\n );\n const signature = await signer.sign(signedMessageWithPreamble);\n\n // Build and submit result\n const solanaMessage: SolanaOffchainSpecCompliantMessage = {\n signed_message_with_preamble: signedMessageWithPreamble,\n signature: signature,\n };\n\n const response = await this.submitSolanaSpecMessage(solanaMessage);\n return this.buildTransactionResult(response, unsignedTx, pubkey, signature);\n }\n\n /**\n * Performs a runtime call transaction with the specified authenticator.\n *\n * @param runtimeCall - The runtime call to execute\n * @param params - Parameters including signer, authenticator type, and optional overrides\n * @param options - Optional request options\n * @returns The transaction result including hash and transaction object\n */\n async call(\n runtimeCall: RuntimeCall,\n params: {\n signer: Signer;\n authenticator: Authenticator;\n overrides?: DeepPartial<UnsignedTransaction<RuntimeCall>>;\n },\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const authenticator =\n params.authenticator === \"solanaAuto\"\n ? this.getAutoAuthenticator(params.signer)\n : params.authenticator;\n\n // Dispatch based on authenticator\n switch (authenticator) {\n case \"standard\":\n return this.inner.call(\n runtimeCall,\n {\n signer: params.signer,\n overrides: params.overrides,\n },\n options,\n );\n case \"solanaSimple\": {\n const unsignedTx = await this.buildUnsignedTransaction(\n runtimeCall,\n params.overrides,\n );\n return this.signWithSolanaSimpleAndSubmit(unsignedTx, params.signer);\n }\n case \"solana\": {\n const unsignedTx = await this.buildUnsignedTransaction(\n runtimeCall,\n params.overrides,\n );\n return this.signWithSolanaSpecAndSubmit(unsignedTx, params.signer);\n }\n default:\n throw new Error(`Unsupported authenticator: ${authenticator}`);\n }\n }\n\n /**\n * Signs and submits a transaction with the specified authenticator.\n *\n * @param unsignedTx - The unsigned transaction to sign and submit\n * @param params - Parameters including signer and authenticator type\n * @param options - Optional request options\n * @returns The transaction result\n */\n async signAndSubmitTransaction(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n params: { signer: Signer; authenticator: Authenticator },\n options?: SovereignClient.RequestOptions,\n ): Promise<TransactionResult<Transaction<RuntimeCall>>> {\n const authenticator =\n params.authenticator === \"solanaAuto\"\n ? this.getAutoAuthenticator(params.signer)\n : params.authenticator;\n\n switch (authenticator) {\n case \"standard\":\n return this.inner.signAndSubmitTransaction(\n unsignedTx,\n {\n signer: params.signer,\n },\n options,\n );\n case \"solanaSimple\":\n return this.signWithSolanaSimpleAndSubmit(unsignedTx, params.signer);\n case \"solana\":\n return this.signWithSolanaSpecAndSubmit(unsignedTx, params.signer);\n default:\n throw new Error(`Unsupported authenticator: ${authenticator}`);\n }\n }\n\n /**\n * Creates V1 JSON bytes for a multisig transaction, including multisig_id and version.\n * The resulting JSON is what each signer signs directly (no discriminator prefix).\n */\n private async createMultisigJsonBytes(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n multisigAddress: Uint8Array,\n ): Promise<Uint8Array> {\n const serializer = await this.inner.serializer();\n const schema = serializer.schema;\n const chainName = schema.chain_data.chain_name || \"\";\n\n const solanaUnsignedTx: SolanaOffchainUnsignedTransactionV1<RuntimeCall> = {\n runtime_call: unsignedTx.runtime_call,\n uniqueness: unsignedTx.uniqueness,\n details: unsignedTx.details,\n chain_name: chainName,\n // Hardcoded to base58 encoding, only correct for rollups using Base58Address as their\n // primary address type. Will be replaced with rollup-aware address formatting once the\n // SDK supports flexible address encoding (see #2673).\n multisig_id: bs58.encode(multisigAddress),\n version: 1,\n };\n\n return new TextEncoder().encode(JSON.stringify(solanaUnsignedTx));\n }\n\n /**\n * Creates the preamble+JSON bytes signed by every signer in a spec-compliant multisig flow.\n */\n private async createSpecCompliantMultisigSignedMessage(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n multisigAddress: Uint8Array,\n multisigPubkeys: Uint8Array[],\n ): Promise<Uint8Array> {\n const jsonBytes = await this.createMultisigJsonBytes(\n unsignedTx,\n multisigAddress,\n );\n const chainHash = await this.inner.chainHash();\n const preamble = createSolanaPreamble(\n multisigPubkeys,\n chainHash,\n jsonBytes.length,\n );\n\n return this.combinePreambleAndMessage(preamble, jsonBytes);\n }\n\n /**\n * Signs an unsigned transaction using Solana offchain simple multisig signing.\n */\n private async signForSolanaSimpleMultisig(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n signer: Signer,\n multisigAddress: Uint8Array,\n multisigPubkeys: Uint8Array[],\n ): Promise<Transaction<RuntimeCall>> {\n const pubkey = await signer.publicKey();\n const signerPubkeyHex = bytesToHex(pubkey);\n const multisigPubkeyHexes = multisigPubkeys.map(bytesToHex);\n\n if (!multisigPubkeyHexes.includes(signerPubkeyHex)) {\n throw new Error(\n `Signer public key ${signerPubkeyHex} is not present in multisigPubkeys`,\n );\n }\n\n const jsonBytes = await this.createMultisigJsonBytes(\n unsignedTx,\n multisigAddress,\n );\n\n const signature = await signer.sign(jsonBytes);\n\n return this.typeBuilder.transaction({\n unsignedTx,\n sender: pubkey,\n signature,\n rollup: this.inner,\n });\n }\n\n /**\n * Signs an unsigned transaction using the spec-compliant multisig preamble.\n */\n private async signForSolanaSpecMultisig(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n signer: Signer,\n multisigAddress: Uint8Array,\n multisigPubkeys: Uint8Array[],\n ): Promise<Transaction<RuntimeCall>> {\n const pubkey = await signer.publicKey();\n const signerPubkeyHex = bytesToHex(pubkey);\n const multisigPubkeyHexes = multisigPubkeys.map(bytesToHex);\n\n if (!multisigPubkeyHexes.includes(signerPubkeyHex)) {\n throw new Error(\n `Signer public key ${signerPubkeyHex} is not present in multisigPubkeys`,\n );\n }\n\n const signedMessageWithPreamble =\n await this.createSpecCompliantMultisigSignedMessage(\n unsignedTx,\n multisigAddress,\n multisigPubkeys,\n );\n const signature = await signer.sign(signedMessageWithPreamble);\n\n return this.typeBuilder.transaction({\n unsignedTx,\n sender: pubkey,\n signature,\n rollup: this.inner,\n });\n }\n\n /**\n * Signs an unsigned transaction for use in a Solana offchain multisig.\n *\n * `authenticator: \"standard\"` delegates directly to the wrapped standard rollup.\n * `authenticator: \"solanaSimple\"` signs the V1 JSON payload directly.\n * `authenticator: \"solana\"` signs the spec-compliant preamble+JSON bytes.\n * Solana multisig authenticators treat `multisigPubkeys` as an unordered set and\n * canonicalize it before signing.\n */\n async signTransactionForMultisig(\n unsignedTx: UnsignedTransaction<RuntimeCall>,\n params: SolanaMultisigSignParams,\n ): Promise<Transaction<RuntimeCall>> {\n switch (params.authenticator) {\n case \"standard\":\n return this.inner.signTransaction(unsignedTx, params.signer);\n case \"solanaSimple\":\n return this.signForSolanaSimpleMultisig(\n unsignedTx,\n params.signer,\n params.multisigAddress,\n this.canonicalizeMultisigPubkeys(params.multisigPubkeys),\n );\n case \"solana\":\n return this.signForSolanaSpecMultisig(\n unsignedTx,\n params.signer,\n params.multisigAddress,\n this.canonicalizeMultisigPubkeys(params.multisigPubkeys),\n );\n }\n }\n\n /**\n * Builds a spec-compliant multisig envelope from a V1 transaction and ordered multisig pubkeys.\n */\n private buildSpecCompliantMultisigEnvelope(\n tx: TransactionV1<RuntimeCall>[\"V1\"],\n signedMessageWithPreamble: Uint8Array,\n multisigPubkeys: Uint8Array[],\n ): SolanaOffchainSpecCompliantMultisigMessage {\n const multisigPubkeyHexes = multisigPubkeys.map(bytesToHex);\n const indexByPubkey = new Map<string, number>();\n\n multisigPubkeyHexes.forEach((pubkeyHex, index) => {\n indexByPubkey.set(pubkeyHex, index);\n });\n\n const accountedPubkeys = new Set<string>();\n const signaturesByIndex = new Map<number, Uint8Array>();\n let signerBitfield = 0;\n\n for (const signer of tx.signatures) {\n const signerIndex = indexByPubkey.get(signer.pub_key);\n if (signerIndex === undefined) {\n throw new Error(\n `Signed pubkey ${signer.pub_key} is not present in multisigPubkeys`,\n );\n }\n if (accountedPubkeys.has(signer.pub_key)) {\n throw new Error(\n `Duplicate signed pubkey in multisig transaction: ${signer.pub_key}`,\n );\n }\n\n accountedPubkeys.add(signer.pub_key);\n signaturesByIndex.set(signerIndex, hexToBytes(signer.signature));\n signerBitfield = (signerBitfield | (1 << signerIndex)) >>> 0;\n }\n\n for (const unusedPubkey of tx.unused_pub_keys) {\n if (!indexByPubkey.has(unusedPubkey)) {\n throw new Error(\n `Unused pubkey ${unusedPubkey} is not present in multisigPubkeys`,\n );\n }\n if (accountedPubkeys.has(unusedPubkey)) {\n throw new Error(\n `Duplicate pubkey in multisig transaction payload: ${unusedPubkey}`,\n );\n }\n\n accountedPubkeys.add(unusedPubkey);\n }\n\n if (accountedPubkeys.size !== multisigPubkeys.length) {\n throw new Error(\n \"multisigPubkeys must contain every signer and unused pubkey exactly once\",\n );\n }\n\n const orderedSignatures = Array.from(signaturesByIndex.entries())\n .sort(([leftIndex], [rightIndex]) => leftIndex - rightIndex)\n .map(([, signature]) => signature);\n\n return {\n signed_message_with_preamble: signedMessageWithPreamble,\n signatures: orderedSignatures,\n signer_bitfield: signerBitfield,\n min_signers: tx.min_signers,\n };\n }\n\n /**\n * Submits a multisig transaction using the Solana offchain simple multisig format.\n *\n * Accepts the V1 transaction produced by `MultisigTransaction.asTransaction()`.\n * `authenticator: \"standard\"` delegates directly to the wrapped standard rollup.\n * Solana authenticators rebuild the appropriate Solana multisig envelope and\n * submit it to the Solana offchain endpoint.\n */\n async submitMultisigTransaction(\n multisigTx: TransactionV1<RuntimeCall>,\n params: SolanaMultisigSubmitParams,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n const { V1: tx } = multisigTx;\n\n const unsignedTx: UnsignedTransaction<RuntimeCall> = {\n runtime_call: tx.runtime_call,\n uniqueness: tx.uniqueness,\n details: tx.details,\n };\n\n switch (params.authenticator) {\n case \"standard\":\n return this.inner.submitTransaction(\n multisigTx as StandardRollupSpec<RuntimeCall>[\"Transaction\"],\n );\n case \"solanaSimple\": {\n this.canonicalizeMultisigPubkeys(params.multisigPubkeys);\n\n const jsonBytes = await this.createMultisigJsonBytes(\n unsignedTx,\n params.multisigAddress,\n );\n const wireBytes = new Uint8Array(1 + jsonBytes.length);\n wireBytes[0] = MULTISIG_SIMPLE_DISCRIMINATOR;\n wireBytes.set(jsonBytes, 1);\n\n const chainHash = await this.inner.chainHash();\n const serialized = this.serializeSolanaMultisigMessage({\n wire_bytes: wireBytes,\n chain_hash: chainHash,\n signatures: tx.signatures.map((s) => ({\n signature: hexToBytes(s.signature),\n pub_key: hexToBytes(s.pub_key),\n })),\n unused_pub_keys: tx.unused_pub_keys.map((pk) => hexToBytes(pk)),\n min_signers: tx.min_signers,\n });\n\n return this.submitSerializedMessage(serialized);\n }\n case \"solana\": {\n const multisigPubkeys = this.canonicalizeMultisigPubkeys(\n params.multisigPubkeys,\n );\n const signedMessageWithPreamble =\n await this.createSpecCompliantMultisigSignedMessage(\n unsignedTx,\n params.multisigAddress,\n multisigPubkeys,\n );\n const message = this.buildSpecCompliantMultisigEnvelope(\n tx,\n signedMessageWithPreamble,\n multisigPubkeys,\n );\n\n return this.submitSolanaSpecMultisigMessage(message);\n }\n }\n }\n\n /**\n * Submits a standard transaction.\n */\n async submitTransaction(\n transaction: StandardRollupSpec<RuntimeCall>[\"Transaction\"],\n authenticator: \"standard\",\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse>;\n\n /**\n * Submits a Solana offchain message.\n */\n async submitTransaction(\n transaction: SolanaOffchainSimpleMessage,\n authenticator: \"solanaSimple\",\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse>;\n\n /**\n * Submits a Solana spec-compliant message.\n */\n async submitTransaction(\n transaction: SolanaOffchainSpecCompliantMessage,\n authenticator: \"solana\",\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse>;\n\n /**\n * Submits a transaction with the specified authenticator.\n *\n * @param transaction - Either a standard transaction or a Solana message\n * @param authenticator - The authenticator type to use\n * @param options - Optional request options\n * @returns The transaction response\n */\n async submitTransaction(\n transaction:\n | StandardRollupSpec<RuntimeCall>[\"Transaction\"]\n | SolanaOffchainSimpleMessage\n | SolanaOffchainSpecCompliantMessage,\n authenticator: Authenticator,\n options?: SovereignClient.RequestOptions,\n ): Promise<SovereignClient.Sequencer.TxCreateResponse> {\n switch (authenticator) {\n case \"standard\":\n return this.inner.submitTransaction(\n transaction as StandardRollupSpec<RuntimeCall>[\"Transaction\"],\n options,\n );\n case \"solanaSimple\": {\n // For Solana simple, we expect a SolanaOffchainSimpleMessage\n const solanaMessage = transaction as SolanaOffchainSimpleMessage;\n return await this.submitSolanaMessage(solanaMessage);\n }\n case \"solana\": {\n // For Solana spec-compliant, we expect a SolanaOffchainSpecCompliantMessage\n const solanaMessage = transaction as SolanaOffchainSpecCompliantMessage;\n return await this.submitSolanaSpecMessage(solanaMessage);\n }\n default:\n throw new Error(`Unsupported authenticator: ${authenticator}`);\n }\n }\n\n async simulate(\n runtimeMessage: RuntimeCall,\n params: Parameters<StandardRollup<RuntimeCall>[\"simulate\"]>[1],\n ) {\n return this.inner.simulate(runtimeMessage, params);\n }\n\n async dedup(address: Uint8Array) {\n return this.inner.dedup(address);\n }\n\n async serializer() {\n return this.inner.serializer();\n }\n\n async chainHash() {\n return this.inner.chainHash();\n }\n\n /**\n * Pre-fetches the rollup schema, populating the serializer and chain hash caches.\n * Call this during initialization to avoid the latency of lazy-loading on the first transaction.\n */\n hydrate(): Promise<void> {\n return this.inner.hydrate();\n }\n\n async healthcheck(timeout?: number) {\n return this.inner.healthcheck(timeout);\n }\n\n subscribe<T extends keyof SubscriptionToCallbackMap>(\n type: T,\n callback: SubscriptionToCallbackMap[T],\n ): Subscription {\n return this.inner.subscribe(type, callback);\n }\n\n get context() {\n return this.inner.context;\n }\n\n get ledger() {\n return this.inner.ledger;\n }\n\n get sequencer() {\n return this.inner.sequencer;\n }\n\n get rollup() {\n return this.inner.rollup;\n }\n\n get http() {\n return this.inner.http;\n }\n\n /**\n * Helper method to serialize a SolanaOffchainSimpleMessage using borsh encoding.\n */\n private serializeSolanaMessage(\n message: SolanaOffchainSimpleMessage,\n ): Uint8Array {\n // Validate message field lengths\n if (message.chain_hash.length !== CHAIN_HASH_SIZE) {\n throw new Error(\n `Invalid chain hash length: expected ${CHAIN_HASH_SIZE} bytes, got ${message.chain_hash.length}`,\n );\n }\n\n if (message.pubkey.length !== PUBKEY_SIZE) {\n throw new Error(\n `Invalid public key length: expected ${PUBKEY_SIZE} bytes, got ${message.pubkey.length}`,\n );\n }\n\n if (message.signature.length !== SIGNATURE_SIZE) {\n throw new Error(\n `Invalid signature length: expected ${SIGNATURE_SIZE} bytes, got ${message.signature.length}`,\n );\n }\n\n // Calculate total size using constants\n const totalSize =\n VEC_LENGTH_PREFIX_SIZE +\n message.signed_message.length +\n CHAIN_HASH_SIZE +\n PUBKEY_SIZE +\n SIGNATURE_SIZE;\n\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // Serialize Vec<u8> with length prefix (little-endian u32)\n const view = new DataView(buffer.buffer);\n view.setUint32(offset, message.signed_message.length, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n buffer.set(message.signed_message, offset);\n offset += message.signed_message.length;\n\n // Serialize chain_hash [u8; 32]\n buffer.set(message.chain_hash, offset);\n offset += CHAIN_HASH_SIZE;\n\n // Serialize pubkey [u8; 32]\n buffer.set(message.pubkey, offset);\n offset += PUBKEY_SIZE;\n\n // Serialize signature [u8; 64]\n buffer.set(message.signature, offset);\n\n return buffer;\n }\n\n /**\n * Helper method to serialize a SolanaOffchainSpecCompliantMessage using borsh encoding.\n */\n private serializeSolanaSpecMessage(\n message: SolanaOffchainSpecCompliantMessage,\n ): Uint8Array {\n // Validate signature length\n if (message.signature.length !== SIGNATURE_SIZE) {\n throw new Error(\n `Invalid signature length: expected ${SIGNATURE_SIZE} bytes, got ${message.signature.length}`,\n );\n }\n\n // Calculate total size\n const totalSize =\n VEC_LENGTH_PREFIX_SIZE +\n message.signed_message_with_preamble.length +\n SIGNATURE_SIZE;\n\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // Serialize Vec<u8> with length prefix (little-endian u32)\n const view = new DataView(buffer.buffer);\n view.setUint32(offset, message.signed_message_with_preamble.length, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n buffer.set(message.signed_message_with_preamble, offset);\n offset += message.signed_message_with_preamble.length;\n\n // Serialize signature [u8; 64]\n buffer.set(message.signature, offset);\n\n return buffer;\n }\n\n /**\n * Serializes a SolanaOffchainSimpleMultisigMessage using borsh encoding.\n * Layout matches the Rust struct:\n * [u32 LE: wire_bytes.len][wire_bytes]\n * [32 bytes: chain_hash]\n * [u32 LE: signatures.len]\n * for each: [64 bytes: signature][32 bytes: pub_key]\n * [u32 LE: unused_pub_keys.len]\n * for each: [32 bytes: pub_key]\n * [u8: min_signers]\n */\n private serializeSolanaMultisigMessage(\n message: SolanaOffchainSimpleMultisigMessage,\n ): Uint8Array {\n if (message.chain_hash.length !== CHAIN_HASH_SIZE) {\n throw new Error(\n `Invalid chain hash length: expected ${CHAIN_HASH_SIZE} bytes, got ${message.chain_hash.length}`,\n );\n }\n\n const sigCount = message.signatures.length;\n const unusedCount = message.unused_pub_keys.length;\n\n const totalSize =\n VEC_LENGTH_PREFIX_SIZE +\n message.wire_bytes.length +\n CHAIN_HASH_SIZE +\n VEC_LENGTH_PREFIX_SIZE +\n sigCount * (SIGNATURE_SIZE + PUBKEY_SIZE) +\n VEC_LENGTH_PREFIX_SIZE +\n unusedCount * PUBKEY_SIZE +\n 1; // min_signers u8\n\n const buffer = new Uint8Array(totalSize);\n const view = new DataView(buffer.buffer);\n let offset = 0;\n\n // wire_bytes: Vec<u8>\n view.setUint32(offset, message.wire_bytes.length, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n buffer.set(message.wire_bytes, offset);\n offset += message.wire_bytes.length;\n\n // chain_hash: [u8; 32]\n buffer.set(message.chain_hash, offset);\n offset += CHAIN_HASH_SIZE;\n\n // signatures: Vec<PubKeyAndSignature>\n view.setUint32(offset, sigCount, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n for (const sig of message.signatures) {\n if (sig.signature.length !== SIGNATURE_SIZE) {\n throw new Error(\n `Invalid signature length: expected ${SIGNATURE_SIZE} bytes, got ${sig.signature.length}`,\n );\n }\n if (sig.pub_key.length !== PUBKEY_SIZE) {\n throw new Error(\n `Invalid public key length: expected ${PUBKEY_SIZE} bytes, got ${sig.pub_key.length}`,\n );\n }\n buffer.set(sig.signature, offset);\n offset += SIGNATURE_SIZE;\n buffer.set(sig.pub_key, offset);\n offset += PUBKEY_SIZE;\n }\n\n // unused_pub_keys: Vec<PublicKey>\n view.setUint32(offset, unusedCount, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n for (const pk of message.unused_pub_keys) {\n if (pk.length !== PUBKEY_SIZE) {\n throw new Error(\n `Invalid public key length: expected ${PUBKEY_SIZE} bytes, got ${pk.length}`,\n );\n }\n buffer.set(pk, offset);\n offset += PUBKEY_SIZE;\n }\n\n // min_signers: u8\n buffer[offset] = message.min_signers;\n\n return buffer;\n }\n\n /**\n * Serializes a SolanaOffchainSpecCompliantMultisigMessage using borsh encoding.\n * Layout matches the Rust struct:\n * [u32 LE: signed_message_with_preamble.len][signed_message_with_preamble]\n * [u32 LE: signatures.len]\n * for each: [64 bytes: signature]\n * [u32 LE: signer_bitfield]\n * [u8: min_signers]\n */\n private serializeSolanaSpecMultisigMessage(\n message: SolanaOffchainSpecCompliantMultisigMessage,\n ): Uint8Array {\n const sigCount = message.signatures.length;\n\n const totalSize =\n VEC_LENGTH_PREFIX_SIZE +\n message.signed_message_with_preamble.length +\n VEC_LENGTH_PREFIX_SIZE +\n sigCount * SIGNATURE_SIZE +\n 4 +\n 1;\n\n const buffer = new Uint8Array(totalSize);\n const view = new DataView(buffer.buffer);\n let offset = 0;\n\n view.setUint32(offset, message.signed_message_with_preamble.length, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n buffer.set(message.signed_message_with_preamble, offset);\n offset += message.signed_message_with_preamble.length;\n\n view.setUint32(offset, sigCount, true);\n offset += VEC_LENGTH_PREFIX_SIZE;\n for (const signature of message.signatures) {\n if (signature.length !== SIGNATURE_SIZE) {\n throw new Error(\n `Invalid signature length: expected ${SIGNATURE_SIZE} bytes, got ${signature.length}`,\n );\n }\n\n buffer.set(signature, offset);\n offset += SIGNATURE_SIZE;\n }\n\n view.setUint32(offset, message.signer_bitfield >>> 0, true);\n offset += 4;\n\n buffer[offset] = message.min_signers;\n\n return buffer;\n }\n}\n\nexport async function createSolanaSignableRollup<RuntimeCall>(\n rollupConfig?: Partial<RollupConfig<DeepPartial<StandardRollupContext>>>,\n solanaEndpoint = \"/sequencer/accept-solana-offchain-tx\",\n) {\n // Create a standard rollup first\n const standardRollup = await createStandardRollup<RuntimeCall>(rollupConfig);\n\n // Wrap it with SolanaSignableRollup\n return new SolanaSignableRollup<RuntimeCall>(standardRollup, solanaEndpoint);\n}\n"],"mappings":"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","names":["SovereignClient","import_utils","IsoWebSocket","subscription","SovereignClient","import_client","import_utils","SovereignClient","import_utils","import_js_base64","bs58","SovereignClient"]}
|