Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: improvements in siwx flow #3179

Merged
merged 14 commits into from
Nov 7, 2024
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .changeset/brave-countries-tie.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
'@reown/appkit-adapter-solana': patch
'@reown/appkit-scaffold-ui': patch
'@reown/appkit': patch
'@reown/appkit-core': patch
'@reown/appkit-siwx': patch
'@apps/demo': patch
'@apps/gallery': patch
'@apps/laboratory': patch
'@reown/appkit-adapter-ethers': patch
'@reown/appkit-adapter-ethers5': patch
'@reown/appkit-adapter-polkadot': patch
'@reown/appkit-adapter-wagmi': patch
'@reown/appkit-utils': patch
'@reown/appkit-cdn': patch
'@reown/appkit-common': patch
'@reown/appkit-experimental': patch
'@reown/appkit-polyfills': patch
'@reown/appkit-siwe': patch
'@reown/appkit-ui': patch
'@reown/appkit-wallet': patch
---

Fixes for improving SIWX initialization and flows
6 changes: 3 additions & 3 deletions packages/adapters/solana/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -477,14 +477,14 @@ export class SolanaAdapter implements ChainAdapter {
provider.chains.find(chain => chain.caipNetworkId === caipNetworkId) || provider.chains[0]

if (connectionChain) {
ProviderUtil.setProvider(this.chainNamespace, provider)
this.provider = provider

zoruka marked this conversation as resolved.
Show resolved Hide resolved
const caipAddress = `${connectionChain.caipNetworkId}:${address}` as const
this.appKit?.setCaipAddress(caipAddress, this.chainNamespace)

await this.switchNetwork(connectionChain)

ProviderUtil.setProvider(this.chainNamespace, provider)
this.provider = provider

switch (provider.type) {
case 'WALLET_CONNECT':
ProviderUtil.setProviderId(this.chainNamespace, 'walletConnect')
Expand Down
3 changes: 2 additions & 1 deletion packages/appkit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@
"@reown/appkit-utils": "workspace:*",
"@reown/appkit-wallet": "workspace:*",
"@walletconnect/types": "2.17.0",
"@walletconnect/utils": "2.17.0",
"@walletconnect/universal-provider": "2.17.0",
"@walletconnect/utils": "2.17.0",
"bs58": "6.0.0",
"valtio": "1.11.2",
"viem": "2.x"
},
Expand Down
34 changes: 29 additions & 5 deletions packages/appkit/src/universal-adapter/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import {
} from '@reown/appkit-common'
import { ProviderUtil } from '../store/index.js'
import type { AppKitOptions, AppKitOptionsWithCaipNetworks } from '../utils/TypesUtil.js'
import bs58 from 'bs58'

type Metadata = {
name: string
Expand Down Expand Up @@ -246,12 +247,35 @@ export class UniversalAdapterClient {
throw new Error('connectionControllerClient:signMessage - provider is undefined')
}

const signature = await provider.request({
method: 'personal_sign',
params: [message, address]
})
let signature = ''

if (
ChainController.state.activeCaipNetwork?.chainNamespace ===
CommonConstantsUtil.CHAIN.SOLANA
) {
const response = await provider.request(
{
method: 'solana_signMessage',
params: {
message: bs58.encode(new TextEncoder().encode(message)),
pubkey: address
}
},
ChainController.state.activeCaipNetwork?.caipNetworkId
)

signature = (response as { signature: string }).signature
} else {
signature = await provider.request(
{
method: 'personal_sign',
params: [message, address]
},
ChainController.state.activeCaipNetwork?.caipNetworkId
)
}
tomiir marked this conversation as resolved.
Show resolved Hide resolved

return signature as string
return signature
},

estimateGas: async () => await Promise.resolve(BigInt(0)),
Expand Down
54 changes: 25 additions & 29 deletions packages/core/src/controllers/ConnectionController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,18 +136,15 @@ export const ConnectionController = {
}
)
}

await this.initializeSWIXIfAvailable()
},

async connectExternal(options: ConnectExternalOptions, chain: ChainNamespace, setChain = true) {
await this._getClient(chain).connectExternal?.(options)

if (setChain) {
ChainController.setActiveNamespace(chain)
StorageUtil.setConnectedConnector(options.type)
}

await this.initializeSWIXIfAvailable()
},

async reconnectExternal(options: ConnectExternalOptions) {
Expand Down Expand Up @@ -250,19 +247,19 @@ export const ConnectionController = {
},

async disconnect() {
const connectionControllerClient = this._getClient()
try {
const connectionControllerClient = this._getClient()

const siwx = OptionsController.state.siwx
if (siwx) {
const activeCaipNetwork = ChainController.getActiveCaipNetwork()
const address = ChainController.getActiveCaipAddress()?.split(':')[2] || ''
const siwx = OptionsController.state.siwx
if (siwx) {
const activeCaipNetwork = ChainController.getActiveCaipNetwork()
const address = CoreHelperUtil.getPlainAddress(ChainController.getActiveCaipAddress())

if (activeCaipNetwork && address) {
siwx.revokeSession(activeCaipNetwork.caipNetworkId, address)
if (activeCaipNetwork && address) {
await siwx.revokeSession(activeCaipNetwork.caipNetworkId, address)
}
}
}

try {
await connectionControllerClient?.disconnect()
this.resetWcConnection()
} catch (error) {
Expand All @@ -277,7 +274,10 @@ export const ConnectionController = {
*/
async initializeSWIXIfAvailable() {
const siwx = OptionsController.state.siwx
if (!siwx) {
const address = CoreHelperUtil.getPlainAddress(ChainController.getActiveCaipAddress())
const network = ChainController.getActiveCaipNetwork()

if (!(siwx && address && network)) {
return
}

Expand All @@ -287,25 +287,21 @@ export const ConnectionController = {
return
}

const activeCaipNetwork = ChainController.getActiveCaipNetwork()
const client = this._getClient(activeCaipNetwork?.chainNamespace)
const client = this._getClient(network?.chainNamespace)

try {
if (!activeCaipNetwork) {
throw new Error('No active chain')
}

const address = ChainController.getActiveCaipAddress()?.split(':')[2] || ''

const sessions = await siwx.getSessions(activeCaipNetwork.caipNetworkId, address)
const sessions = await siwx.getSessions(network.caipNetworkId, address)
if (sessions.length) {
return
}

ModalController.open({ view: 'SIWXSignMessage' })
await ModalController.open({
view:
StorageUtil.getConnectedConnector() === 'AUTH' ? 'ApproveTransaction' : 'SIWXSignMessage'
})

const message = await siwx.createMessage({
chainId: activeCaipNetwork.caipNetworkId,
chainId: network.caipNetworkId,
accountAddress: address
})

Expand All @@ -320,10 +316,10 @@ export const ConnectionController = {
} catch (error) {
// eslint-disable-next-line no-console
console.error('Failed to initialize SIWX', error)

await client.disconnect()

throw error
ModalController.setLoading(true)
await client.disconnect().finally(() => {
ModalController.setLoading(false)
})
}
}
}
3 changes: 3 additions & 0 deletions packages/scaffold-ui/src/modal/w3m-modal/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
AccountController,
ApiController,
ChainController,
ConnectionController,
CoreHelperUtil,
EventsController,
ModalController,
Expand Down Expand Up @@ -198,6 +199,8 @@ export class W3mModal extends LitElement {

this.caipAddress = caipAddress

await ConnectionController.initializeSWIXIfAvailable()

if (nextConnected && !isSameAddress && this.isSiweEnabled) {
try {
const { SIWEController } = await import('@reown/appkit-siwe')
Expand Down
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading