FRE-600: Fix code review blockers

- Consolidated duplicate UndoManagers to single instance
- Fixed connection promise to only resolve on 'connected' status
- Fixed WebSocketProvider import (WebsocketProvider)
- Added proper doc.destroy() cleanup
- Renamed isPresenceInitialized property to avoid conflict

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-25 00:08:01 -04:00
parent 65b552bb08
commit 7c684a42cc
48450 changed files with 5679671 additions and 383 deletions

View File

@@ -0,0 +1,89 @@
import {
createSignInMessage,
createSignInMessageText,
deriveSignInMessage,
deriveSignInMessageText,
parseSignInMessage,
parseSignInMessageText,
verifySignIn,
} from '../signIn.js';
const signInMessageTests = {
'with `domain` and `address`': {
parsed: {
domain: 'solana.com',
address: 'A',
},
text: 'solana.com wants you to sign in with your Solana account:\nA',
},
'with `statement`': {
parsed: {
domain: 'solana.com',
address: 'A',
statement: 'S',
},
text: 'solana.com wants you to sign in with your Solana account:\nA\n\nS',
},
'with multi-line `statement`': {
parsed: {
domain: 'solana.com',
address: 'A',
statement: 'S\n\nS',
},
text: 'solana.com wants you to sign in with your Solana account:\nA\n\nS\n\nS',
},
'with fields': {
parsed: {
domain: 'solana.com',
address: 'A',
uri: 'https://solana.com',
},
text: 'solana.com wants you to sign in with your Solana account:\nA\n\nURI: https://solana.com',
},
'with `statement` and fields': {
parsed: {
domain: 'solana.com',
address: 'A',
statement: 'S',
uri: 'https://solana.com',
},
text: 'solana.com wants you to sign in with your Solana account:\nA\n\nS\n\nURI: https://solana.com',
},
'with multi-line `statement` and fields': {
parsed: {
domain: 'solana.com',
address: 'A',
statement: 'S\n\nS',
uri: 'https://solana.com',
},
text: 'solana.com wants you to sign in with your Solana account:\nA\n\nS\n\nS\n\nURI: https://solana.com',
},
};
describe.skip('verifySignIn()', () => {});
describe.skip('deriveSignInMessage()', () => {});
describe.skip('deriveSignInMessageText()', () => {});
describe.skip('parseSignInMessage()', () => {});
describe('parseSignInMessageText()', () => {
for (const [name, test] of Object.entries(signInMessageTests)) {
it(name, () => {
const parsed = parseSignInMessageText(test.text);
expect(parsed).toEqual(test.parsed);
});
}
});
describe.skip('createSignInMessage()', () => {});
describe('createSignInMessageText()', () => {
for (const [name, test] of Object.entries(signInMessageTests)) {
it(name, () => {
const text = createSignInMessageText(test.parsed);
expect(text).toBe(test.text);
});
}
});

View File

@@ -0,0 +1,27 @@
import type { SolanaTransactionCommitment } from '@solana/wallet-standard-features';
// Copied from @solana/web3.js
type Commitment = 'processed' | 'confirmed' | 'finalized' | 'recent' | 'single' | 'singleGossip' | 'root' | 'max';
/**
* TODO: docs
*/
export function getCommitment(commitment?: Commitment): SolanaTransactionCommitment | undefined {
switch (commitment) {
case 'processed':
case 'confirmed':
case 'finalized':
case undefined:
return commitment;
case 'recent':
return 'processed';
case 'single':
case 'singleGossip':
return 'confirmed';
case 'max':
case 'root':
return 'finalized';
default:
return undefined;
}
}

View File

@@ -0,0 +1,39 @@
import type { SolanaChain } from '@solana/wallet-standard-chains';
import {
SOLANA_DEVNET_CHAIN,
SOLANA_LOCALNET_CHAIN,
SOLANA_MAINNET_CHAIN,
SOLANA_TESTNET_CHAIN,
} from '@solana/wallet-standard-chains';
/** TODO: docs */
export const MAINNET_ENDPOINT = 'https://api.mainnet-beta.solana.com';
/** TODO: docs */
export const DEVNET_ENDPOINT = 'https://api.devnet.solana.com';
/** TODO: docs */
export const TESTNET_ENDPOINT = 'https://api.testnet.solana.com';
/** TODO: docs */
export const LOCALNET_ENDPOINT = 'http://localhost:8899';
/**
* TODO: docs
*/
export function getChainForEndpoint(endpoint: string): SolanaChain {
if (endpoint.includes(MAINNET_ENDPOINT)) return SOLANA_MAINNET_CHAIN;
if (/\bdevnet\b/i.test(endpoint)) return SOLANA_DEVNET_CHAIN;
if (/\btestnet\b/i.test(endpoint)) return SOLANA_TESTNET_CHAIN;
if (/\blocalhost\b/i.test(endpoint) || /\b127\.0\.0\.1\b/.test(endpoint)) return SOLANA_LOCALNET_CHAIN;
return SOLANA_MAINNET_CHAIN;
}
/**
* TODO: docs
*/
export function getEndpointForChain(chain: SolanaChain, endpoint?: string): string {
if (endpoint) return endpoint;
if (chain === SOLANA_MAINNET_CHAIN) return MAINNET_ENDPOINT;
if (chain === SOLANA_DEVNET_CHAIN) return DEVNET_ENDPOINT;
if (chain === SOLANA_TESTNET_CHAIN) return TESTNET_ENDPOINT;
if (chain === SOLANA_LOCALNET_CHAIN) return LOCALNET_ENDPOINT;
return MAINNET_ENDPOINT;
}

View File

@@ -0,0 +1,4 @@
export * from './commitment.js';
export * from './endpoint.js';
export * from './signIn.js';
export * from './signMessage.js';

185
node_modules/@solana/wallet-standard-util/src/signIn.ts generated vendored Normal file
View File

@@ -0,0 +1,185 @@
import type { SolanaSignInInput, SolanaSignInOutput } from '@solana/wallet-standard-features';
import { verifyMessageSignature } from './signMessage.js';
import { arraysEqual } from './util.js';
/**
* TODO: docs
*/
export function verifySignIn(input: SolanaSignInInput, output: SolanaSignInOutput): boolean {
const {
signedMessage,
signature,
account: { publicKey },
} = output;
const message = deriveSignInMessage(input, output);
return (
!!message && verifyMessageSignature({ message, signedMessage, signature, publicKey: publicKey as Uint8Array })
);
}
/**
* TODO: docs
*/
export function deriveSignInMessage(input: SolanaSignInInput, output: SolanaSignInOutput): Uint8Array | null {
const text = deriveSignInMessageText(input, output);
if (!text) return null;
return new TextEncoder().encode(text);
}
/**
* TODO: docs
*/
export function deriveSignInMessageText(input: SolanaSignInInput, output: SolanaSignInOutput): string | null {
const parsed = parseSignInMessage(output.signedMessage);
if (!parsed) return null;
if (input.domain && input.domain !== parsed.domain) return null;
if (input.address && input.address !== parsed.address) return null;
if (input.statement !== parsed.statement) return null;
if (input.uri !== parsed.uri) return null;
if (input.version !== parsed.version) return null;
if (input.chainId !== parsed.chainId) return null;
if (input.nonce !== parsed.nonce) return null;
if (input.issuedAt !== parsed.issuedAt) return null;
if (input.expirationTime !== parsed.expirationTime) return null;
if (input.notBefore !== parsed.notBefore) return null;
if (input.requestId !== parsed.requestId) return null;
if (input.resources) {
if (!parsed.resources) return null;
if (!arraysEqual(input.resources, parsed.resources)) return null;
} else if (parsed.resources) return null;
return createSignInMessageText(parsed);
}
/**
* TODO: docs
*/
export type SolanaSignInInputWithRequiredFields = SolanaSignInInput &
Required<Pick<SolanaSignInInput, 'domain' | 'address'>>;
/**
* TODO: docs
*/
export function parseSignInMessage(message: Uint8Array): SolanaSignInInputWithRequiredFields | null {
const text = new TextDecoder().decode(message);
return parseSignInMessageText(text);
}
// TODO: implement https://github.com/solana-labs/solana/blob/master/docs/src/proposals/off-chain-message-signing.md
const DOMAIN = '(?<domain>[^\\n]+?) wants you to sign in with your Solana account:\\n';
const ADDRESS = '(?<address>[^\\n]+)(?:\\n|$)';
const STATEMENT = '(?:\\n(?<statement>[\\S\\s]*?)(?:\\n|$))??';
const URI = '(?:\\nURI: (?<uri>[^\\n]+))?';
const VERSION = '(?:\\nVersion: (?<version>[^\\n]+))?';
const CHAIN_ID = '(?:\\nChain ID: (?<chainId>[^\\n]+))?';
const NONCE = '(?:\\nNonce: (?<nonce>[^\\n]+))?';
const ISSUED_AT = '(?:\\nIssued At: (?<issuedAt>[^\\n]+))?';
const EXPIRATION_TIME = '(?:\\nExpiration Time: (?<expirationTime>[^\\n]+))?';
const NOT_BEFORE = '(?:\\nNot Before: (?<notBefore>[^\\n]+))?';
const REQUEST_ID = '(?:\\nRequest ID: (?<requestId>[^\\n]+))?';
const RESOURCES = '(?:\\nResources:(?<resources>(?:\\n- [^\\n]+)*))?';
const FIELDS = `${URI}${VERSION}${CHAIN_ID}${NONCE}${ISSUED_AT}${EXPIRATION_TIME}${NOT_BEFORE}${REQUEST_ID}${RESOURCES}`;
const MESSAGE = new RegExp(`^${DOMAIN}${ADDRESS}${STATEMENT}${FIELDS}\\n*$`);
/**
* TODO: docs
*/
export function parseSignInMessageText(text: string): SolanaSignInInputWithRequiredFields | null {
const match = MESSAGE.exec(text);
if (!match) return null;
const groups = match.groups;
if (!groups) return null;
return {
domain: groups.domain!,
address: groups.address!,
statement: groups.statement,
uri: groups.uri,
version: groups.version,
nonce: groups.nonce,
chainId: groups.chainId,
issuedAt: groups.issuedAt,
expirationTime: groups.expirationTime,
notBefore: groups.notBefore,
requestId: groups.requestId,
resources: groups.resources?.split('\n- ').slice(1),
};
}
/**
* TODO: docs
*/
export function createSignInMessage(input: SolanaSignInInputWithRequiredFields): Uint8Array {
const text = createSignInMessageText(input);
return new TextEncoder().encode(text);
}
/**
* TODO: docs
*/
export function createSignInMessageText(input: SolanaSignInInputWithRequiredFields): string {
// ${domain} wants you to sign in with your Solana account:
// ${address}
//
// ${statement}
//
// URI: ${uri}
// Version: ${version}
// Chain ID: ${chain}
// Nonce: ${nonce}
// Issued At: ${issued-at}
// Expiration Time: ${expiration-time}
// Not Before: ${not-before}
// Request ID: ${request-id}
// Resources:
// - ${resources[0]}
// - ${resources[1]}
// ...
// - ${resources[n]}
let message = `${input.domain} wants you to sign in with your Solana account:\n`;
message += `${input.address}`;
if (input.statement) {
message += `\n\n${input.statement}`;
}
const fields: string[] = [];
if (input.uri) {
fields.push(`URI: ${input.uri}`);
}
if (input.version) {
fields.push(`Version: ${input.version}`);
}
if (input.chainId) {
fields.push(`Chain ID: ${input.chainId}`);
}
if (input.nonce) {
fields.push(`Nonce: ${input.nonce}`);
}
if (input.issuedAt) {
fields.push(`Issued At: ${input.issuedAt}`);
}
if (input.expirationTime) {
fields.push(`Expiration Time: ${input.expirationTime}`);
}
if (input.notBefore) {
fields.push(`Not Before: ${input.notBefore}`);
}
if (input.requestId) {
fields.push(`Request ID: ${input.requestId}`);
}
if (input.resources) {
fields.push(`Resources:`);
for (const resource of input.resources) {
fields.push(`- ${resource}`);
}
}
if (fields.length) {
message += `\n\n${fields.join('\n')}`;
}
return message;
}

View File

@@ -0,0 +1,33 @@
import { ed25519 } from '@noble/curves/ed25519';
import type { SolanaSignMessageInput, SolanaSignMessageOutput } from '@solana/wallet-standard-features';
import { bytesEqual } from './util.js';
/**
* TODO: docs
*/
export function verifyMessageSignature({
message,
signedMessage,
signature,
publicKey,
}: {
message: Uint8Array;
signedMessage: Uint8Array;
signature: Uint8Array;
publicKey: Uint8Array;
}): boolean {
// TODO: implement https://github.com/solana-labs/solana/blob/master/docs/src/proposals/off-chain-message-signing.md
return bytesEqual(message, signedMessage) && ed25519.verify(signature, signedMessage, publicKey);
}
/**
* TODO: docs
*/
export function verifySignMessage(input: SolanaSignMessageInput, output: SolanaSignMessageOutput): boolean {
const {
message,
account: { publicKey },
} = input;
const { signedMessage, signature } = output;
return verifyMessageSignature({ message, signedMessage, signature, publicKey: publicKey as Uint8Array });
}

54
node_modules/@solana/wallet-standard-util/src/util.ts generated vendored Normal file
View File

@@ -0,0 +1,54 @@
/**
* @internal
*
* Type with a numeric `length` and numerically indexed elements of a generic type `T`.
*
* For example, `Array<T>` and `Uint8Array`.
*
* @group Internal
*/
export interface Indexed<T> {
length: number;
[index: number]: T;
}
/**
* @internal
*
* Efficiently compare {@link Indexed} arrays (e.g. `Array` and `Uint8Array`).
*
* @param a An array.
* @param b Another array.
*
* @return `true` if the arrays have the same length and elements, `false` otherwise.
*
* @group Internal
*/
export function arraysEqual<T>(a: Indexed<T>, b: Indexed<T>): boolean {
if (a === b) return true;
const length = a.length;
if (length !== b.length) return false;
for (let i = 0; i < length; i++) {
if (a[i] !== b[i]) return false;
}
return true;
}
/**
* @internal
*
* Efficiently compare byte arrays, using {@link arraysEqual}.
*
* @param a A byte array.
* @param b Another byte array.
*
* @return `true` if the byte arrays have the same length and bytes, `false` otherwise.
*
* @group Internal
*/
export function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {
return arraysEqual(a, b);
}