@sip-protocol/sdk 0.7.2 → 0.7.4
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/LICENSE +21 -0
- package/README.md +267 -0
- package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
- package/dist/browser.d.mts +10 -4
- package/dist/browser.d.ts +10 -4
- package/dist/browser.js +48874 -18336
- package/dist/browser.mjs +674 -48
- package/dist/chunk-4GRJ5MAW.mjs +152 -0
- package/dist/chunk-5D7A3L3W.mjs +717 -0
- package/dist/chunk-64AYA5F5.mjs +7834 -0
- package/dist/chunk-GMDGB22A.mjs +379 -0
- package/dist/chunk-I534WKN7.mjs +328 -0
- package/dist/chunk-IBZVA5Y7.mjs +1003 -0
- package/dist/chunk-PRRZAWJE.mjs +223 -0
- package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
- package/dist/chunk-YWGJ77A2.mjs +33806 -0
- package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
- package/dist/constants-LHAAUC2T.mjs +51 -0
- package/dist/dist-2OGQ7FED.mjs +3957 -0
- package/dist/dist-IFHPYLDX.mjs +254 -0
- package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
- package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
- package/dist/index-DXh2IGkz.d.ts +24681 -0
- package/dist/index-DeE1ZzA4.d.mts +24681 -0
- package/dist/index.d.mts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +48676 -17318
- package/dist/index.mjs +583 -19
- package/dist/interface-Bf7w1PLW.d.mts +679 -0
- package/dist/interface-Bf7w1PLW.d.ts +679 -0
- package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
- package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
- package/dist/proofs/halo2.d.mts +151 -0
- package/dist/proofs/halo2.d.ts +151 -0
- package/dist/proofs/halo2.js +350 -0
- package/dist/proofs/halo2.mjs +11 -0
- package/dist/proofs/kimchi.d.mts +160 -0
- package/dist/proofs/kimchi.d.ts +160 -0
- package/dist/proofs/kimchi.js +431 -0
- package/dist/proofs/kimchi.mjs +13 -0
- package/dist/proofs/noir.d.mts +1 -1
- package/dist/proofs/noir.d.ts +1 -1
- package/dist/proofs/noir.js +74 -18
- package/dist/proofs/noir.mjs +84 -24
- package/dist/solana-U3MEGU7W.mjs +280 -0
- package/dist/validity_proof-3POXLPNY.mjs +21 -0
- package/package.json +54 -21
- package/src/adapters/index.ts +41 -0
- package/src/adapters/jupiter.ts +571 -0
- package/src/adapters/near-intents.ts +135 -0
- package/src/advisor/advisor.ts +653 -0
- package/src/advisor/index.ts +54 -0
- package/src/advisor/tools.ts +303 -0
- package/src/advisor/types.ts +164 -0
- package/src/chains/ethereum/announcement.ts +536 -0
- package/src/chains/ethereum/bnb-optimizations.ts +474 -0
- package/src/chains/ethereum/commitment.ts +522 -0
- package/src/chains/ethereum/constants.ts +462 -0
- package/src/chains/ethereum/deployment.ts +596 -0
- package/src/chains/ethereum/gas-estimation.ts +538 -0
- package/src/chains/ethereum/index.ts +268 -0
- package/src/chains/ethereum/optimizations.ts +614 -0
- package/src/chains/ethereum/privacy-adapter.ts +855 -0
- package/src/chains/ethereum/registry.ts +584 -0
- package/src/chains/ethereum/rpc.ts +905 -0
- package/src/chains/ethereum/stealth.ts +491 -0
- package/src/chains/ethereum/token.ts +790 -0
- package/src/chains/ethereum/transfer.ts +637 -0
- package/src/chains/ethereum/types.ts +456 -0
- package/src/chains/ethereum/viewing-key.ts +455 -0
- package/src/chains/near/commitment.ts +608 -0
- package/src/chains/near/constants.ts +284 -0
- package/src/chains/near/function-call.ts +871 -0
- package/src/chains/near/history.ts +654 -0
- package/src/chains/near/implicit-account.ts +840 -0
- package/src/chains/near/index.ts +393 -0
- package/src/chains/near/native-transfer.ts +658 -0
- package/src/chains/near/nep141.ts +775 -0
- package/src/chains/near/privacy-adapter.ts +889 -0
- package/src/chains/near/resolver.ts +971 -0
- package/src/chains/near/rpc.ts +1016 -0
- package/src/chains/near/stealth.ts +419 -0
- package/src/chains/near/types.ts +317 -0
- package/src/chains/near/viewing-key.ts +876 -0
- package/src/chains/solana/anchor-transfer.ts +386 -0
- package/src/chains/solana/commitment.ts +577 -0
- package/src/chains/solana/constants.ts +126 -12
- package/src/chains/solana/ephemeral-keys.ts +543 -0
- package/src/chains/solana/index.ts +276 -1
- package/src/chains/solana/key-derivation.ts +418 -0
- package/src/chains/solana/kit-compat.ts +334 -0
- package/src/chains/solana/optimizations.ts +560 -0
- package/src/chains/solana/privacy-adapter.ts +605 -0
- package/src/chains/solana/providers/generic.ts +201 -0
- package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
- package/src/chains/solana/providers/helius-enhanced.ts +623 -0
- package/src/chains/solana/providers/helius.ts +402 -0
- package/src/chains/solana/providers/index.ts +85 -0
- package/src/chains/solana/providers/interface.ts +221 -0
- package/src/chains/solana/providers/quicknode.ts +409 -0
- package/src/chains/solana/providers/triton.ts +426 -0
- package/src/chains/solana/providers/webhook.ts +790 -0
- package/src/chains/solana/rpc-client.ts +1150 -0
- package/src/chains/solana/scan.ts +170 -73
- package/src/chains/solana/sol-transfer.ts +732 -0
- package/src/chains/solana/spl-transfer.ts +886 -0
- package/src/chains/solana/stealth-scanner.ts +703 -0
- package/src/chains/solana/sunspot-verifier.ts +453 -0
- package/src/chains/solana/transaction-builder.ts +755 -0
- package/src/chains/solana/transfer.ts +74 -5
- package/src/chains/solana/types.ts +77 -7
- package/src/chains/solana/utils.ts +110 -0
- package/src/chains/solana/viewing-key.ts +807 -0
- package/src/compliance/fireblocks.ts +921 -0
- package/src/compliance/index.ts +37 -0
- package/src/compliance/range-sas.ts +956 -0
- package/src/config/endpoints.ts +100 -0
- package/src/crypto.ts +11 -8
- package/src/errors.ts +82 -0
- package/src/evm/erc4337-relayer.ts +830 -0
- package/src/evm/index.ts +47 -0
- package/src/fees/calculator.ts +396 -0
- package/src/fees/index.ts +87 -0
- package/src/fees/near-contract.ts +429 -0
- package/src/fees/types.ts +268 -0
- package/src/index.ts +785 -1
- package/src/intent.ts +6 -3
- package/src/logger.ts +324 -0
- package/src/network/index.ts +80 -0
- package/src/network/proxy.ts +691 -0
- package/src/optimizations/index.ts +541 -0
- package/src/oracle/types.ts +1 -0
- package/src/privacy-backends/arcium-types.ts +727 -0
- package/src/privacy-backends/arcium.ts +719 -0
- package/src/privacy-backends/combined-privacy.ts +866 -0
- package/src/privacy-backends/cspl-token.ts +595 -0
- package/src/privacy-backends/cspl-types.ts +512 -0
- package/src/privacy-backends/cspl.ts +907 -0
- package/src/privacy-backends/health.ts +488 -0
- package/src/privacy-backends/inco-types.ts +323 -0
- package/src/privacy-backends/inco.ts +616 -0
- package/src/privacy-backends/index.ts +336 -0
- package/src/privacy-backends/interface.ts +906 -0
- package/src/privacy-backends/lru-cache.ts +343 -0
- package/src/privacy-backends/magicblock.ts +458 -0
- package/src/privacy-backends/mock.ts +258 -0
- package/src/privacy-backends/privacycash-types.ts +278 -0
- package/src/privacy-backends/privacycash.ts +456 -0
- package/src/privacy-backends/private-swap.ts +570 -0
- package/src/privacy-backends/rate-limiter.ts +683 -0
- package/src/privacy-backends/registry.ts +690 -0
- package/src/privacy-backends/router.ts +626 -0
- package/src/privacy-backends/shadowwire.ts +449 -0
- package/src/privacy-backends/sip-native.ts +256 -0
- package/src/privacy-logger.ts +191 -0
- package/src/production-safety.ts +373 -0
- package/src/proofs/aggregator.ts +1029 -0
- package/src/proofs/browser-composer.ts +1150 -0
- package/src/proofs/browser.ts +113 -25
- package/src/proofs/cache/index.ts +127 -0
- package/src/proofs/cache/interface.ts +545 -0
- package/src/proofs/cache/key-generator.ts +188 -0
- package/src/proofs/cache/lru-cache.ts +481 -0
- package/src/proofs/cache/multi-tier-cache.ts +575 -0
- package/src/proofs/cache/persistent-cache.ts +788 -0
- package/src/proofs/compliance-proof.ts +872 -0
- package/src/proofs/composer/base.ts +923 -0
- package/src/proofs/composer/index.ts +25 -0
- package/src/proofs/composer/interface.ts +518 -0
- package/src/proofs/composer/types.ts +383 -0
- package/src/proofs/converters/halo2.ts +452 -0
- package/src/proofs/converters/index.ts +208 -0
- package/src/proofs/converters/interface.ts +363 -0
- package/src/proofs/converters/kimchi.ts +462 -0
- package/src/proofs/converters/noir.ts +451 -0
- package/src/proofs/fallback.ts +888 -0
- package/src/proofs/halo2.ts +42 -0
- package/src/proofs/index.ts +471 -0
- package/src/proofs/interface.ts +13 -0
- package/src/proofs/kimchi.ts +42 -0
- package/src/proofs/lazy.ts +1004 -0
- package/src/proofs/mock.ts +25 -1
- package/src/proofs/noir.ts +111 -30
- package/src/proofs/orchestrator.ts +960 -0
- package/src/proofs/parallel/concurrency.ts +297 -0
- package/src/proofs/parallel/dependency-graph.ts +602 -0
- package/src/proofs/parallel/executor.ts +420 -0
- package/src/proofs/parallel/index.ts +131 -0
- package/src/proofs/parallel/interface.ts +685 -0
- package/src/proofs/parallel/worker-pool.ts +644 -0
- package/src/proofs/providers/halo2.ts +560 -0
- package/src/proofs/providers/index.ts +34 -0
- package/src/proofs/providers/kimchi.ts +641 -0
- package/src/proofs/validator.ts +881 -0
- package/src/proofs/verifier.ts +867 -0
- package/src/quantum/index.ts +112 -0
- package/src/quantum/winternitz-vault.ts +639 -0
- package/src/quantum/wots.ts +611 -0
- package/src/settlement/backends/direct-chain.ts +1 -0
- package/src/settlement/index.ts +9 -0
- package/src/settlement/router.ts +732 -46
- package/src/solana/index.ts +72 -0
- package/src/solana/jito-relayer.ts +687 -0
- package/src/solana/noir-verifier-types.ts +430 -0
- package/src/solana/noir-verifier.ts +816 -0
- package/src/stealth/address-derivation.ts +193 -0
- package/src/stealth/ed25519.ts +431 -0
- package/src/stealth/index.ts +233 -0
- package/src/stealth/meta-address.ts +221 -0
- package/src/stealth/secp256k1.ts +368 -0
- package/src/stealth/utils.ts +194 -0
- package/src/stealth.ts +50 -1504
- package/src/surveillance/algorithms/address-reuse.ts +143 -0
- package/src/surveillance/algorithms/cluster.ts +247 -0
- package/src/surveillance/algorithms/exchange.ts +295 -0
- package/src/surveillance/algorithms/temporal.ts +337 -0
- package/src/surveillance/analyzer.ts +442 -0
- package/src/surveillance/index.ts +64 -0
- package/src/surveillance/scoring.ts +372 -0
- package/src/surveillance/types.ts +264 -0
- package/src/sync/index.ts +106 -0
- package/src/sync/manager.ts +504 -0
- package/src/sync/mock-provider.ts +318 -0
- package/src/sync/oblivious.ts +625 -0
- package/src/tokens/index.ts +15 -0
- package/src/tokens/registry.ts +301 -0
- package/src/utils/deprecation.ts +94 -0
- package/src/utils/index.ts +9 -0
- package/src/wallet/ethereum/index.ts +68 -0
- package/src/wallet/ethereum/metamask-privacy.ts +420 -0
- package/src/wallet/ethereum/multi-wallet.ts +646 -0
- package/src/wallet/ethereum/privacy-adapter.ts +700 -0
- package/src/wallet/ethereum/types.ts +3 -1
- package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
- package/src/wallet/hardware/index.ts +10 -0
- package/src/wallet/hardware/ledger-privacy.ts +414 -0
- package/src/wallet/index.ts +71 -0
- package/src/wallet/near/adapter.ts +626 -0
- package/src/wallet/near/index.ts +86 -0
- package/src/wallet/near/meteor-wallet.ts +1153 -0
- package/src/wallet/near/my-near-wallet.ts +790 -0
- package/src/wallet/near/wallet-selector.ts +702 -0
- package/src/wallet/solana/adapter.ts +6 -4
- package/src/wallet/solana/index.ts +13 -0
- package/src/wallet/solana/privacy-adapter.ts +567 -0
- package/src/wallet/sui/types.ts +6 -4
- package/src/zcash/rpc-client.ts +13 -6
- package/dist/chunk-3INS3PR5.mjs +0 -884
- package/dist/chunk-3OVABDRH.mjs +0 -17096
- package/dist/chunk-DLDWZFYC.mjs +0 -1495
- package/dist/chunk-E6SZWREQ.mjs +0 -57
- package/dist/chunk-G33LB27A.mjs +0 -16166
- package/dist/chunk-HGU6HZRC.mjs +0 -231
- package/dist/chunk-L2K34JCU.mjs +0 -1496
- package/dist/chunk-SN4ZDTVW.mjs +0 -16166
- package/dist/constants-VOI7BSLK.mjs +0 -27
- package/dist/index-BYZbDjal.d.ts +0 -11390
- package/dist/index-CHB3KuOB.d.mts +0 -11859
- package/dist/index-CzWPI6Le.d.ts +0 -11859
- package/dist/index-xbWjohNq.d.mts +0 -11390
- package/dist/solana-5EMCTPTS.mjs +0 -46
- package/dist/solana-Q4NAVBTS.mjs +0 -46
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ledger Privacy Wallet Adapter
|
|
3
|
+
*
|
|
4
|
+
* Extends the Ledger wallet adapter with privacy features for
|
|
5
|
+
* Ethereum stealth address operations.
|
|
6
|
+
*
|
|
7
|
+
* @module wallet/hardware/ledger-privacy
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { secp256k1 } from '@noble/curves/secp256k1'
|
|
11
|
+
import { sha256 } from '@noble/hashes/sha256'
|
|
12
|
+
import { bytesToHex, hexToBytes } from '@noble/hashes/utils'
|
|
13
|
+
import type { HexString, StealthMetaAddress, StealthAddress } from '@sip-protocol/types'
|
|
14
|
+
import { WalletErrorCode } from '@sip-protocol/types'
|
|
15
|
+
import { WalletError } from '../errors'
|
|
16
|
+
import { LedgerWalletAdapter } from './ledger'
|
|
17
|
+
import {
|
|
18
|
+
type LedgerConfig,
|
|
19
|
+
type HardwareAccount,
|
|
20
|
+
HardwareErrorCode,
|
|
21
|
+
HardwareWalletError,
|
|
22
|
+
} from './types'
|
|
23
|
+
import {
|
|
24
|
+
generateEthereumStealthAddress,
|
|
25
|
+
deriveEthereumStealthPrivateKey,
|
|
26
|
+
checkEthereumStealthAddress,
|
|
27
|
+
encodeEthereumStealthMetaAddress,
|
|
28
|
+
} from '../../chains/ethereum/stealth'
|
|
29
|
+
|
|
30
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Privacy Ledger adapter configuration
|
|
34
|
+
*/
|
|
35
|
+
export interface LedgerPrivacyConfig extends Omit<LedgerConfig, 'chain'> {
|
|
36
|
+
/**
|
|
37
|
+
* Domain for key derivation message
|
|
38
|
+
* Used to generate deterministic privacy keys
|
|
39
|
+
*/
|
|
40
|
+
derivationDomain?: string
|
|
41
|
+
/**
|
|
42
|
+
* Nonce for key derivation (default: 0)
|
|
43
|
+
* Different nonces produce different key sets
|
|
44
|
+
*/
|
|
45
|
+
derivationNonce?: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Ledger-derived stealth key material
|
|
50
|
+
*/
|
|
51
|
+
export interface LedgerStealthKeyMaterial {
|
|
52
|
+
/** Stealth meta-address */
|
|
53
|
+
metaAddress: StealthMetaAddress
|
|
54
|
+
/** Spending private key (derived from signature) */
|
|
55
|
+
spendingPrivateKey: HexString
|
|
56
|
+
/** Viewing private key (derived from signature) */
|
|
57
|
+
viewingPrivateKey: HexString
|
|
58
|
+
/** Encoded meta-address string */
|
|
59
|
+
encodedMetaAddress: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Scanned payment from stealth address
|
|
64
|
+
*/
|
|
65
|
+
export interface LedgerScannedPayment {
|
|
66
|
+
/** Original stealth address announcement */
|
|
67
|
+
announcement: StealthAddress
|
|
68
|
+
/** Derived private key to claim funds */
|
|
69
|
+
claimKey: HexString
|
|
70
|
+
/** Standard Ethereum address for the stealth address */
|
|
71
|
+
ethAddress: HexString
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Claim result from stealth address
|
|
76
|
+
*/
|
|
77
|
+
export interface LedgerClaimResult {
|
|
78
|
+
/** Stealth address */
|
|
79
|
+
stealthAddress: HexString
|
|
80
|
+
/** Ephemeral public key used */
|
|
81
|
+
ephemeralPublicKey: HexString
|
|
82
|
+
/** Private key to claim funds */
|
|
83
|
+
privateKey: HexString
|
|
84
|
+
/** Standard Ethereum address */
|
|
85
|
+
ethAddress: HexString
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ─── Ledger Privacy Adapter ─────────────────────────────────────────────────
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Ledger Privacy Wallet Adapter
|
|
92
|
+
*
|
|
93
|
+
* Provides privacy features (stealth addresses) for Ledger hardware wallets.
|
|
94
|
+
* Keys are derived from signatures on the device, ensuring private keys
|
|
95
|
+
* never leave the hardware wallet.
|
|
96
|
+
*
|
|
97
|
+
* @example Basic usage
|
|
98
|
+
* ```typescript
|
|
99
|
+
* const ledger = new LedgerPrivacyAdapter({
|
|
100
|
+
* accountIndex: 0,
|
|
101
|
+
* derivationDomain: 'myapp.com',
|
|
102
|
+
* })
|
|
103
|
+
*
|
|
104
|
+
* await ledger.connect()
|
|
105
|
+
* await ledger.initializePrivacy()
|
|
106
|
+
*
|
|
107
|
+
* // Get stealth meta-address for receiving
|
|
108
|
+
* const metaAddress = ledger.getMetaAddress()
|
|
109
|
+
*
|
|
110
|
+
* // Scan for payments
|
|
111
|
+
* const payments = ledger.scanPayments(announcements)
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* @remarks
|
|
115
|
+
* Hardware wallets cannot export private keys directly. Instead, we derive
|
|
116
|
+
* privacy keys by signing a deterministic message and using the signature
|
|
117
|
+
* as entropy. The same domain/nonce will always produce the same keys.
|
|
118
|
+
*
|
|
119
|
+
* IMPORTANT: Privacy keys are held in memory and will be lost when the
|
|
120
|
+
* adapter is disconnected. Call `initializePrivacy()` after each connection.
|
|
121
|
+
*/
|
|
122
|
+
export class LedgerPrivacyAdapter extends LedgerWalletAdapter {
|
|
123
|
+
private derivationDomain: string
|
|
124
|
+
private derivationNonce: number
|
|
125
|
+
private stealthKeys: LedgerStealthKeyMaterial | undefined
|
|
126
|
+
private _privacyInitialized: boolean = false
|
|
127
|
+
|
|
128
|
+
constructor(config: LedgerPrivacyConfig) {
|
|
129
|
+
super({
|
|
130
|
+
...config,
|
|
131
|
+
chain: 'ethereum', // Privacy adapter is Ethereum-only
|
|
132
|
+
})
|
|
133
|
+
this.derivationDomain = config.derivationDomain ?? 'sip-protocol.org'
|
|
134
|
+
this.derivationNonce = config.derivationNonce ?? 0
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// ─── Privacy Initialization ─────────────────────────────────────────────────
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Initialize privacy features
|
|
141
|
+
*
|
|
142
|
+
* Derives stealth keys by signing a message on the Ledger device.
|
|
143
|
+
* This requires user approval on the device.
|
|
144
|
+
*
|
|
145
|
+
* @throws {HardwareWalletError} If user rejects or device error
|
|
146
|
+
*/
|
|
147
|
+
async initializePrivacy(): Promise<void> {
|
|
148
|
+
this.requireConnected()
|
|
149
|
+
|
|
150
|
+
try {
|
|
151
|
+
// Build key derivation message
|
|
152
|
+
const message = this.buildKeyDerivationMessage()
|
|
153
|
+
const messageBytes = new TextEncoder().encode(message)
|
|
154
|
+
|
|
155
|
+
// Sign on Ledger (requires user approval)
|
|
156
|
+
const signature = await this.signMessage(messageBytes)
|
|
157
|
+
|
|
158
|
+
// Derive stealth keys from signature
|
|
159
|
+
this.stealthKeys = this.deriveStealthKeysFromSignature(signature.signature)
|
|
160
|
+
this._privacyInitialized = true
|
|
161
|
+
} catch (error) {
|
|
162
|
+
if (error instanceof HardwareWalletError) {
|
|
163
|
+
throw error
|
|
164
|
+
}
|
|
165
|
+
throw new HardwareWalletError(
|
|
166
|
+
'Failed to initialize privacy keys',
|
|
167
|
+
HardwareErrorCode.TRANSPORT_ERROR,
|
|
168
|
+
'ledger',
|
|
169
|
+
error
|
|
170
|
+
)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Check if privacy is initialized
|
|
176
|
+
*/
|
|
177
|
+
isPrivacyInitialized(): boolean {
|
|
178
|
+
return this._privacyInitialized && this.stealthKeys !== undefined
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Require privacy to be initialized
|
|
183
|
+
*/
|
|
184
|
+
private requirePrivacy(): void {
|
|
185
|
+
if (!this.isPrivacyInitialized()) {
|
|
186
|
+
throw new WalletError(
|
|
187
|
+
'Privacy not initialized. Call initializePrivacy() first.',
|
|
188
|
+
WalletErrorCode.NOT_CONNECTED
|
|
189
|
+
)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ─── Stealth Address Operations ─────────────────────────────────────────────
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Get stealth meta-address for receiving private payments
|
|
197
|
+
*/
|
|
198
|
+
getMetaAddress(): StealthMetaAddress {
|
|
199
|
+
this.requirePrivacy()
|
|
200
|
+
return this.stealthKeys!.metaAddress
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Get encoded stealth meta-address string
|
|
205
|
+
*
|
|
206
|
+
* Format: st:eth:0x<spendingKey><viewingKey>
|
|
207
|
+
*/
|
|
208
|
+
getEncodedMetaAddress(): string {
|
|
209
|
+
this.requirePrivacy()
|
|
210
|
+
return this.stealthKeys!.encodedMetaAddress
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Get stealth key material (for backup/export)
|
|
215
|
+
*
|
|
216
|
+
* @remarks
|
|
217
|
+
* SECURITY: Handle with care - contains private keys.
|
|
218
|
+
* Only export if user explicitly requests backup.
|
|
219
|
+
*/
|
|
220
|
+
getStealthKeys(): LedgerStealthKeyMaterial | undefined {
|
|
221
|
+
return this.stealthKeys
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Generate a stealth address for a recipient
|
|
226
|
+
*
|
|
227
|
+
* @param recipientMetaAddress - Recipient's stealth meta-address
|
|
228
|
+
* @returns Generated stealth address
|
|
229
|
+
*/
|
|
230
|
+
generateStealthAddress(recipientMetaAddress: StealthMetaAddress): StealthAddress {
|
|
231
|
+
const result = generateEthereumStealthAddress(recipientMetaAddress)
|
|
232
|
+
return result.stealthAddress
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Scan announcements for payments to this wallet
|
|
237
|
+
*
|
|
238
|
+
* @param announcements - Stealth address announcements to scan
|
|
239
|
+
* @returns Payments that belong to this wallet
|
|
240
|
+
*/
|
|
241
|
+
scanPayments(announcements: StealthAddress[]): LedgerScannedPayment[] {
|
|
242
|
+
this.requirePrivacy()
|
|
243
|
+
|
|
244
|
+
const payments: LedgerScannedPayment[] = []
|
|
245
|
+
|
|
246
|
+
for (const announcement of announcements) {
|
|
247
|
+
// Check if this payment belongs to us using viewing key
|
|
248
|
+
const isOurs = checkEthereumStealthAddress(
|
|
249
|
+
announcement,
|
|
250
|
+
this.stealthKeys!.spendingPrivateKey,
|
|
251
|
+
this.stealthKeys!.viewingPrivateKey
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
if (isOurs) {
|
|
255
|
+
// Derive claim key
|
|
256
|
+
const recovery = deriveEthereumStealthPrivateKey(
|
|
257
|
+
announcement,
|
|
258
|
+
this.stealthKeys!.spendingPrivateKey,
|
|
259
|
+
this.stealthKeys!.viewingPrivateKey
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
payments.push({
|
|
263
|
+
announcement,
|
|
264
|
+
claimKey: recovery.privateKey,
|
|
265
|
+
ethAddress: recovery.ethAddress,
|
|
266
|
+
})
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return payments
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Derive claim key for a specific stealth address
|
|
275
|
+
*
|
|
276
|
+
* @param stealthAddress - The stealth address announcement
|
|
277
|
+
* @returns Claim result with private key
|
|
278
|
+
*/
|
|
279
|
+
deriveClaimKey(stealthAddress: StealthAddress): LedgerClaimResult {
|
|
280
|
+
this.requirePrivacy()
|
|
281
|
+
|
|
282
|
+
const recovery = deriveEthereumStealthPrivateKey(
|
|
283
|
+
stealthAddress,
|
|
284
|
+
this.stealthKeys!.spendingPrivateKey,
|
|
285
|
+
this.stealthKeys!.viewingPrivateKey
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
return {
|
|
289
|
+
stealthAddress: recovery.stealthAddress,
|
|
290
|
+
ephemeralPublicKey: stealthAddress.ephemeralPublicKey,
|
|
291
|
+
privateKey: recovery.privateKey,
|
|
292
|
+
ethAddress: recovery.ethAddress,
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ─── Account Management ─────────────────────────────────────────────────────
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Switch account and reinitialize privacy
|
|
300
|
+
*
|
|
301
|
+
* @param accountIndex - New account index
|
|
302
|
+
* @returns New account info
|
|
303
|
+
*/
|
|
304
|
+
async switchAccountWithPrivacy(accountIndex: number): Promise<HardwareAccount> {
|
|
305
|
+
const account = await this.switchAccount(accountIndex)
|
|
306
|
+
|
|
307
|
+
// Clear old privacy keys
|
|
308
|
+
this.stealthKeys = undefined
|
|
309
|
+
this._privacyInitialized = false
|
|
310
|
+
|
|
311
|
+
// User must call initializePrivacy() again
|
|
312
|
+
return account
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// ─── Disconnect ─────────────────────────────────────────────────────────────
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Disconnect and clear privacy keys
|
|
319
|
+
*/
|
|
320
|
+
async disconnect(): Promise<void> {
|
|
321
|
+
this.stealthKeys = undefined
|
|
322
|
+
this._privacyInitialized = false
|
|
323
|
+
await super.disconnect()
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ─── Private Methods ────────────────────────────────────────────────────────
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Build key derivation message
|
|
330
|
+
*
|
|
331
|
+
* This message is signed on the Ledger to derive privacy keys.
|
|
332
|
+
* The same domain/nonce/address always produces the same signature.
|
|
333
|
+
*/
|
|
334
|
+
private buildKeyDerivationMessage(): string {
|
|
335
|
+
return [
|
|
336
|
+
'SIP Protocol Privacy Key Derivation',
|
|
337
|
+
'',
|
|
338
|
+
`Domain: ${this.derivationDomain}`,
|
|
339
|
+
`Address: ${this.address}`,
|
|
340
|
+
`Nonce: ${this.derivationNonce}`,
|
|
341
|
+
'',
|
|
342
|
+
'Sign this message to generate your privacy keys.',
|
|
343
|
+
'Your keys will be derived deterministically from this signature.',
|
|
344
|
+
].join('\n')
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Derive stealth keys from signature
|
|
349
|
+
*
|
|
350
|
+
* Uses the signature as entropy to generate spending and viewing keys.
|
|
351
|
+
*/
|
|
352
|
+
private deriveStealthKeysFromSignature(signature: HexString): LedgerStealthKeyMaterial {
|
|
353
|
+
// Remove 0x prefix
|
|
354
|
+
const sigBytes = hexToBytes(signature.slice(2))
|
|
355
|
+
|
|
356
|
+
// Derive spending key: hash(signature || "spending")
|
|
357
|
+
const spendingInput = new Uint8Array(sigBytes.length + 8)
|
|
358
|
+
spendingInput.set(sigBytes)
|
|
359
|
+
spendingInput.set(new TextEncoder().encode('spending'), sigBytes.length)
|
|
360
|
+
const spendingPrivateKeyBytes = sha256(spendingInput)
|
|
361
|
+
const spendingPrivateKey = `0x${bytesToHex(spendingPrivateKeyBytes)}` as HexString
|
|
362
|
+
|
|
363
|
+
// Derive viewing key: hash(signature || "viewing")
|
|
364
|
+
const viewingInput = new Uint8Array(sigBytes.length + 7)
|
|
365
|
+
viewingInput.set(sigBytes)
|
|
366
|
+
viewingInput.set(new TextEncoder().encode('viewing'), sigBytes.length)
|
|
367
|
+
const viewingPrivateKeyBytes = sha256(viewingInput)
|
|
368
|
+
const viewingPrivateKey = `0x${bytesToHex(viewingPrivateKeyBytes)}` as HexString
|
|
369
|
+
|
|
370
|
+
// Derive public keys from private keys using secp256k1
|
|
371
|
+
const spendingPublicKey = secp256k1.getPublicKey(spendingPrivateKeyBytes, true)
|
|
372
|
+
const viewingPublicKey = secp256k1.getPublicKey(viewingPrivateKeyBytes, true)
|
|
373
|
+
|
|
374
|
+
// Create meta-address
|
|
375
|
+
const metaAddress: StealthMetaAddress = {
|
|
376
|
+
spendingKey: `0x${bytesToHex(spendingPublicKey)}` as HexString,
|
|
377
|
+
viewingKey: `0x${bytesToHex(viewingPublicKey)}` as HexString,
|
|
378
|
+
chain: 'ethereum',
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
const encodedMetaAddress = encodeEthereumStealthMetaAddress(metaAddress)
|
|
382
|
+
|
|
383
|
+
return {
|
|
384
|
+
metaAddress,
|
|
385
|
+
spendingPrivateKey,
|
|
386
|
+
viewingPrivateKey,
|
|
387
|
+
encodedMetaAddress,
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// ─── Factory Function ───────────────────────────────────────────────────────
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Create a Ledger privacy adapter
|
|
396
|
+
*
|
|
397
|
+
* @example
|
|
398
|
+
* ```typescript
|
|
399
|
+
* const ledger = createLedgerPrivacyAdapter({
|
|
400
|
+
* accountIndex: 0,
|
|
401
|
+
* derivationDomain: 'myapp.com',
|
|
402
|
+
* })
|
|
403
|
+
*
|
|
404
|
+
* await ledger.connect()
|
|
405
|
+
* await ledger.initializePrivacy()
|
|
406
|
+
*
|
|
407
|
+
* const metaAddress = ledger.getEncodedMetaAddress()
|
|
408
|
+
* ```
|
|
409
|
+
*/
|
|
410
|
+
export function createLedgerPrivacyAdapter(
|
|
411
|
+
config: LedgerPrivacyConfig
|
|
412
|
+
): LedgerPrivacyAdapter {
|
|
413
|
+
return new LedgerPrivacyAdapter(config)
|
|
414
|
+
}
|
package/src/wallet/index.ts
CHANGED
|
@@ -211,6 +211,77 @@ export type {
|
|
|
211
211
|
MockSuiAdapterConfig,
|
|
212
212
|
} from './sui'
|
|
213
213
|
|
|
214
|
+
// NEAR adapter
|
|
215
|
+
export {
|
|
216
|
+
NEARWalletAdapter,
|
|
217
|
+
type NEARWalletAdapterConfig,
|
|
218
|
+
type NEARConnectOptions,
|
|
219
|
+
type NEARPrivacyKeyPair,
|
|
220
|
+
type NEARStealthAddressWithKeys,
|
|
221
|
+
type NEARPrivacyTransaction,
|
|
222
|
+
type NEARSignedPrivacyTransaction,
|
|
223
|
+
type NEARViewingKeyExport,
|
|
224
|
+
// Wallet Selector integration
|
|
225
|
+
PrivacyWalletSelector,
|
|
226
|
+
createPrivacyWalletSelector,
|
|
227
|
+
createMainnetPrivacySelector,
|
|
228
|
+
createTestnetPrivacySelector,
|
|
229
|
+
type WalletSelector,
|
|
230
|
+
type WalletSelectorState,
|
|
231
|
+
type Wallet as NEARWallet,
|
|
232
|
+
type WalletAction as NEARWalletAction,
|
|
233
|
+
type WalletTransactionResult as NEARWalletTransactionResult,
|
|
234
|
+
type SignAndSendTransactionParams as NEARSignAndSendTransactionParams,
|
|
235
|
+
type SignAndSendTransactionsParams as NEARSignAndSendTransactionsParams,
|
|
236
|
+
type SignMessageParams as NEARSignMessageParams,
|
|
237
|
+
type SignedMessage as NEARSignedMessage,
|
|
238
|
+
type PrivacyWalletSelectorConfig,
|
|
239
|
+
type PrivacyKeyPair,
|
|
240
|
+
type StealthAddressResult,
|
|
241
|
+
type PrivateTransferParams,
|
|
242
|
+
type PrivateTransferResult,
|
|
243
|
+
type WalletPrivacyCapabilities,
|
|
244
|
+
type ViewingKeyExport,
|
|
245
|
+
// MyNearWallet integration
|
|
246
|
+
MyNearWalletPrivacy,
|
|
247
|
+
createMyNearWalletPrivacy,
|
|
248
|
+
createMainnetMyNearWallet,
|
|
249
|
+
createTestnetMyNearWallet,
|
|
250
|
+
parseMyNearWalletCallback,
|
|
251
|
+
MY_NEAR_WALLET_MAINNET,
|
|
252
|
+
MY_NEAR_WALLET_TESTNET,
|
|
253
|
+
type MyNearWalletConfig,
|
|
254
|
+
type MyNearWalletConnectionState,
|
|
255
|
+
type MyNearWalletPrivacyKeys,
|
|
256
|
+
type MyNearWalletStealthAddress,
|
|
257
|
+
type MyNearWalletPrivateTransferParams,
|
|
258
|
+
type TransactionPreview as NEARTransactionPreview,
|
|
259
|
+
type MyNearWalletCallbackResult,
|
|
260
|
+
type MyNearWalletViewingKeyExport,
|
|
261
|
+
type LedgerStatus as NEARLedgerStatus,
|
|
262
|
+
// Meteor Wallet integration
|
|
263
|
+
MeteorWalletPrivacy,
|
|
264
|
+
createMeteorWalletPrivacy,
|
|
265
|
+
createMainnetMeteorWallet,
|
|
266
|
+
createTestnetMeteorWallet,
|
|
267
|
+
isMeteorWalletAvailable,
|
|
268
|
+
MeteorWalletError,
|
|
269
|
+
MeteorErrorCode,
|
|
270
|
+
METEOR_DEEP_LINK_SCHEME,
|
|
271
|
+
METEOR_APP_LINK_MAINNET,
|
|
272
|
+
METEOR_APP_LINK_TESTNET,
|
|
273
|
+
METEOR_PROVIDER_KEY,
|
|
274
|
+
type MeteorWalletProvider,
|
|
275
|
+
type MeteorWalletConfig,
|
|
276
|
+
type MeteorConnectionState,
|
|
277
|
+
type MeteorSigningMode,
|
|
278
|
+
type MeteorPrivacyKeys,
|
|
279
|
+
type MeteorPrivateTransferParams,
|
|
280
|
+
type TransactionSimulation as NEARTransactionSimulation,
|
|
281
|
+
type MeteorTransactionResult,
|
|
282
|
+
type MeteorAccountInfo,
|
|
283
|
+
} from './near'
|
|
284
|
+
|
|
214
285
|
// Hardware wallet adapters
|
|
215
286
|
export {
|
|
216
287
|
// Types
|