Skip to content

Commit

Permalink
- Format
Browse files Browse the repository at this point in the history
  • Loading branch information
naorye2 committed Jan 15, 2024
1 parent d7308ab commit d5c025e
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 73 deletions.
4 changes: 2 additions & 2 deletions example/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { defineConfig } from "vite"
// https://vitejs.dev/config/
export default defineConfig({
build: {
target: 'es2020'
target: "es2020",
},
plugins: [react()],
optimizeDeps: { esbuildOptions: { target: 'es2020' } }
optimizeDeps: { esbuildOptions: { target: "es2020" } },
})
8 changes: 4 additions & 4 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
"dev": "vite build --watch",
"test": "vitest"
},
"dependencies": {
"@consensys/get-starknet": "1.0.0-dev-998a4b7-202312151810",
"@metamask/detect-provider": "^2.0.0"
},
"devDependencies": {
"c8": "^7.12.0",
"happy-dom": "^6.0.4",
Expand All @@ -46,9 +50,5 @@
"starknet": {
"optional": false
}
},
"dependencies": {
"@consensys/get-starknet": "1.0.0-dev-998a4b7-202312151810",
"@metamask/detect-provider": "^2.0.0"
}
}
36 changes: 18 additions & 18 deletions packages/core/src/StarknetWindowObject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ export type NetworkChangeEventHandler = (network?: string) => void

export type WalletEvents =
| {
type: "accountsChanged"
handler: AccountChangeEventHandler
}
type: "accountsChanged"
handler: AccountChangeEventHandler
}
| {
type: "networkChanged"
handler: NetworkChangeEventHandler
}
type: "networkChanged"
handler: NetworkChangeEventHandler
}

// EIP-747:
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-747.md
Expand Down Expand Up @@ -57,20 +57,20 @@ export interface SwitchStarknetChainParameter {

export type RpcMessage =
| {
type: "wallet_watchAsset"
params: WatchAssetParameters
result: boolean
}
type: "wallet_watchAsset"
params: WatchAssetParameters
result: boolean
}
| {
type: "wallet_addStarknetChain"
params: AddStarknetChainParameters
result: boolean
}
type: "wallet_addStarknetChain"
params: AddStarknetChainParameters
result: boolean
}
| {
type: "wallet_switchStarknetChain"
params: SwitchStarknetChainParameter
result: boolean
}
type: "wallet_switchStarknetChain"
params: SwitchStarknetChainParameter
result: boolean
}

export interface IStarknetWindowObject {
id: string
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/discovery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ const wallets: WalletProvider[] = [
"https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn",
firefox: "https://addons.mozilla.org/en-US/firefox/addon/ether-metamask/",
edge: "https://microsoftedge.microsoft.com/addons/detail/metamask/ejbalbakoplchlghecdalmeeeajnimhm?hl=en-US",
}
}
},
},
]

export default wallets
2 changes: 1 addition & 1 deletion packages/core/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export function getStarknet(
}
const lastConnectedStore = storageFactoryImplementation("gsw-last")

injectMetamaskBridge();
injectMetamaskBridge()

return {
getAvailableWallets: async (options = {}) => {
Expand Down
95 changes: 53 additions & 42 deletions packages/core/src/wallet/metamaskBridge.ts
Original file line number Diff line number Diff line change
@@ -1,69 +1,77 @@
import detectEthereumProvider from '@metamask/detect-provider';
import wallets, { WalletProvider } from '../discovery';
import type { MetaMaskProvider } from '@consensys/get-starknet/dist/type';
import { DisconnectedStarknetWindowObject, RpcMessage } from '../StarknetWindowObject';
import {
DisconnectedStarknetWindowObject,
RpcMessage,
} from "../StarknetWindowObject"
import wallets, { WalletProvider } from "../discovery"
import type { MetaMaskProvider } from "@consensys/get-starknet/dist/type"
import detectEthereumProvider from "@metamask/detect-provider"
import type { ProviderInterface } from "starknet"

class EmptyMetaMaskProvider implements DisconnectedStarknetWindowObject {
id: string;
name: string;
icon: string;
version = '0.0.0';
isConnected = false as const;
provider: undefined | ProviderInterface;
constructor(private metamaskProvider: MetaMaskProvider, walletInfo: WalletProvider) {
this.id = walletInfo.id;
this.name = walletInfo.name;
this.icon = walletInfo.icon;
id: string
name: string
icon: string
version = "0.0.0"
isConnected = false as const
provider: undefined | ProviderInterface
constructor(
private metamaskProvider: MetaMaskProvider,
walletInfo: WalletProvider,
) {
this.id = walletInfo.id
this.name = walletInfo.name
this.icon = walletInfo.icon
}
request<T extends RpcMessage>(): Promise<T["result"]> {
throw new Error('Wallet not enabled');
throw new Error("Wallet not enabled")
}
async enable(options?: { starknetVersion?: "v4" | "v5" }): Promise<string[]> {
const { MetaMaskSnapWallet } = await import('@consensys/get-starknet')
const metaMaskSnapWallet = new MetaMaskSnapWallet(this.metamaskProvider);

Object.assign(this, metaMaskSnapWallet);
this.constructor.prototype = metaMaskSnapWallet.constructor.prototype;
const { MetaMaskSnapWallet } = await import("@consensys/get-starknet")
const metaMaskSnapWallet = new MetaMaskSnapWallet(this.metamaskProvider)

return await this.enable(options);
Object.assign(this, metaMaskSnapWallet)
this.constructor.prototype = metaMaskSnapWallet.constructor.prototype

return await this.enable(options)
}
isPreauthorized() {
return Promise.resolve(false);
return Promise.resolve(false)
}
on() {
throw new Error('Wallet not enabled');
throw new Error("Wallet not enabled")
}
off() {
throw new Error('Wallet not enabled');
throw new Error("Wallet not enabled")
}
}

async function waitForEthereumProvider(options: { timeout?: number, retries?: number } = {}): Promise<MetaMaskProvider | null> {
const { timeout = 3000, retries = 0 } = options;
async function waitForEthereumProvider(
options: { timeout?: number; retries?: number } = {},
): Promise<MetaMaskProvider | null> {
const { timeout = 3000, retries = 0 } = options

let provider: MetaMaskProvider | null = null;
let provider: MetaMaskProvider | null = null
try {
provider = await detectEthereumProvider({ timeout });
provider = await detectEthereumProvider({ timeout })
} catch {
// Silent error - do nothing
}

if (provider) {
return provider;
return provider
}

if (retries === 0) {
return null;
return null
}

provider = await waitForEthereumProvider({ timeout, retries: retries - 1 })
return provider;
return provider
}

async function hasSnapSupport(provider: MetaMaskProvider) {
try {
await provider.request({ method: "wallet_getSnaps" });
await provider.request({ method: "wallet_getSnaps" })
return true
} catch {
return false
Expand All @@ -73,33 +81,36 @@ async function hasSnapSupport(provider: MetaMaskProvider) {
async function detectMetamaskSupport() {
const provider = await waitForEthereumProvider({ retries: 3 })
if (!provider) {
return null;
return null
}

const snapSupport = await hasSnapSupport(provider)
if (!snapSupport) {
return null;
return null
}

return provider;
return provider
}

async function injectMetamaskBridge() {
if (window.hasOwnProperty("starknet_metamask")) {
return;
return
}

const provider = await detectMetamaskSupport();
const provider = await detectMetamaskSupport()
if (!provider) {
return;
return
}

const metamaskWalletInfo = wallets.find(wallet => wallet.id === "metamask");
const metamaskWalletInfo = wallets.find((wallet) => wallet.id === "metamask")
if (!metamaskWalletInfo) {
return;
return
}

window.starknet_metamask = new EmptyMetaMaskProvider(provider, metamaskWalletInfo);
window.starknet_metamask = new EmptyMetaMaskProvider(
provider,
metamaskWalletInfo,
)
}

export { injectMetamaskBridge }
export { injectMetamaskBridge }
4 changes: 2 additions & 2 deletions packages/core/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export default defineConfig({
// the proper extensions will be added
fileName: "core",
},
target: 'es2020'
target: "es2020",
},
plugins: [
dts({
Expand All @@ -32,5 +32,5 @@ export default defineConfig({
exclude: ["**/node_modules/**", "**/*.mock.ts"],
},
},
optimizeDeps: { esbuildOptions: { target: 'es2020' } }
optimizeDeps: { esbuildOptions: { target: "es2020" } },
})
4 changes: 2 additions & 2 deletions packages/ui/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export default defineConfig({
// the proper extensions will be added
fileName: "ui",
},
target: 'es2020'
target: "es2020",
},
plugins: [
svelte({ emitCss: false }),
Expand All @@ -22,5 +22,5 @@ export default defineConfig({
insertTypesEntry: true,
}),
],
optimizeDeps: { esbuildOptions: { target: 'es2020' } }
optimizeDeps: { esbuildOptions: { target: "es2020" } },
})

0 comments on commit d5c025e

Please sign in to comment.