Skip to content
Open

o #1

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
4786715
o
Ryz0nd Aug 12, 2025
ed6ac90
Remove ewallet connect button and clean up integration
Ryz0nd Aug 12, 2025
c0c215b
o
Ryz0nd Aug 13, 2025
73ff1dc
Revert "o"
Ryz0nd Aug 13, 2025
203025c
o
Ryz0nd Aug 13, 2025
ba62e2a
o
Ryz0nd Aug 13, 2025
d8fb691
Revert "o"
Ryz0nd Aug 13, 2025
ad9c5ee
o
Ryz0nd Aug 13, 2025
b3e6c89
o
Ryz0nd Aug 14, 2025
0fa8409
o
Ryz0nd Aug 14, 2025
268bb19
o
Ryz0nd Aug 15, 2025
eaa6909
o
Ryz0nd Aug 18, 2025
fbb2b7e
o
Ryz0nd Aug 18, 2025
b29367d
o
Ryz0nd Aug 18, 2025
2e9f716
o
Ryz0nd Aug 18, 2025
d58f289
o
Ryz0nd Aug 18, 2025
abf0bf0
o
Ryz0nd Aug 18, 2025
fb55d6f
Revert "o"
Ryz0nd Aug 19, 2025
1e48a84
Reapply "o"
Ryz0nd Aug 19, 2025
5415dc8
o
Ryz0nd Aug 19, 2025
f4dd002
o
Ryz0nd Aug 19, 2025
f7490a7
EWalletMainWallet이 singleton인 것처럼 & init()이 한번만 실행되도록 임시 수정
Thunnini Aug 19, 2025
b16fcf4
Revert "EWalletMainWallet이 singleton인 것처럼 & init()이 한번만 실행되도록 임시 수정"
Ryz0nd Aug 19, 2025
98d2e48
o
Ryz0nd Aug 19, 2025
614f072
o
Ryz0nd Aug 19, 2025
b043956
o
Ryz0nd Aug 19, 2025
728d4b5
o
Ryz0nd Aug 19, 2025
45dd414
Revert "o"
Ryz0nd Aug 19, 2025
28e0bd6
o
Ryz0nd Aug 19, 2025
1b8658c
o
Ryz0nd Aug 19, 2025
90201f1
feature flag가 프로덕션에서도 개발 모드와 똑같은 값으로 설정되도록 수정
Thunnini Aug 19, 2025
f6572d6
o
Ryz0nd Aug 19, 2025
d4fef93
wagmi에 keplr-ewallet 추가 테스트 (어떤 이유로 yarn.lock은 업데이트 안함. 누가 해주기 바람...)
Thunnini Aug 20, 2025
defb606
disconnectAll 구현
Thunnini Aug 20, 2025
1cb2885
Update yarn.lock
Ryz0nd Aug 20, 2025
854cc01
타입 오류 해결
Thunnini Aug 20, 2025
5112ea3
EWalletMainWallet이 singleton인 것처럼 & init()이 한번만 실행되도록 임시 수정
Thunnini Aug 19, 2025
0bb1c25
cosmos ewallet이 한번만 init 되도록 수정
Thunnini Aug 20, 2025
9a00cf5
eth ewallet이 1초 후에 init 되도록 일단 수정 (QA로 넘기기 위해서...)
Thunnini Aug 20, 2025
c5d4c0e
Minor fix
Thunnini Aug 20, 2025
fde2d67
mobile view에서 ewallet을 선택할 수 있도록 수정
Thunnini Aug 21, 2025
fef957d
[build] bump up
blacktoast Aug 25, 2025
f347e43
initClient 간단화 & initCosmosEWallet를 동기로
Thunnini Aug 25, 2025
98e7fa6
initOnce()를 static으로 수정
Thunnini Aug 25, 2025
e35fb2b
타입오류 수정
Thunnini Aug 25, 2025
78614ee
[env] when it runs in local, sdk_url will be localhost
blacktoast Aug 26, 2025
8fcf955
Revert "[env] when it runs in local, sdk_url will be localhost"
Thunnini Aug 27, 2025
aa9dee0
[feat] update sdks versions
blacktoast Aug 27, 2025
3c1c97a
[fix] fix type
blacktoast Aug 27, 2025
b6a87b0
[build] bump up
blacktoast Aug 28, 2025
5863ed0
[build] bump up
blacktoast Aug 29, 2025
533c604
bump
Ryz0nd Sep 1, 2025
f03fa34
o
Ryz0nd Sep 1, 2025
0c7883e
o
Ryz0nd Sep 2, 2025
7820149
[build] bump up
blacktoast Sep 8, 2025
8c6b8b2
[fix] fix type error
blacktoast Sep 8, 2025
71bbae4
Thunnini Sep 10, 2025
59cf2c6
bump ewallet sdk version
piatoss3612 Sep 23, 2025
67eb6b0
bump ewallet sdk version
piatoss3612 Sep 29, 2025
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
5 changes: 4 additions & 1 deletion packages/web/components/navbar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,10 @@ const WalletInfo: FunctionComponent<
logEvent([EventName.Topnav.connectWalletClicked]);
onOpenWalletSelect({
walletOptions: [
{ walletType: "cosmos", chainId: accountStore.osmosisChainId },
{
walletType: "cosmos",
chainId: accountStore.osmosisChainId,
},
],
});
}}
Expand Down
5 changes: 4 additions & 1 deletion packages/web/config/generate-cosmos-kit-wallet-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import { xdefiExtensionInfo } from "@cosmos-kit/xdefi-extension";
import { isFunction } from "@osmosis-labs/utils";
import * as prettier from "prettier";

import { ewalletInfo } from "~/integrations/ewallet/registry";

type UpdateWalletMode =
| "ledger"
| "extension"
Expand All @@ -28,6 +30,7 @@ interface Wallet extends Omit<DefaultWallet, "mode"> {
}

const CosmosKitWalletList: Wallet[] = [
ewalletInfo as Wallet,
keplrExtensionInfo,
keplrMobileInfo,
leapExtensionInfo,
Expand Down Expand Up @@ -104,7 +107,7 @@ async function generateCosmosKitWalletList() {
wallet.name
}"`
).join(",")}}
export const CosmosKitWalletList: Record<AvailableCosmosWallets, Wallet> = ${getStringifiedWallet(
export const CosmosKitWalletList: Record<AvailableCosmosWallets, Wallet & { apiKey?: string }> = ${getStringifiedWallet(
registryObject
)}
`;
Expand Down
1 change: 1 addition & 0 deletions packages/web/config/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@ export function getChainList({
tx_page: explorer.tx_page.replace("${", "{"),
})),
keplrChain,
features: chain.features ?? [],
};
}
)
Expand Down
228 changes: 228 additions & 0 deletions packages/web/config/wagmi-keplr-ewallet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
import {
type EIP1193Provider,
EthEWallet,
type EthEWalletInterface,
} from "@keplr-ewallet/ewallet-sdk-eth";
import { getAddress, toHex } from "viem";
import { createConnector, CreateConnectorFn } from "wagmi";

const keplrIcon =
"data:image/png;base64,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";

export function keplrEWalletConnector(): CreateConnectorFn {
let initPromise: Promise<EthEWalletInterface> | null = null;

let ethEWallet: EthEWalletInterface | null = null;
let cachedProviderPromise: Promise<EIP1193Provider> | null = null;

const ensureInit = () => {
if (typeof window === "undefined") {
throw new Error("You are not in browser context");
}

if (!initPromise) {
initPromise = (async () => {
// XXX: 일단 QA를 할 수 있도록 대충 처리함.
// ewallet이 init이 동시에 여러개 발생하면 진행이 안되는 문제가 있는데
// sign-in 후에 refresh를 하면 cosmos 쪽의 init이 수행 중에 얘도 발생하게 됨.
// 둘이 꽤 떨어져 있는 코드라서 한번만 발생하도록 여기서 수정하기 힘들기 때문에
// 일단 1초를 기다리는 것으로 수정
await new Promise((resolve) => setTimeout(resolve, 1000));

console.log("keplr-ewallet: init");

// TODO: enable to override chain info when init ethereum wallet
const initRes = EthEWallet.init({
api_key:
"72bd2afd04374f86d563a40b814b7098e5ad6c7f52d3b8f84ab0c3d05f73ac6c",
sdk_endpoint: process.env.NEXT_PUBLIC_KEPLR_EWALLET_SDK_ENDPOINT,
use_testnet: true,
});
if (!initRes.success) {
throw new Error(`init fail: ${initRes.err}`);
}
console.log("keplr-ewallet: eth sdk init success");
ethEWallet = initRes.data;
return initRes.data;
})();
}
return initPromise;
};

return createConnector<EIP1193Provider>((config) => {
const wallet = {
id: "keplr-ewallet",
name: "Keplr E-Wallet",
type: "keplr-ewallet" as const,
icon: keplrIcon,
setup: async () => {
if (typeof window === "undefined") {
// You are in nextjs server.
return;
}
await ensureInit();
},
connect: async (parameters?: {
chainId?: number | undefined;
isReconnecting?: boolean | undefined;
}) => {
console.log("[keplr-ewallet] try to connect keplr e-wallet!");

const ethEWallet = await ensureInit();

let accounts = await wallet.getAccounts();

// if accounts is empty, try sign in
if (accounts.length === 0) {
// if is reconnecting, skip sign in with google
// only trigger by user manually interact with the connector
if (parameters?.isReconnecting) {
console.log(
"[keplr-ewallet] reconnecting ewallet, skip sign in with google"
);
return {
accounts,
chainId: await wallet.getChainId(),
};
}

console.log(
"[keplr-ewallet] no authenticated account, sign in with google"
);
await ethEWallet.eWallet.signIn("google");
}

const chainId = await wallet.getChainId();

if (parameters?.chainId && chainId !== parameters.chainId) {
await wallet.switchChain({ chainId: parameters.chainId });
}

// re-request accounts, there should be at least one account after sign in
accounts = await wallet.getAccounts();

console.log(
"[keplr-ewallet] connected with accounts ",
accounts.length > 0
);

return {
accounts,
chainId,
};
},
disconnect: async () => {
console.log("[keplr-ewallet] disconnect keplr e-wallet");
const provider = await wallet.getProvider();
if (!provider) {
throw new Error("Provider not found");
}

provider.removeListener("accountsChanged", wallet.onAccountsChanged);
provider.removeListener("chainChanged", wallet.onChainChanged);

await ethEWallet?.eWallet.signOut();
},
getAccounts: async () => {
console.log("[keplr-ewallet] handle `getAccounts`");
const provider = await wallet.getProvider();

if (!provider) {
throw new Error("Provider not found");
}

const accounts = await provider.request({
method: "eth_accounts",
});
return accounts.map((x: string) => getAddress(x));
},
getChainId: async () => {
console.log("[keplr-ewallet] handle `getChainId`");

const provider = await wallet.getProvider();

if (!provider) {
throw new Error("Provider not found");
}

const chainId = await provider.request({
method: "eth_chainId",
});
return Number(chainId);
},
getProvider: () => {
console.log("[keplr-ewallet] handle `getProvider`");
if (cachedProviderPromise) {
return cachedProviderPromise;
}

cachedProviderPromise = (async () => {
const ethEWallet = await ensureInit();

const provider = await ethEWallet.getEthereumProvider();

provider.on("chainChanged", (chainId: string) => {
wallet.onChainChanged(chainId);
});

provider.on("accountsChanged", (accounts: string[]) => {
wallet.onAccountsChanged(accounts);
});

return provider;
})().catch((e) => {
console.error(e);
cachedProviderPromise = null;
throw new Error(
"Failed to get provider, provider should not be found"
);
});

return cachedProviderPromise;
},
isAuthorized: async () => {
console.log("[keplr-ewallet] handle `isAuthorized`");
const accounts = await wallet.getAccounts();
return accounts.length > 0;
},
switchChain: async ({ chainId }: { chainId: number }) => {
console.log("[keplr-ewallet] handle `switchChain`", chainId);
const chain = config.chains.find((network) => network.id === chainId);
if (!chain) {
throw new Error(`Chain ${chainId} not found`);
}

const provider = await wallet.getProvider();

if (!provider) {
throw new Error("Provider not found");
}

await provider.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: toHex(chainId) }],
});

return chain;
},
onAccountsChanged: (accounts: string[]) => {
if (accounts.length === 0) {
wallet.onDisconnect();
} else {
config.emitter.emit("change", {
accounts: accounts.map((x: string) => getAddress(x)),
});
}
},
onChainChanged: (chainId: string | number) => {
const chainIdNumber = Number(chainId);
config.emitter.emit("change", { chainId: chainIdNumber });
},
onDisconnect: () => {
config.emitter.emit("disconnect");
},
};

return wallet;
});
}
2 changes: 2 additions & 0 deletions packages/web/config/wagmi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { createConfig, http } from "wagmi";
import { coinbaseWallet, metaMask, walletConnect } from "wagmi/connectors";

import { WALLETCONNECT_PROJECT_KEY } from "~/config/env";
import {keplrEWalletConnector} from "~/config/wagmi-keplr-ewallet";
import { theme } from "~/tailwind.config";

declare module "wagmi" {
Expand All @@ -25,6 +26,7 @@ export const wagmiConfig = createConfig({
},
injectProvider: false,
}),
keplrEWalletConnector(),
walletConnect({
projectId: WALLETCONNECT_PROJECT_KEY ?? "",
qrModalOptions: {
Expand Down
25 changes: 25 additions & 0 deletions packages/web/config/wallet-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,35 @@ import {
WalletConnectionInProgressError,
} from "@osmosis-labs/stores";

import { EWalletMainWallet } from "~/integrations/ewallet";
import { type EWalletInfo, ewalletInfo } from "~/integrations/ewallet/registry";

import { MainnetChainIds } from "./generated/chain-list";
import { CosmosKitWalletList } from "./generated/cosmos-kit-wallet-list";

export const CosmosWalletRegistry: CosmosRegistryWallet[] = [
{
name: "ewallet",
prettyName: "eWallet",
logo: "/wallets/keplr.svg",
mode: "extension",
mobileDisabled: false,
rejectMessage: {
source: "Request rejected",
},
lazyInstall: () =>
Promise.resolve(
class extends EWalletMainWallet {
constructor(walletInfo: EWalletInfo) {
// Ensure apiKey is passed to the constructor for keplr-ewallet too
super({ ...walletInfo, apiKey: ewalletInfo.apiKey });
}
}
),
stakeUrl: "https://wallet.keplr.app/chains/osmosis?tab=staking",
governanceUrl: "https://wallet.keplr.app/chains/osmosis?tab=governance",
features: ["notifications"],
},
{
...CosmosKitWalletList["keplr-extension"],
mobileDisabled: false,
Expand Down
20 changes: 7 additions & 13 deletions packages/web/hooks/use-feature-flags.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import { AvailableFlags } from "@osmosis-labs/types";
import { useFlags, useLDClient } from "launchdarkly-react-client-sdk";
import { useEffect, useState } from "react";

import { useWindowSize } from "~/hooks";

const defaultFlags: Record<AvailableFlags, boolean> = {
staking: true,
swapsAdBanner: true,
Expand Down Expand Up @@ -41,7 +39,7 @@ const defaultFlags: Record<AvailableFlags, boolean> = {

export function useFeatureFlags() {
const launchdarklyFlags: Record<AvailableFlags, boolean> = useFlags();
const { isMobile } = useWindowSize();
// const { isMobile } = useWindowSize();
const [isInitialized, setIsInitialized] = useState(false);
const client = useLDClient();

Expand All @@ -50,19 +48,15 @@ export function useFeatureFlags() {
client.waitForInitialization().then(() => setIsInitialized(true));
}, [isInitialized, client]);

const isDevModeWithoutClientID =
process.env.NODE_ENV === "development" &&
!process.env.NEXT_PUBLIC_LAUNCH_DARKLY_CLIENT_SIDE_ID;
// const isDevModeWithoutClientID =
// process.env.NODE_ENV === "development" &&
// !process.env.NEXT_PUBLIC_LAUNCH_DARKLY_CLIENT_SIDE_ID;

return {
...launchdarklyFlags,
...(isDevModeWithoutClientID ? defaultFlags : {}),
oneClickTrading: isDevModeWithoutClientID
? defaultFlags.oneClickTrading
: !isMobile &&
launchdarklyFlags.swapToolSimulateFee && // 1-Click trading is dependent on the swap tool simulate fee flag
launchdarklyFlags.oneClickTrading,
_isInitialized: isDevModeWithoutClientID ? true : isInitialized,
...defaultFlags,
oneClickTrading: defaultFlags.oneClickTrading,
_isInitialized: true,
_isClientIDPresent: !!process.env.NEXT_PUBLIC_LAUNCH_DARKLY_CLIENT_SIDE_ID,
} as Record<
AvailableFlags | "_isInitialized" | "_isClientIDPresent",
Expand Down
11 changes: 11 additions & 0 deletions packages/web/integrations/ewallet/chain-wallet.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import {
type ChainRecord,
ChainWalletBase,
type Wallet,
} from "@cosmos-kit/core";

export class ChainEWallet extends ChainWalletBase {
constructor(walletInfo: Wallet, chainInfo: ChainRecord) {
super(walletInfo, chainInfo);
}
}
Loading
Loading