diff --git a/packages/lasereyes-core/package.json b/packages/lasereyes-core/package.json index 5fc22e8..6d24484 100644 --- a/packages/lasereyes-core/package.json +++ b/packages/lasereyes-core/package.json @@ -1,7 +1,7 @@ { "name": "@omnisat/lasereyes-core", "private": false, - "version": "0.0.60", + "version": "0.0.61-rc.3", "type": "module", "main": "./dist/index.umd.cjs", "module": "./dist/index.js", diff --git a/packages/lasereyes-core/src/client/providers/leather.ts b/packages/lasereyes-core/src/client/providers/leather.ts index 371b119..088f412 100644 --- a/packages/lasereyes-core/src/client/providers/leather.ts +++ b/packages/lasereyes-core/src/client/providers/leather.ts @@ -9,14 +9,18 @@ import { LeatherRequestSignResponse, SignPsbtRequestParams, } from '../../types' -import { getBTCBalance } from '../../lib/helpers' +import { getBTCBalance, isMainnetNetwork } from '../../lib/helpers' import { LEATHER, P2TR, P2WPKH } from '../../constants/wallets' import { listenKeys, MapStore } from 'nanostores' import { persistentMap } from '@nanostores/persistent' import { LaserEyesStoreType } from '../types' import { SIGNET, TESTNET, TESTNET4 } from '../../constants' import { RpcErrorCode } from 'sats-connect' -import { keysToPersist, PersistedKey } from '../utils' +import { + handleStateChangePersistence, + keysToPersist, + PersistedKey, +} from '../utils' const LEATHER_WALLET_PERSISTENCE_KEY = 'LEATHER_CONNECTED_WALLET_STATE' @@ -46,8 +50,15 @@ export default class LeatherProvider extends WalletProvider { restorePersistedValues() { const vals = this.$valueStore.get() for (const key of keysToPersist) { + if (key === 'balance') { + this.$store.setKey(key, BigInt(vals[key])) + } this.$store.setKey(key, vals[key]) } + this.$store.setKey( + 'accounts', + [vals.address, vals.paymentAddress].filter(Boolean) + ) } watchStateChange( @@ -55,16 +66,12 @@ export default class LeatherProvider extends WalletProvider { _: LaserEyesStoreType | undefined, changedKey: keyof LaserEyesStoreType | undefined ) { - if (changedKey && newState.provider === LEATHER) { - if (changedKey === 'balance') { - this.$valueStore.setKey('balance', newState.balance?.toString() ?? '') - } else if ((keysToPersist as readonly string[]).includes(changedKey)) { - this.$valueStore.setKey( - changedKey as PersistedKey, - newState[changedKey]?.toString() ?? '' - ) - } - } + handleStateChangePersistence( + LEATHER, + newState, + changedKey, + this.$valueStore + ) } initialize() { @@ -107,6 +114,20 @@ export default class LeatherProvider extends WalletProvider { } async connect(_: ProviderType): Promise { + const { address, paymentAddress } = this.$valueStore!.get() + + if (address) { + if (address.startsWith('tb1') && isMainnetNetwork(this.network)) { + this.disconnect() + } else { + this.restorePersistedValues() + getBTCBalance(paymentAddress, this.network).then((totalBalance) => { + this.$store.setKey('balance', totalBalance) + }) + return + } + } + if (!this.library) throw new Error("Leather isn't installed") const getAddressesResponse: LeatherRPCResponse = await this.library.request('getAddresses') @@ -144,8 +165,6 @@ export default class LeatherProvider extends WalletProvider { this.$store.setKey('paymentAddress', segwitAddress.address) this.$store.setKey('publicKey', taprootAddress.publicKey) this.$store.setKey('paymentPublicKey', segwitAddress.publicKey) - this.$store.setKey('provider', LEATHER) - this.$store.setKey('connected', true) } async getNetwork() { diff --git a/packages/lasereyes-core/src/client/providers/okx.ts b/packages/lasereyes-core/src/client/providers/okx.ts index d83e631..b9de257 100644 --- a/packages/lasereyes-core/src/client/providers/okx.ts +++ b/packages/lasereyes-core/src/client/providers/okx.ts @@ -15,7 +15,8 @@ import { } from '../..' import { listenKeys, MapStore } from 'nanostores' import { persistentMap } from '@nanostores/persistent' -import { keysToPersist, PersistedKey } from '../utils' +import { handleStateChangePersistence, keysToPersist, PersistedKey } from '../utils' +import { getBTCBalance, isMainnetNetwork } from '../../lib/helpers' const OKX_WALLET_PERSISTENCE_KEY = 'OKX_CONNECTED_WALLET_STATE' @@ -56,8 +57,15 @@ export default class OkxProvider extends WalletProvider { restorePersistedValues() { const vals = this.$valueStore.get() for (const key of keysToPersist) { + if (key === 'balance') { + this.$store.setKey(key, BigInt(vals[key])) + } this.$store.setKey(key, vals[key]) } + this.$store.setKey( + 'accounts', + [vals.address, vals.paymentAddress].filter(Boolean) + ) } watchStateChange( @@ -65,16 +73,7 @@ export default class OkxProvider extends WalletProvider { _: LaserEyesStoreType | undefined, changedKey: keyof LaserEyesStoreType | undefined ) { - if (changedKey && newState.provider === OKX) { - if (changedKey === 'balance') { - this.$valueStore.setKey('balance', newState.balance?.toString() ?? '') - } else if ((keysToPersist as readonly string[]).includes(changedKey)) { - this.$valueStore.setKey( - changedKey as PersistedKey, - newState[changedKey]?.toString() ?? '' - ) - } - } + handleStateChangePersistence(OKX, newState, changedKey, this.$valueStore) } initialize(): void { @@ -118,6 +117,20 @@ export default class OkxProvider extends WalletProvider { } async connect(_: ProviderType): Promise { + const { address, paymentAddress } = this.$valueStore!.get() + + if (address) { + if (address.startsWith('tb1') && isMainnetNetwork(this.network)) { + this.disconnect() + } else { + this.restorePersistedValues() + getBTCBalance(paymentAddress, this.network).then((totalBalance) => { + this.$store.setKey('balance', totalBalance) + }) + return + } + } + try { const okxAccounts = await this.library.connect() if (!okxAccounts) throw new Error('No accounts found') @@ -127,8 +140,6 @@ export default class OkxProvider extends WalletProvider { this.$store.setKey('publicKey', okxAccounts.publicKey) this.$store.setKey('paymentPublicKey', okxAccounts.publicKey) this.$store.setKey('accounts', [okxAccounts]) - this.$store.setKey('provider', OKX) - this.$store.setKey('connected', true) } catch (e) { throw e } diff --git a/packages/lasereyes-core/src/client/providers/orange.ts b/packages/lasereyes-core/src/client/providers/orange.ts index 0df9007..8c3c5f7 100644 --- a/packages/lasereyes-core/src/client/providers/orange.ts +++ b/packages/lasereyes-core/src/client/providers/orange.ts @@ -32,7 +32,7 @@ import { import { MapStore, listenKeys } from 'nanostores' import { persistentMap } from '@nanostores/persistent' -import { keysToPersist, PersistedKey } from '../utils' +import { handleStateChangePersistence, keysToPersist, PersistedKey } from '../utils' const { signMessage: signMessageOrange, sendBtcTransaction: sendBtcTxOrange } = orange @@ -64,8 +64,15 @@ export default class OrangeProvider extends WalletProvider { restorePersistedValues() { const vals = this.$valueStore.get() for (const key of keysToPersist) { + if (key === 'balance') { + this.$store.setKey(key, BigInt(vals[key])) + } this.$store.setKey(key, vals[key]) } + this.$store.setKey( + 'accounts', + [vals.address, vals.paymentAddress].filter(Boolean) + ) } watchStateChange( @@ -73,16 +80,12 @@ export default class OrangeProvider extends WalletProvider { _: LaserEyesStoreType | undefined, changedKey: keyof LaserEyesStoreType | undefined ) { - if (changedKey && newState.provider === ORANGE) { - if (changedKey === 'balance') { - this.$valueStore.setKey('balance', newState.balance?.toString() ?? '') - } else if ((keysToPersist as readonly string[]).includes(changedKey)) { - this.$valueStore.setKey( - changedKey as PersistedKey, - newState[changedKey]?.toString() ?? '' - ) - } - } + handleStateChangePersistence( + ORANGE, + newState, + changedKey, + this.$valueStore + ) } initialize(): void { diff --git a/packages/lasereyes-core/src/client/providers/oyl.ts b/packages/lasereyes-core/src/client/providers/oyl.ts index febfe12..a3f83c1 100644 --- a/packages/lasereyes-core/src/client/providers/oyl.ts +++ b/packages/lasereyes-core/src/client/providers/oyl.ts @@ -1,12 +1,21 @@ import * as bitcoin from 'bitcoinjs-lib' import { UNSUPPORTED_PROVIDER_METHOD_ERROR, WalletProvider } from '.' import { ProviderType, NetworkType } from '../../types' -import { createSendBtcPsbt, isTestnetNetwork } from '../../lib/helpers' +import { + createSendBtcPsbt, + getBTCBalance, + isMainnetNetwork, + isTestnetNetwork, +} from '../../lib/helpers' import { OYL } from '../../constants/wallets' import { listenKeys, MapStore } from 'nanostores' import { persistentMap } from '@nanostores/persistent' import { LaserEyesStoreType } from '../types' -import { keysToPersist, PersistedKey } from '../utils' +import { + handleStateChangePersistence, + keysToPersist, + PersistedKey, +} from '../utils' const OYL_WALLET_PERSISTENCE_KEY = 'OYL_CONNECTED_WALLET_STATE' @@ -36,8 +45,15 @@ export default class OylProvider extends WalletProvider { restorePersistedValues() { const vals = this.$valueStore.get() for (const key of keysToPersist) { + if (key === 'balance') { + this.$store.setKey(key, BigInt(vals[key])) + } this.$store.setKey(key, vals[key]) } + this.$store.setKey( + 'accounts', + [vals.address, vals.paymentAddress].filter(Boolean) + ) } watchStateChange( @@ -45,16 +61,7 @@ export default class OylProvider extends WalletProvider { _: LaserEyesStoreType | undefined, changedKey: keyof LaserEyesStoreType | undefined ) { - if (changedKey && newState.provider === OYL) { - if (changedKey === 'balance') { - this.$valueStore.setKey('balance', newState.balance?.toString() ?? '') - } else if ((keysToPersist as readonly string[]).includes(changedKey)) { - this.$valueStore.setKey( - changedKey as PersistedKey, - newState[changedKey]?.toString() ?? '' - ) - } - } + handleStateChangePersistence(OYL, newState, changedKey, this.$valueStore) } initialize() { @@ -97,6 +104,20 @@ export default class OylProvider extends WalletProvider { } async connect(_: ProviderType): Promise { + const { address, paymentAddress } = this.$valueStore!.get() + + if (address) { + if (address.startsWith('tb1') && isMainnetNetwork(this.network)) { + this.disconnect() + } else { + this.restorePersistedValues() + getBTCBalance(paymentAddress, this.network).then((totalBalance) => { + this.$store.setKey('balance', totalBalance) + }) + return + } + } + if (!this.library) throw new Error("Oyl isn't installed") if (isTestnetNetwork(this.network)) { throw new Error(`${this.network} is not supported by Oyl`) @@ -108,8 +129,6 @@ export default class OylProvider extends WalletProvider { this.$store.setKey('paymentAddress', nativeSegwit.address) this.$store.setKey('publicKey', taproot.publicKey) this.$store.setKey('paymentPublicKey', nativeSegwit.publicKey) - this.$store.setKey('provider', OYL) - this.$store.setKey('connected', true) } async getNetwork() { @@ -171,7 +190,11 @@ export default class OylProvider extends WalletProvider { } async getPublicKey() { - return await this.library?.getPublicKey() + const { nativeSegwit, taproot } = await this.library.getAddresses() + if (!nativeSegwit || !taproot) throw new Error('No accounts found') + this.$store.setKey('publicKey', taproot.publicKey) + this.$store.setKey('paymentPublicKey', nativeSegwit.publicKey) + return taproot.publicKey } async getBalance() { const { total } = await this.library.getBalance() @@ -186,7 +209,7 @@ export default class OylProvider extends WalletProvider { } async requestAccounts(): Promise { - return await this.library.requestAccounts() + return [this.$store.get().address, this.$store.get().paymentAddress] } async switchNetwork(): Promise { diff --git a/packages/lasereyes-core/src/client/providers/sparrow.ts b/packages/lasereyes-core/src/client/providers/sparrow.ts index a7158a8..df39eca 100644 --- a/packages/lasereyes-core/src/client/providers/sparrow.ts +++ b/packages/lasereyes-core/src/client/providers/sparrow.ts @@ -8,7 +8,11 @@ import { getBTCBalance, isMainnetNetwork, } from '../../lib/helpers' -import { keysToPersist, PersistedKey } from '../utils' +import { + handleStateChangePersistence, + keysToPersist, + PersistedKey, +} from '../utils' import { persistentMap } from '@nanostores/persistent' import { LaserEyesStoreType, SparrowWalletProvider } from '../types' import { DefaultSparrowWalletProvider } from '../helpers/sparrow' @@ -82,23 +86,26 @@ export default class SparrowProvider extends WalletProvider { _: LaserEyesStoreType | undefined, changedKey: keyof LaserEyesStoreType | undefined ) { - if (changedKey && newState.provider === SPARROW) { - if (changedKey === 'balance') { - this.$valueStore.setKey('balance', newState.balance?.toString() ?? '') - } else if ((keysToPersist as readonly string[]).includes(changedKey)) { - this.$valueStore.setKey( - changedKey as PersistedKey, - newState[changedKey]?.toString() ?? '' - ) - } - } + handleStateChangePersistence( + SPARROW, + newState, + changedKey, + this.$valueStore + ) } restorePersistedValues() { const vals = this.$valueStore.get() for (const key of keysToPersist) { + if (key === 'balance') { + this.$store.setKey(key, BigInt(vals[key])) + } this.$store.setKey(key, vals[key]) } + this.$store.setKey( + 'accounts', + [vals.address, vals.paymentAddress].filter(Boolean) + ) } dispose() { @@ -114,8 +121,6 @@ export default class SparrowProvider extends WalletProvider { this.disconnect() } else { this.restorePersistedValues() - this.$store.setKey('provider', SPARROW) - this.$store.setKey('connected', true) return } } @@ -135,8 +140,8 @@ export default class SparrowProvider extends WalletProvider { this.$store.setKey('publicKey', publicKey) this.$store.setKey('paymentPublicKey', publicKey) } catch (error) { - this.disconnect() - console.error('Error during connect:', error) + console.error('Error during sparrow connect:', error) + throw error } } diff --git a/packages/lasereyes-core/src/client/providers/unisat.ts b/packages/lasereyes-core/src/client/providers/unisat.ts index 16d303d..4de0c36 100644 --- a/packages/lasereyes-core/src/client/providers/unisat.ts +++ b/packages/lasereyes-core/src/client/providers/unisat.ts @@ -105,8 +105,6 @@ export default class UnisatProvider extends WalletProvider { this.$store.setKey('paymentAddress', unisatAccounts[0]) this.$store.setKey('publicKey', unisatPubKey) this.$store.setKey('paymentPublicKey', unisatPubKey) - this.$store.setKey('provider', UNISAT) - this.$store.setKey('connected', true) } async getNetwork() { diff --git a/packages/lasereyes-core/src/lib/inscribe.ts b/packages/lasereyes-core/src/lib/inscribe.ts index f441927..d114d42 100644 --- a/packages/lasereyes-core/src/lib/inscribe.ts +++ b/packages/lasereyes-core/src/lib/inscribe.ts @@ -180,7 +180,6 @@ export const getCommitPsbt = async ({ let counter = 0 for await (const utxo of filteredUtxos) { const paymentAddressType = getAddressType(paymentAddress, network) - console.log({ paymentAddressType }) psbt.addInput({ hash: utxo.txid, index: utxo.vout, diff --git a/packages/lasereyes-react/package.json b/packages/lasereyes-react/package.json index d9a0496..91c88f9 100644 --- a/packages/lasereyes-react/package.json +++ b/packages/lasereyes-react/package.json @@ -1,7 +1,7 @@ { "name": "@omnisat/lasereyes-react", "private": false, - "version": "0.0.55", + "version": "0.0.56-rc.0", "type": "module", "main": "./dist/index.umd.cjs", "module": "./dist/index.js", diff --git a/packages/lasereyes/package.json b/packages/lasereyes/package.json index f9ecc49..bda68c9 100644 --- a/packages/lasereyes/package.json +++ b/packages/lasereyes/package.json @@ -20,7 +20,7 @@ "url": "https://github.com/omnisat/lasereyes-mono.git" }, "private": false, - "version": "0.0.138", + "version": "0.0.139-rc.3", "type": "module", "main": "./dist/index.umd.cjs", "module": "./dist/index.js", @@ -56,4 +56,4 @@ "publishConfig": { "access": "public" } -} \ No newline at end of file +}