diff --git a/.changeset/onekey-cardano-support.md b/.changeset/onekey-cardano-support.md new file mode 100644 index 00000000..16aa835c --- /dev/null +++ b/.changeset/onekey-cardano-support.md @@ -0,0 +1,5 @@ +--- +"@swapkit/wallet-extensions": minor +--- + +OneKey now connects Cardano on mainnet. diff --git a/packages/wallet-extensions/src/onekey/helpers.ts b/packages/wallet-extensions/src/onekey/helpers.ts index 47a3b307..ddd0198c 100644 --- a/packages/wallet-extensions/src/onekey/helpers.ts +++ b/packages/wallet-extensions/src/onekey/helpers.ts @@ -122,6 +122,30 @@ async function getTronWalletMethods() { return { ...getTronToolbox({ signer }), address }; } +async function getCardanoWalletMethods() { + const api = await getProvider("cardano", Chain.Cardano).enable(); + if ((await api.getNetworkId()) !== 1) throw mainnetOnlyError(Chain.Cardano); + + const { addCardanoVkeyWitnesses, decodeCardanoWitnessSet, getCardanoAddressFromBytes, getCardanoToolbox } = + await import("@swapkit/toolboxes/cardano"); + + const changeAddress = await api.getChangeAddress(); + const address = changeAddress.startsWith("addr") + ? changeAddress + : await getCardanoAddressFromBytes(hex.decode(changeAddress)); + + const signer = { + address, + connect: () => Promise.resolve({ address }), + disconnect: () => Promise.resolve(), + getAddress: () => Promise.resolve(address), + signTransaction: async (transaction: string) => + addCardanoVkeyWitnesses(transaction, await decodeCardanoWitnessSet(await api.signTx(transaction))), + }; + + return { ...getCardanoToolbox({ signer }), address }; +} + async function getStellarWalletMethods() { const provider = getProvider("stellar", Chain.Stellar); const { address } = await provider.getAddress(); @@ -211,6 +235,8 @@ export function getWalletMethods(chain: Chain): Promise = createWallet [Chain.Base]: { direct: true, typedData: true }, [Chain.BinanceSmartChain]: { direct: true, typedData: true }, [Chain.Bitcoin]: { direct: true }, + [Chain.Cardano]: { direct: true }, [Chain.Ethereum]: { direct: true, typedData: true }, [Chain.Gnosis]: { direct: true, typedData: true }, [Chain.Near]: { direct: true }, @@ -59,6 +60,7 @@ export const onekeyWallet: ExtensionWallet<"connectOnekeyWallet"> = createWallet Chain.Base, Chain.BinanceSmartChain, Chain.Bitcoin, + Chain.Cardano, Chain.Ethereum, Chain.Gnosis, Chain.Near, diff --git a/packages/wallet-extensions/src/onekey/types.ts b/packages/wallet-extensions/src/onekey/types.ts index c89936b4..a6a941fc 100644 --- a/packages/wallet-extensions/src/onekey/types.ts +++ b/packages/wallet-extensions/src/onekey/types.ts @@ -24,6 +24,12 @@ export type OneKeyTronProvider = { }; }; +export type OneKeyCardanoApi = { + getChangeAddress: () => Promise; + getNetworkId: () => Promise; + signTx: (transaction: string, partialSign?: boolean) => Promise; +}; + export type OneKeyStellarProvider = { getAddress: () => Promise<{ address: string }>; getNetwork: () => Promise<{ network: string; networkPassphrase: string }>; @@ -35,6 +41,7 @@ export type OneKeyStellarProvider = { export type OneKeyProviders = { btc?: OneKeyBtcProvider; + cardano?: { enable: () => Promise }; ethereum?: Eip1193Provider; jsBridge?: OneKeyJsBridge; solana?: SolanaProvider;