Skip to content

createWallet

createWallet 函数用于初始化嵌入式钱包,并将 web3 provider 暴露给网页。

示例

ts
import { createWallet } from '@money-sdk/core'

const wallet = createWallet({
  appId: '<YOUR_APP_ID>',
  providers: {
    bitcoin: true,
    ethereum: true,
    solana: true,
  },
})

const ethereumProvider = await wallet.getProvider('ethereum')

ethereumProvider.request(/* ... */)

参考

appId

应用的标识符。它让你的集成拥有独立的配置 —— 允许的父 origin、特性开关 以及每个 dApp 的分析作用域。

INFO

仅在生产环境中才需要。注册流程请参阅 App ID 指南。在本地 开发时可以省略;钱包会以仅允许 localhost 的允许列表加载。

walletUrl

Drop 钱包 iframe 的 origin。默认为 https://dropwallet.app

只在需要指向预览部署或本地钱包实例时才覆盖此值 —— 生产环境的 dApp 应始终保留默认值。

signerUrl

用于 passkey 流程的 Drop signer 弹窗的 origin。默认指向规范的 signer。 适用规则与 walletUrl 相同。

providers

你希望向 dApp 暴露的 web3 provider 列表,以及它们的可选配置。

Ethereum 与 EVM 兼容链

默认情况下,会返回一个 EIP-1193 provider。

示例
ts
const wallet = createWallet({
  providers: {
    ethereum: true,
  },
})

const ethereumProvider = await wallet.getProvider('ethereum')

ethereumProvider.request(/* ... */)

此外,该 provider 会按照 EIP-6963 向网页宣告。如果 你想禁用这种行为,请传入 eip6963 选项。

示例
ts
const wallet = createWallet({
  providers: {
    ethereum: {
      eip6963: false,
    },
  },
})

如果你的 dApp 期望 provider 可在 window.ethereum 处获取,你也可以 通过传入 dangerouslyInjectWindow 选项将其注入到那里。

示例
ts
const wallet = createWallet({
  providers: {
    ethereum: {
      dangerouslyInjectWindow: true,
    },
  },
})

window.ethereum.request(/* ... */)

Solana

默认情况下,会返回一个 类 Phantom 的 provider。

示例
ts
const wallet = createWallet({
  providers: {
    solana: true,
  },
})

const solanaProvider = await wallet.getProvider('solana')

solanaProvider.connect()

此外,该 provider 会按照 Wallet Standard 向网页宣告。如果你想禁用这种行为,请传入 walletStandard 选项。

示例
ts
const wallet = createWallet({
  providers: {
    solana: {
      walletStandard: false,
    },
  },
})

如果你的 dApp 期望 provider 可在 window.solana 处获取,你也可以 通过传入 dangerouslyInjectWindow 选项将其注入到那里。

示例
ts
const wallet = createWallet({
  providers: {
    solana: {
      dangerouslyInjectWindow: true,
    },
  },
})

window.solana.connect()

Bitcoin

默认情况下,会返回一个 Sats Connect v1 provider。

示例
ts
const wallet = createWallet({
  providers: {
    bitcoin: true,
  },
})

const bitcoinProvider = await wallet.getProvider('bitcoin')

bitcoinProvider.connect(/* ... */)

此外,该 provider 会按照 Wallet Standard 向网页宣告。如果你想禁用这种行为,请传入 walletStandard 选项。

示例
ts
const wallet = createWallet({
  providers: {
    bitcoin: {
      walletStandard: false,
    },
  },
})

Universal

Drop 附带了一个通用 provider,让你可以为多链 dApp 使用单一的连接流程。 建议通过 Wallet Standard 与该 provider 交互。通用 provider 会以 Drop Universal 的名称注册自身。

示例
ts
import { createWallet } from '@money-sdk/core'

const wallet = createWallet({
  providers: {
    ethereum: true,
    solana: true,
    universal: true,
  },
})
tsx
import { useWallets, useConnect } from '@wallet-standard/react'
import { useMemo } from 'react'

const wallets = useWallets()
const universalWallet = useMemo(
  () => wallets.find(({ name }) => name === 'Drop Universal'),
  [wallets],
)

const [connecting, connect] = useConnect(universalWallet)

/** Connect Ethereum and Solana at the same time. */
const accounts = connect()

通用 provider 连接之后,你就可以像往常一样使用其他 provider。

INFO

通用 provider 只会连接那些同样在配置中启用的其他 provider。

此外,通用 provider 也可以从钱包实例上获取。

示例
ts
import { createWallet } from '@money-sdk/core'

const wallet = createWallet({
  providers: {
    bitcoin: true,
    ethereum: true,
    solana: true,
    universal: true,
  },
})

const provider = await wallet.getProvider('universal')

/** Connect Bitcoin, Ethereum and Solana at the same time. */
const accounts = provider.connect()

返回值

createWallet 返回一个 Wallet 实例,具有以下方法:

getProvider(chain)

返回一个 promise,解析为给定链('bitcoin''ethereum''solana''universal')的 web3 provider。如果该 provider 未在 providers 配置中启用,则解析为 null

renderWidget(element)

将钱包 iframe 挂载到特定的 DOM 元素上,以便用户看到钱包 UI。传入 null 可将 iframe 重新挂回到 document.body。React 绑定已通过 <WalletWidget> 为你处理好这一切。

setWidgetConfig(config)

将组件配置(theme、size、shape、compact)转发给嵌入式钱包。React 绑定已通过 <WalletWidget> 为你处理好这一切。

disconnect()

向 iframe 转发一条 wallet:disconnect 消息。如果你希望以编程方式让 用户登出而不必等待他们点击组件内的断开按钮,这会非常有用。