@tuwaio/siwx-solana 1.0.0-fix-initialize-alpha.1.f397697 → 1.0.0-fix-initialize-alpha.2.ee070bd
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 +79 -9
- package/dist/index.d.ts +79 -9
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,76 @@
|
|
|
1
1
|
import { SiwxVerifyPayload, SiwxVerifyResult } from '@tuwaio/siwx-core';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Solana signer adapter for SIWX authentication.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Target input for the Solana SIWX signer.
|
|
8
|
+
* Supports Wallet Standard (`signMessages`), Web3 v2 (`modifyAndSignMessages`), and Legacy (`signMessage`) signers.
|
|
9
|
+
*/
|
|
10
|
+
interface SolanaSiwxSignerTarget {
|
|
11
|
+
address?: string;
|
|
12
|
+
publicKey?: Uint8Array | unknown;
|
|
13
|
+
signMessages?: (messages: Uint8Array[]) => Promise<{
|
|
14
|
+
signature: Uint8Array;
|
|
15
|
+
}[]>;
|
|
16
|
+
modifyAndSignMessages?: (messages: unknown[]) => Promise<{
|
|
17
|
+
signatures: Record<string, Uint8Array>;
|
|
18
|
+
}[]>;
|
|
19
|
+
signMessage?: (message: Uint8Array) => Promise<Uint8Array | {
|
|
20
|
+
signature: Uint8Array;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Creates a standard SIWX signer callback for Solana chains.
|
|
25
|
+
* Automatically adapts to Wallet Standard, Web3 v2 (gill), or legacy Solana signers.
|
|
26
|
+
*
|
|
27
|
+
* @param signer - A Solana signer object containing signing capabilities.
|
|
28
|
+
* @returns A standardized signer function accepting a message string and returning a promise with the base58 signature.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const signer = createSolanaSiwxSigner(connectedAccount);
|
|
33
|
+
* const signature = await signer("Mini-Session Login: ...");
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare function createSolanaSiwxSigner(signer: SolanaSiwxSignerTarget): (message: string) => Promise<string>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @fileoverview Solana-specific types for the @tuwaio/siwx-solana package.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Minimal Wallet Standard account interface returned by `solana:signIn`.
|
|
44
|
+
*/
|
|
45
|
+
interface SolanaSignInAccount {
|
|
46
|
+
/** Base58 encoded wallet address. */
|
|
47
|
+
address: string;
|
|
48
|
+
/** Raw public key bytes. */
|
|
49
|
+
publicKey?: Uint8Array;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Output object structure returned by Wallet Standard `solana:signIn` feature.
|
|
53
|
+
*/
|
|
54
|
+
interface SolanaSignInOutput {
|
|
55
|
+
/** Account that signed the message. */
|
|
56
|
+
account: SolanaSignInAccount;
|
|
57
|
+
/** Raw message bytes or string that was signed. */
|
|
58
|
+
signedMessage: Uint8Array | string;
|
|
59
|
+
/** Raw signature bytes or base58 string. */
|
|
60
|
+
signature: Uint8Array | string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Flexible input type for Solana SIWX verification.
|
|
64
|
+
* Accepts standard SIWX payload `{ message, signature }`,
|
|
65
|
+
* raw Uint8Array buffers, or Wallet Standard `solana:signIn` output objects.
|
|
66
|
+
*/
|
|
67
|
+
type SolanaVerifyPayload = SiwxVerifyPayload | {
|
|
68
|
+
message: string | Uint8Array;
|
|
69
|
+
signature: string | Uint8Array;
|
|
70
|
+
} | SolanaSignInOutput | {
|
|
71
|
+
output: SolanaSignInOutput;
|
|
72
|
+
};
|
|
73
|
+
|
|
3
74
|
/**
|
|
4
75
|
* @fileoverview Solana signature verification for CAIP-122 messages.
|
|
5
76
|
* Uses ed25519 cryptography via the native SubtleCrypto API (Node.js & browser compatible).
|
|
@@ -7,25 +78,24 @@ import { SiwxVerifyPayload, SiwxVerifyResult } from '@tuwaio/siwx-core';
|
|
|
7
78
|
|
|
8
79
|
/**
|
|
9
80
|
* Verifies a Solana CAIP-122 signature using ed25519 cryptography.
|
|
10
|
-
* Compatible with all Wallet Standard wallets (Phantom, Solflare, Backpack, etc.)
|
|
81
|
+
* Compatible with all Wallet Standard wallets (Phantom, Solflare, Backpack, etc.)
|
|
82
|
+
* and accepts raw `solana:signIn` output objects as well as string payloads.
|
|
11
83
|
*
|
|
12
84
|
* Uses the native `SubtleCrypto` API for ed25519 verification, ensuring
|
|
13
|
-
* compatibility with both Node.js (v19+) and browser environments.
|
|
85
|
+
* compatibility with both Node.js (v19+) and browser environments without polyfills.
|
|
14
86
|
*
|
|
15
|
-
* @param payload -
|
|
87
|
+
* @param payload - Standard SIWX payload, Uint8Array buffers, or Wallet Standard `solana:signIn` output.
|
|
88
|
+
* @param options - Verification options.
|
|
16
89
|
* @returns A `SiwxVerifyResult` with `success: true` and parsed data, or an error result.
|
|
17
90
|
*
|
|
18
91
|
* @example
|
|
19
92
|
* ```ts
|
|
20
|
-
* const result = await verifyEd25519(
|
|
21
|
-
* message: rawCaip122Message,
|
|
22
|
-
* signature: base58EncodedSignature,
|
|
23
|
-
* });
|
|
93
|
+
* const result = await verifyEd25519(solanaSignInOutput);
|
|
24
94
|
* if (result.success) console.log('Authenticated:', result.data?.address);
|
|
25
95
|
* ```
|
|
26
96
|
*/
|
|
27
|
-
declare function verifyEd25519(payload:
|
|
97
|
+
declare function verifyEd25519(payload: SolanaVerifyPayload, options?: {
|
|
28
98
|
skipExpiration?: boolean;
|
|
29
99
|
}): Promise<SiwxVerifyResult>;
|
|
30
100
|
|
|
31
|
-
export { verifyEd25519 };
|
|
101
|
+
export { type SolanaSignInAccount, type SolanaSignInOutput, type SolanaSiwxSignerTarget, type SolanaVerifyPayload, createSolanaSiwxSigner, verifyEd25519 };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,76 @@
|
|
|
1
1
|
import { SiwxVerifyPayload, SiwxVerifyResult } from '@tuwaio/siwx-core';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Solana signer adapter for SIWX authentication.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Target input for the Solana SIWX signer.
|
|
8
|
+
* Supports Wallet Standard (`signMessages`), Web3 v2 (`modifyAndSignMessages`), and Legacy (`signMessage`) signers.
|
|
9
|
+
*/
|
|
10
|
+
interface SolanaSiwxSignerTarget {
|
|
11
|
+
address?: string;
|
|
12
|
+
publicKey?: Uint8Array | unknown;
|
|
13
|
+
signMessages?: (messages: Uint8Array[]) => Promise<{
|
|
14
|
+
signature: Uint8Array;
|
|
15
|
+
}[]>;
|
|
16
|
+
modifyAndSignMessages?: (messages: unknown[]) => Promise<{
|
|
17
|
+
signatures: Record<string, Uint8Array>;
|
|
18
|
+
}[]>;
|
|
19
|
+
signMessage?: (message: Uint8Array) => Promise<Uint8Array | {
|
|
20
|
+
signature: Uint8Array;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Creates a standard SIWX signer callback for Solana chains.
|
|
25
|
+
* Automatically adapts to Wallet Standard, Web3 v2 (gill), or legacy Solana signers.
|
|
26
|
+
*
|
|
27
|
+
* @param signer - A Solana signer object containing signing capabilities.
|
|
28
|
+
* @returns A standardized signer function accepting a message string and returning a promise with the base58 signature.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const signer = createSolanaSiwxSigner(connectedAccount);
|
|
33
|
+
* const signature = await signer("Mini-Session Login: ...");
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare function createSolanaSiwxSigner(signer: SolanaSiwxSignerTarget): (message: string) => Promise<string>;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @fileoverview Solana-specific types for the @tuwaio/siwx-solana package.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Minimal Wallet Standard account interface returned by `solana:signIn`.
|
|
44
|
+
*/
|
|
45
|
+
interface SolanaSignInAccount {
|
|
46
|
+
/** Base58 encoded wallet address. */
|
|
47
|
+
address: string;
|
|
48
|
+
/** Raw public key bytes. */
|
|
49
|
+
publicKey?: Uint8Array;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Output object structure returned by Wallet Standard `solana:signIn` feature.
|
|
53
|
+
*/
|
|
54
|
+
interface SolanaSignInOutput {
|
|
55
|
+
/** Account that signed the message. */
|
|
56
|
+
account: SolanaSignInAccount;
|
|
57
|
+
/** Raw message bytes or string that was signed. */
|
|
58
|
+
signedMessage: Uint8Array | string;
|
|
59
|
+
/** Raw signature bytes or base58 string. */
|
|
60
|
+
signature: Uint8Array | string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Flexible input type for Solana SIWX verification.
|
|
64
|
+
* Accepts standard SIWX payload `{ message, signature }`,
|
|
65
|
+
* raw Uint8Array buffers, or Wallet Standard `solana:signIn` output objects.
|
|
66
|
+
*/
|
|
67
|
+
type SolanaVerifyPayload = SiwxVerifyPayload | {
|
|
68
|
+
message: string | Uint8Array;
|
|
69
|
+
signature: string | Uint8Array;
|
|
70
|
+
} | SolanaSignInOutput | {
|
|
71
|
+
output: SolanaSignInOutput;
|
|
72
|
+
};
|
|
73
|
+
|
|
3
74
|
/**
|
|
4
75
|
* @fileoverview Solana signature verification for CAIP-122 messages.
|
|
5
76
|
* Uses ed25519 cryptography via the native SubtleCrypto API (Node.js & browser compatible).
|
|
@@ -7,25 +78,24 @@ import { SiwxVerifyPayload, SiwxVerifyResult } from '@tuwaio/siwx-core';
|
|
|
7
78
|
|
|
8
79
|
/**
|
|
9
80
|
* Verifies a Solana CAIP-122 signature using ed25519 cryptography.
|
|
10
|
-
* Compatible with all Wallet Standard wallets (Phantom, Solflare, Backpack, etc.)
|
|
81
|
+
* Compatible with all Wallet Standard wallets (Phantom, Solflare, Backpack, etc.)
|
|
82
|
+
* and accepts raw `solana:signIn` output objects as well as string payloads.
|
|
11
83
|
*
|
|
12
84
|
* Uses the native `SubtleCrypto` API for ed25519 verification, ensuring
|
|
13
|
-
* compatibility with both Node.js (v19+) and browser environments.
|
|
85
|
+
* compatibility with both Node.js (v19+) and browser environments without polyfills.
|
|
14
86
|
*
|
|
15
|
-
* @param payload -
|
|
87
|
+
* @param payload - Standard SIWX payload, Uint8Array buffers, or Wallet Standard `solana:signIn` output.
|
|
88
|
+
* @param options - Verification options.
|
|
16
89
|
* @returns A `SiwxVerifyResult` with `success: true` and parsed data, or an error result.
|
|
17
90
|
*
|
|
18
91
|
* @example
|
|
19
92
|
* ```ts
|
|
20
|
-
* const result = await verifyEd25519(
|
|
21
|
-
* message: rawCaip122Message,
|
|
22
|
-
* signature: base58EncodedSignature,
|
|
23
|
-
* });
|
|
93
|
+
* const result = await verifyEd25519(solanaSignInOutput);
|
|
24
94
|
* if (result.success) console.log('Authenticated:', result.data?.address);
|
|
25
95
|
* ```
|
|
26
96
|
*/
|
|
27
|
-
declare function verifyEd25519(payload:
|
|
97
|
+
declare function verifyEd25519(payload: SolanaVerifyPayload, options?: {
|
|
28
98
|
skipExpiration?: boolean;
|
|
29
99
|
}): Promise<SiwxVerifyResult>;
|
|
30
100
|
|
|
31
|
-
export { verifyEd25519 };
|
|
101
|
+
export { type SolanaSignInAccount, type SolanaSignInOutput, type SolanaSiwxSignerTarget, type SolanaVerifyPayload, createSolanaSiwxSigner, verifyEd25519 };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var siwxCore=require('@tuwaio/siwx-core'),gill=
|
|
1
|
+
'use strict';var gill=require('gill'),siwxCore=require('@tuwaio/siwx-core');function p(r){return async n=>{let i=gill.getUtf8Encoder().encode(n),t;if(r.modifyAndSignMessages){if(!r.address)throw new Error("[SIWX-SOLANA] modifyAndSignMessages requires signer.address to be defined.");let e=gill.createSignableMessage(i),o=(await r.modifyAndSignMessages([e]))[0];if(!o)throw new Error("[SIWX-SOLANA] No signed message returned.");let g=o.signatures[r.address];if(!g)throw new Error(`[SIWX-SOLANA] Signature missing for address: ${r.address}`);t=g;}else if(r.signMessages){let s=(await r.signMessages([i]))[0];if(!s?.signature)throw new Error("[SIWX-SOLANA] Wallet returned invalid signMessages output.");t=s.signature;}else if(r.signMessage){let e=await r.signMessage(i);if(e instanceof Uint8Array)t=e;else if(e&&"signature"in e&&e.signature instanceof Uint8Array)t=e.signature;else throw new Error("[SIWX-SOLANA] Unexpected legacy signMessage result format.")}else throw new Error("[SIWX-SOLANA] Signer lacks known message signing capabilities.");return gill.getSignatureFromBytes(t)}}function f(r){let n="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",a=new Map(n.split("").map((s,o)=>[s,BigInt(o)])),i=BigInt(0);for(let s of r){let o=a.get(s);if(o===void 0)throw new siwxCore.SiwxVerificationError(`Invalid base58 character: "${s}"`);i=i*BigInt(58)+o;}let t=i.toString(16).padStart(64,"0"),e=new Uint8Array(t.length/2);for(let s=0;s<t.length;s+=2)e[s/2]=parseInt(t.slice(s,s+2),16);return e}function h(r){let n=r.split(":");if(n.length!==3||n[0]!=="solana")throw new siwxCore.SiwxVerificationError(`Expected solana CAIP-10 address format. Got: "${r}"`);return n[2]}function U(r){let n="output"in r?r.output:r,a="signedMessage"in n?n.signedMessage:n.message,i=n.signature,t,e;a instanceof Uint8Array?(e=a,t=new TextDecoder().decode(a)):(t=a,e=new TextEncoder().encode(a));let s;return i instanceof Uint8Array?s=i:s=f(i),{messageString:t,messageBytes:e,signatureBytes:s}}async function E(r,n){try{let{messageString:a,messageBytes:i,signatureBytes:t}=U(r),e=siwxCore.parseMessage(a);if(!e.chainId.startsWith("solana:"))throw new siwxCore.SiwxUnsupportedNamespaceError(e.chainId.split(":")[0]??"unknown");let s=siwxCore.validateMessage(e,{skipExpiration:n?.skipExpiration});if(!s.valid)throw new siwxCore.SiwxValidationError(s.errors);let o=h(e.address),g=gill.address(o),u=f(g),l=await globalThis.crypto.subtle.importKey("raw",u.buffer,{name:"Ed25519"},!1,["verify"]);if(!await globalThis.crypto.subtle.verify({name:"Ed25519"},l,t.buffer,i.buffer))throw new siwxCore.SiwxVerificationError(`ed25519 signature verification failed for address: ${o}`);return {success:!0,data:e}}catch(a){return a instanceof siwxCore.SiwxVerificationError||a instanceof siwxCore.SiwxValidationError?{success:false,error:a.message}:{success:false,error:`ed25519 verification failed: ${String(a)}`}}}exports.createSolanaSiwxSigner=p;exports.verifyEd25519=E;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {parseMessage,SiwxUnsupportedNamespaceError,validateMessage,SiwxValidationError,SiwxVerificationError}from'@tuwaio/siwx-core';
|
|
1
|
+
import {getUtf8Encoder,createSignableMessage,getSignatureFromBytes,address}from'gill';import {parseMessage,SiwxUnsupportedNamespaceError,validateMessage,SiwxValidationError,SiwxVerificationError}from'@tuwaio/siwx-core';function p(r){return async n=>{let i=getUtf8Encoder().encode(n),t;if(r.modifyAndSignMessages){if(!r.address)throw new Error("[SIWX-SOLANA] modifyAndSignMessages requires signer.address to be defined.");let e=createSignableMessage(i),o=(await r.modifyAndSignMessages([e]))[0];if(!o)throw new Error("[SIWX-SOLANA] No signed message returned.");let g=o.signatures[r.address];if(!g)throw new Error(`[SIWX-SOLANA] Signature missing for address: ${r.address}`);t=g;}else if(r.signMessages){let s=(await r.signMessages([i]))[0];if(!s?.signature)throw new Error("[SIWX-SOLANA] Wallet returned invalid signMessages output.");t=s.signature;}else if(r.signMessage){let e=await r.signMessage(i);if(e instanceof Uint8Array)t=e;else if(e&&"signature"in e&&e.signature instanceof Uint8Array)t=e.signature;else throw new Error("[SIWX-SOLANA] Unexpected legacy signMessage result format.")}else throw new Error("[SIWX-SOLANA] Signer lacks known message signing capabilities.");return getSignatureFromBytes(t)}}function f(r){let n="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",a=new Map(n.split("").map((s,o)=>[s,BigInt(o)])),i=BigInt(0);for(let s of r){let o=a.get(s);if(o===void 0)throw new SiwxVerificationError(`Invalid base58 character: "${s}"`);i=i*BigInt(58)+o;}let t=i.toString(16).padStart(64,"0"),e=new Uint8Array(t.length/2);for(let s=0;s<t.length;s+=2)e[s/2]=parseInt(t.slice(s,s+2),16);return e}function h(r){let n=r.split(":");if(n.length!==3||n[0]!=="solana")throw new SiwxVerificationError(`Expected solana CAIP-10 address format. Got: "${r}"`);return n[2]}function U(r){let n="output"in r?r.output:r,a="signedMessage"in n?n.signedMessage:n.message,i=n.signature,t,e;a instanceof Uint8Array?(e=a,t=new TextDecoder().decode(a)):(t=a,e=new TextEncoder().encode(a));let s;return i instanceof Uint8Array?s=i:s=f(i),{messageString:t,messageBytes:e,signatureBytes:s}}async function E(r,n){try{let{messageString:a,messageBytes:i,signatureBytes:t}=U(r),e=parseMessage(a);if(!e.chainId.startsWith("solana:"))throw new SiwxUnsupportedNamespaceError(e.chainId.split(":")[0]??"unknown");let s=validateMessage(e,{skipExpiration:n?.skipExpiration});if(!s.valid)throw new SiwxValidationError(s.errors);let o=h(e.address),g=address(o),u=f(g),l=await globalThis.crypto.subtle.importKey("raw",u.buffer,{name:"Ed25519"},!1,["verify"]);if(!await globalThis.crypto.subtle.verify({name:"Ed25519"},l,t.buffer,i.buffer))throw new SiwxVerificationError(`ed25519 signature verification failed for address: ${o}`);return {success:!0,data:e}}catch(a){return a instanceof SiwxVerificationError||a instanceof SiwxValidationError?{success:false,error:a.message}:{success:false,error:`ed25519 verification failed: ${String(a)}`}}}export{p as createSolanaSiwxSigner,E as verifyEd25519};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tuwaio/siwx-solana",
|
|
3
|
-
"version": "1.0.0-fix-initialize-alpha.
|
|
3
|
+
"version": "1.0.0-fix-initialize-alpha.2.ee070bd",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Oleksandr Tkach",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"@wallet-standard/base": "^1.0.0",
|
|
47
47
|
"gill": "^0.14.0",
|
|
48
|
-
"@tuwaio/siwx-core": "1.0.0-fix-initialize-alpha.
|
|
48
|
+
"@tuwaio/siwx-core": "1.0.0-fix-initialize-alpha.2.ee070bd"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@wallet-standard/base": "^1.1.1",
|
|
52
52
|
"gill": "^0.14.0",
|
|
53
53
|
"tsup": "^8.5.1",
|
|
54
54
|
"typescript": "^6.0.3",
|
|
55
|
-
"@tuwaio/siwx-core": "1.0.0-fix-initialize-alpha.
|
|
55
|
+
"@tuwaio/siwx-core": "1.0.0-fix-initialize-alpha.2.ee070bd"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"start": "tsup src/index.ts --watch",
|