From 58daca4c760563b07e933b0884cbfeec8d573db2 Mon Sep 17 00:00:00 2001 From: zintarh Date: Sat, 9 Nov 2024 15:25:31 +0100 Subject: [PATCH 1/7] chore: updates --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a6ee670..da08aae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tokenbound-connectkit-test", - "version": "1.0.2", + "version": "1.0.3", "repository": "https://github.com/horuslabsio/tba-connector-v2", "private": false, "browser": { From 0dcaaa93a4e48ff8cb7f19c2bd6e8aebf1d10902 Mon Sep 17 00:00:00 2001 From: zintarh Date: Thu, 14 Nov 2024 09:22:49 +0100 Subject: [PATCH 2/7] chore: code optimization --- .../controllerStarknetWindowObject.ts | 3 + .../getControllerStarknetWindowObject.ts | 5 +- src/errors/index.ts | 2 +- src/modal/Controller.svelte | 3 - src/modal/TokenboundModal.svelte | 229 ++++++++++++++++++ static/bg.png | Bin 0 -> 77189 bytes tailwind.config.cjs | 6 + vite.config.ts | 19 +- 8 files changed, 255 insertions(+), 12 deletions(-) create mode 100644 src/modal/TokenboundModal.svelte create mode 100644 static/bg.png diff --git a/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts b/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts index 3298980..3e920d8 100644 --- a/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts +++ b/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts @@ -115,7 +115,9 @@ export async function updateStarknetWindowObject( tokenboundAddress: string, account: Account, ): Promise { + const { id, name, version } = wallet + const tbaVersion = await checkTbaVersion(provider, tokenboundAddress, chainId) const valuesToAssign: Pick< @@ -172,6 +174,7 @@ class TokenboundControllerAccount extends Account implements AccountInterface { ? call.calldata : CallData.compile(call.calldata as RawArgs), })) + let callToBeExecuted: Call = { contractAddress: this.address, entrypoint: this.tbaVersion == "V2" ? "__execute__" : "execute", diff --git a/src/connectors/tokenboundAccount/controller/getControllerStarknetWindowObject.ts b/src/connectors/tokenboundAccount/controller/getControllerStarknetWindowObject.ts index 1aff7a3..40451a1 100644 --- a/src/connectors/tokenboundAccount/controller/getControllerStarknetWindowObject.ts +++ b/src/connectors/tokenboundAccount/controller/getControllerStarknetWindowObject.ts @@ -1,4 +1,4 @@ -import { Account, ProviderInterface } from "starknet" +import { Account, RpcProvider } from "starknet" import { TOKENBOUND_ACCOUNT_ICON } from "../constants" import { TBAStarknetWindowObject } from "../types/connector" import { getTokenboundControllerStarknetWindowObject } from "./controllerStarknetWindowObject" @@ -6,7 +6,7 @@ import { getTokenboundControllerStarknetWindowObject } from "./controllerStarkne interface Options { address: string account: Account - provider: ProviderInterface + provider: RpcProvider chainId: string } @@ -17,6 +17,7 @@ export const getTokenboundAccountController = async ({ chainId, }: Options): Promise => { const globalWindow = typeof window !== "undefined" ? window : undefined + if (!globalWindow) { throw new Error("window is not defined") } diff --git a/src/errors/index.ts b/src/errors/index.ts index 5d78683..ebda897 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -30,7 +30,7 @@ export class GetTBAOwnerFailure extends Error { export class NotTokenboundAccountOwner extends Error { name = "NotTokenboundAccountOwner" - message = "User is not the Token Bound Account owner." + message = "Selected wallet isn’t the tokenbound account owner" } export class NotAuthorizedError extends Error { diff --git a/src/modal/Controller.svelte b/src/modal/Controller.svelte index 7bec0a2..5884618 100644 --- a/src/modal/Controller.svelte +++ b/src/modal/Controller.svelte @@ -43,7 +43,6 @@ rpc, }) - let loading: boolean = true async function connect() { try { @@ -61,7 +60,5 @@ hideModal() await controller.probe() await connect() - - loading = false }) diff --git a/src/modal/TokenboundModal.svelte b/src/modal/TokenboundModal.svelte new file mode 100644 index 0000000..b24daf1 --- /dev/null +++ b/src/modal/TokenboundModal.svelte @@ -0,0 +1,229 @@ + + + diff --git a/static/bg.png b/static/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..d90a22fe6a5932fe21c61c773647a3baf4c21d31 GIT binary patch literal 77189 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 C8WH~h literal 0 HcmV?d00001 diff --git a/tailwind.config.cjs b/tailwind.config.cjs index b3a73ef..2a998eb 100644 --- a/tailwind.config.cjs +++ b/tailwind.config.cjs @@ -8,6 +8,12 @@ module.exports = { "list-item": "0px 2px 12px rgba(0, 0, 0, 0.12)", modal: "0px 4px 20px rgba(0, 0, 0, 0.5)", }, + colors:{ + primary: "red" + }, + backgroundImage: { + "overlay": "url('/bg.png')", + }, }, }, plugins: [], diff --git a/vite.config.ts b/vite.config.ts index 22532a0..cb4e7df 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,8 @@ -import { resolve } from "path" - -import { svelte } from "@sveltejs/vite-plugin-svelte" -import { defineConfig } from "vite" -import dts from "vite-plugin-dts" +import { resolve } from "path"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; +import { defineConfig } from "vite"; +import dts from "vite-plugin-dts"; +import replace from "@rollup/plugin-replace"; // Use the Rollup version of replace // https://vitejs.dev/config/ export default defineConfig({ @@ -29,5 +29,12 @@ export default defineConfig({ entryRoot: resolve(__dirname, "src"), insertTypesEntry: true, }), + replace({ + preventAssignment: true, + // Replace eval with a no-op function to bypass eval usage + values: { + 'eval': '(() => {})' + } + }), ], -}) +}); From 83d33e30fe21c529c33ac7af45b55330f46075a6 Mon Sep 17 00:00:00 2001 From: zintarh Date: Thu, 14 Nov 2024 09:23:21 +0100 Subject: [PATCH 3/7] chore: fix tba ownership --- .../tokenboundAccount/helpers/utils.ts | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/connectors/tokenboundAccount/helpers/utils.ts b/src/connectors/tokenboundAccount/helpers/utils.ts index 46b0a01..1f30ce7 100644 --- a/src/connectors/tokenboundAccount/helpers/utils.ts +++ b/src/connectors/tokenboundAccount/helpers/utils.ts @@ -12,7 +12,7 @@ import { TokenboundClient, } from "starknet-tokenbound-sdk" import { GetClassHashError, GetTBAOwnerError } from "../../../errors" -import sn from "@starknet-io/get-starknet-core" +// import sn from "@starknet-io/get-starknet-core" export async function getTokenBoundClassHash( provider: Provider, @@ -68,8 +68,9 @@ export default async function hasAccountOwnership( try { const owner = await tokenbound.getOwner({ tbaAddress: tokenboundAddress }) const account = num.toHex(owner) - if (account) { - return account === parentAccountAddress + const formatedParentAddress = num.toHex(parentAccountAddress ?? "") + if (account && formatedParentAddress) { + return account === formatedParentAddress } return false } catch (e) { @@ -77,6 +78,8 @@ export default async function hasAccountOwnership( } } + + export async function waitForWalletAccountAddress( walletAccount: WalletAccount, delay = 500, @@ -98,16 +101,16 @@ export async function waitForWalletAccountAddress( return checkAddress() } -export async function hasApprove(parentAccountId: string): Promise { - const authorizedWallets = await sn.getAuthorizedWallets() - const authorizedWallet = authorizedWallets.find( - (w) => w.id === parentAccountId, - ) - if (authorizedWallet) { - return true - } - return false -} +// export async function hasApprove(parentAccountId: string): Promise { +// const authorizedWallets = await sn.getAuthorizedWallets() +// const authorizedWallet = authorizedWallets.find( +// (w) => w.id === parentAccountId, +// ) +// if (authorizedWallet) { +// return true +// } +// return false +// } export async function checkTbaVersion( provider: RpcProvider, From a7e36c27697807c3a81d801545ce8c08e34144b6 Mon Sep 17 00:00:00 2001 From: zintarh Date: Thu, 21 Nov 2024 13:19:06 +0100 Subject: [PATCH 4/7] chore: complete integration of catridge controller --- package.json | 8 +- {static => src/assets/images}/bg.png | Bin src/assets/tbaLogo.svelte | 18 ++ .../controllerStarknetWindowObject.ts | 28 ++- .../helpers/openTokenboundwallet.ts | 235 +++++++++--------- src/connectors/tokenboundAccount/index.ts | 9 +- .../tokenboundStarknetWindowObject.ts | 4 +- .../tokenboundAccount/webwallet/constants.ts | 2 +- src/errors/index.ts | 2 +- src/main.ts | 8 +- src/modal/Controller.svelte | 8 +- src/modal/TokenboundModal.svelte | 24 +- tailwind.config.cjs | 3 +- 13 files changed, 186 insertions(+), 163 deletions(-) rename {static => src/assets/images}/bg.png (100%) create mode 100644 src/assets/tbaLogo.svelte diff --git a/package.json b/package.json index da08aae..8aae7ca 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "tokenbound-connectkit-test", - "version": "1.0.3", - "repository": "https://github.com/horuslabsio/tba-connector-v2", + "name": "tokenbound-connectkit", + "version": "2.0.0", + "repository": "https://github.com/horuslabsio/tba-connector", "private": false, "browser": { "crypto": false @@ -72,6 +72,7 @@ "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", + "@rollup/plugin-replace": "^6.0.1", "@semantic-release/git": "^10.0.1", "@sveltejs/vite-plugin-svelte": "^2.2.0", "@tsconfig/svelte": "^5.0.0", @@ -95,7 +96,6 @@ "prettier": "^3.3.3", "prettier-plugin-import-sort": "^0.0.7", "semantic-release": "^21.1.1", - "starknet": "^6.11.0", "svelte": "^4.2.19", "svelte-check": "^3.5.1", "svelte-preprocess": "^5.0.4", diff --git a/static/bg.png b/src/assets/images/bg.png similarity index 100% rename from static/bg.png rename to src/assets/images/bg.png diff --git a/src/assets/tbaLogo.svelte b/src/assets/tbaLogo.svelte new file mode 100644 index 0000000..d4c58d0 --- /dev/null +++ b/src/assets/tbaLogo.svelte @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts b/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts index 3e920d8..77c638f 100644 --- a/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts +++ b/src/connectors/tokenboundAccount/controller/controllerStarknetWindowObject.ts @@ -114,12 +114,13 @@ export async function updateStarknetWindowObject( wallet: StarknetWindowObject, tokenboundAddress: string, account: Account, -): Promise { - - const { id, name, version } = wallet +): Promise { + if (!account) { + return null + } + const { id, name, version } = wallet const tbaVersion = await checkTbaVersion(provider, tokenboundAddress, chainId) - const valuesToAssign: Pick< TBAStarknetWindowObject, | "id" @@ -152,9 +153,11 @@ export async function updateStarknetWindowObject( provider, } return Object.assign(wallet, valuesToAssign) + + } -class TokenboundControllerAccount extends Account implements AccountInterface { +class TokenboundControllerAccount extends Account { constructor( provider: ProviderInterface, public address: string, @@ -166,6 +169,7 @@ class TokenboundControllerAccount extends Account implements AccountInterface { override execute = async (calls: Call[]) => { try { const transactions = Array.isArray(calls) ? calls : [calls] + const txns = transactions.map((call) => ({ contractAddress: call.contractAddress, entrypoint: call.entrypoint, @@ -175,12 +179,14 @@ class TokenboundControllerAccount extends Account implements AccountInterface { : CallData.compile(call.calldata as RawArgs), })) - let callToBeExecuted: Call = { - contractAddress: this.address, - entrypoint: this.tbaVersion == "V2" ? "__execute__" : "execute", - calldata: CallData.compile({ txns }), - } - return await this.parentAccount.execute(callToBeExecuted) + return await this.parentAccount.execute([ + { + contractAddress: this.address, + entrypoint: this.tbaVersion == "V2" ? "__execute__" : "execute", + calldata: CallData.compile({ txns }) + }, + ]) + } catch (error) { console.log(error) throw new Error("Error while executing a transaction") diff --git a/src/connectors/tokenboundAccount/helpers/openTokenboundwallet.ts b/src/connectors/tokenboundAccount/helpers/openTokenboundwallet.ts index 3783520..2612e76 100644 --- a/src/connectors/tokenboundAccount/helpers/openTokenboundwallet.ts +++ b/src/connectors/tokenboundAccount/helpers/openTokenboundwallet.ts @@ -1,19 +1,14 @@ import { getTokenboundAccountStarknetObject } from "../starknetWindowObject/getTokenboundWalletStarknetObject" -import { createModal, hideModal } from "../starknetWindowObject/wormhole" import { openWebwallet } from "../webwallet/helpers/openWebwallet" import { TBAStarknetWindowObject } from "../types/connector" import { DEFAULT_WEBWALLET_URL, SEPOLIA_CHAIN_ID } from "../constants" -import { WebWalletStarknetWindowObject } from "../webwallet/starknetWindowObject/argentStarknetWindowObject" import { Account, num, RpcProvider } from "starknet" import ControllerModal from "../../../modal/Controller.svelte" +import TokenboundModal from "../../../modal/TokenboundModal.svelte" +import css from "../../../theme.css?inline" import { getTokenboundAccountController } from "../controller/getControllerStarknetWindowObject" import Controller from "@cartridge/controller" - -interface Options { - address: string - parentWallet: string - controller: Account -} +import { setPopupOptions } from "../webwallet/helpers/trpc" export const getTarget = (): ShadowRoot => { const modalId = "controller-modal-container" @@ -23,136 +18,154 @@ export const getTarget = (): ShadowRoot => { if (existingElement.shadowRoot) { return existingElement.shadowRoot } - // Remove existing element if no shadowRoot existingElement.remove() } + const element = document.createElement("div") + element.id = modalId + document.body.appendChild(element) + const target = element.attachShadow({ mode: "open" }) + return target +} + - // Create new container element and attach shadow DOM +const TokenboundModalTarget = (): ShadowRoot => { + const modalId = "tokenbound-modal-container" + const existingElement = document.getElementById(modalId) + if (existingElement) { + if (existingElement.shadowRoot) { + return existingElement.shadowRoot + } + existingElement.remove() + } const element = document.createElement("div") element.id = modalId document.body.appendChild(element) const target = element.attachShadow({ mode: "open" }) + target.innerHTML = `` return target } export const openTokenboundModal = async ( - origin: string, chainId: string, ): Promise< | { starknetWindowObject?: TBAStarknetWindowObject; controller?: Controller } | undefined > => { - const modalId = "tokenbound-account-modal" - const iframeId = "tokenbound-account-iframe" - - const existingIframe = document.getElementById(iframeId) - const existingModal = document.getElementById(modalId) - - if (existingIframe) existingIframe.remove() - if (existingModal) existingModal.remove() - - const { modal } = await createModal(origin, true) return new Promise< | { - starknetWindowObject?: TBAStarknetWindowObject - controller?: Controller - } + starknetWindowObject?: TBAStarknetWindowObject + controller?: Controller + } | undefined >((resolve) => { - window.addEventListener( - "message", - async (event: MessageEvent) => { - if (event.origin != origin) return - const { address, parentWallet }: Options = event.data - if (!parentWallet || !address) return - const wallet_id = parentWallet.toLowerCase() - const globalObject: Record = globalThis - let wallet: TBAStarknetWindowObject | undefined - - try { - // Check wallet type and instantiate wallet accordingly - if (wallet_id === "braavos" || wallet_id === "argentx") { - wallet = - globalObject[ - `starknet_${wallet_id === "argentx" ? "argentX" : wallet_id}` - ] - } - // Argent web wallet - else if (wallet_id === "argentwebwallet") { - const webWallet = - (await openWebwallet(DEFAULT_WEBWALLET_URL)) ?? null - await ( - webWallet as WebWalletStarknetWindowObject - ).connectWebwallet() - wallet = webWallet as TBAStarknetWindowObject + const modal = new TokenboundModal({ + target: TokenboundModalTarget(), + props: { + closeModal: () => { + modal.$destroy() + }, + + callback: async (options: { address: string, parentWallet: string }) => { + + const { address, parentWallet } = options; + + if (!parentWallet || !address) { + throw new Error("parent wallet or address is empty") } - // catridge controller - else if (wallet_id === "controller") { - let account: Account | null = null - const shadowTarget = getTarget() - new ControllerModal({ - target: shadowTarget, - props: { - onConnect: ( - connectedAccount: Account, - controller: Controller, - ) => { - account = connectedAccount - handleAccount(account, controller) - }, - hideModal: () => { - hideModal(modal) + const wallet_id = parentWallet.toLowerCase() + const globalObject: Record = globalThis + let wallet: TBAStarknetWindowObject | undefined + + try { + + // Check wallet type and instantiate wallet accordingly + if (wallet_id === "braavos" || wallet_id === "argentx") { + wallet = + globalObject[ + `starknet_${wallet_id === "argentx" ? "argentX" : wallet_id}` + ] + } + + // Argent web wallet + else if (wallet_id === "argentwebwallet") { + const origin = DEFAULT_WEBWALLET_URL; + setPopupOptions({ + origin, + location: "/interstitialLogin", + }) + const webWallet = (await openWebwallet(origin)) ?? null + wallet = webWallet as TBAStarknetWindowObject + } + + // catridge controller + else if (wallet_id === "controller") { + let account: Account | null = null + const shadowTarget = getTarget() + new ControllerModal({ + target: shadowTarget, + props: { + onConnect: ( + connectedAccount: Account, + controller: Controller, + ) => { + account = connectedAccount + handleAccount(account, controller) + }, + hideModal: () => { + modal.$destroy() + }, + rpc: + num.toHex(chainId) == SEPOLIA_CHAIN_ID + ? "https://api.cartridge.gg/x/starknet/sepolia" + : "https://api.cartridge.gg/x/starknet/mainnet", }, - rpc: - num.toHex(chainId) == SEPOLIA_CHAIN_ID - ? "https://api.cartridge.gg/x/starknet/sepolia" - : "https://api.cartridge.gg/x/starknet/mainnet", - }, - }) - - async function handleAccount( - account: Account | null, - controller: Controller, - ) { - const chainId = await account?.getChainId() - const provider = new RpcProvider({ - nodeUrl: account?.channel.nodeUrl, }) - if (account && chainId) { - const starknetWindowObject = - await getTokenboundAccountController({ - address, - account, - provider, - chainId, - }) - resolve({ starknetWindowObject, controller }) - hideModal(modal) + + async function handleAccount( + account: Account | null, + controller: Controller, + ) { + const chainId = await account?.getChainId() + const provider = new RpcProvider({ + nodeUrl: account?.channel.nodeUrl, + }) + if (account && chainId) { + const starknetWindowObject = + await getTokenboundAccountController({ + address, + account, + provider, + chainId, + }) + resolve({ starknetWindowObject, controller }) + modal.$destroy() + } } + return } - return - } - if (!wallet) { - alert("Wallet not found!") - return + + if (!wallet) { + alert("Wallet not found!") + return + } + + const starknetWindowObject = await getTokenboundAccountStarknetObject( + { + address, + wallet, + chainId, + },) + resolve({ starknetWindowObject }) + modal.$destroy() + } catch (error) { + console.error("Error handling wallet connection:", error) + resolve(undefined) + modal.$destroy() } - const starknetWindowObject = await getTokenboundAccountStarknetObject( - { - address, - wallet, - chainId, - }, - ) - resolve({ starknetWindowObject }) - hideModal(modal) - } catch (error) { - console.error("Error handling wallet connection:", error) - resolve(undefined) - hideModal(modal) } + }, - { once: true }, - ) + }) }) -} +} \ No newline at end of file diff --git a/src/connectors/tokenboundAccount/index.ts b/src/connectors/tokenboundAccount/index.ts index cd3264d..7642b8b 100644 --- a/src/connectors/tokenboundAccount/index.ts +++ b/src/connectors/tokenboundAccount/index.ts @@ -1,4 +1,3 @@ -import { type AccountChangeEventHandler } from "@starknet-io/get-starknet-core" import { AccountInterface, ProviderInterface, @@ -26,13 +25,12 @@ import { } from "../connector" import { DEFAULT_CHAIN_ID, - DEFAULT_TOKENBOUNDACCOUNT_URL, TOKENBOUND_ACCOUNT_ICON, } from "./constants" import { openTokenboundModal } from "./helpers/openTokenboundwallet" import { TBAStarknetWindowObject } from "./types/connector" import Controller from "@cartridge/controller" -import hasAccountOwnership from "./helpers/utils" +import { AccountChangeEventHandler } from "@starknet-io/get-starknet-core" export interface TokenboundConnectorOptions { chainId: string @@ -116,7 +114,6 @@ export class TokenboundConnector extends Connector { } if (this._controller) { - console.log(this._controller) this._controller.disconnect() } this._wallet = null @@ -154,15 +151,12 @@ export class TokenboundConnector extends Connector { throw new UserRejectedRequestError() } } - async initEventListener(accountChangeCb: AccountChangeEventHandler) { if (!this._wallet) { throw new ConnectorNotConnectedError() } - console.log(this.wallet) this._wallet.on("accountsChanged", accountChangeCb) } - async removeEventListener(accountChangeCb: AccountChangeEventHandler) { if (!this._wallet) { throw new ConnectorNotConnectedError() @@ -177,7 +171,6 @@ export class TokenboundConnector extends Connector { : BigInt(getStarknetChainId(DEFAULT_CHAIN_ID)) let _wallet = (await openTokenboundModal( - DEFAULT_TOKENBOUNDACCOUNT_URL, hexChainId.toString(), )) ?? null if (!_wallet) return diff --git a/src/connectors/tokenboundAccount/starknetWindowObject/tokenboundStarknetWindowObject.ts b/src/connectors/tokenboundAccount/starknetWindowObject/tokenboundStarknetWindowObject.ts index 838cf43..aa12bd4 100644 --- a/src/connectors/tokenboundAccount/starknetWindowObject/tokenboundStarknetWindowObject.ts +++ b/src/connectors/tokenboundAccount/starknetWindowObject/tokenboundStarknetWindowObject.ts @@ -42,7 +42,8 @@ export const getTokenboundStarknetWindowObject = ( parentWallet: StarknetWindowObject, chainId: string, ): TBAStarknetWindowObject => { - const network = chainId == SEPOLIA_CHAIN_ID ? "sepolia" : "mainnet" + + const network = chainId == SEPOLIA_CHAIN_ID ? "sepolia" : "mainnet" const provider = new RpcProvider({ nodeUrl: `https://starknet-${network}.g.alchemy.com/starknet/version/rpc/v0_7/4PHlmV2x26oj0up8xY3ZuqjhHb7mSvfQ`, }) @@ -87,7 +88,6 @@ export const getTokenboundStarknetWindowObject = ( on: (event, handleEvent) => { if (event === "accountsChanged") { - console.log(event) userEventHandlers.push({ type: event, handler: handleEvent as AccountChangeEventHandler, diff --git a/src/connectors/tokenboundAccount/webwallet/constants.ts b/src/connectors/tokenboundAccount/webwallet/constants.ts index 7b8c7c6..9ae0b22 100644 --- a/src/connectors/tokenboundAccount/webwallet/constants.ts +++ b/src/connectors/tokenboundAccount/webwallet/constants.ts @@ -13,7 +13,7 @@ export const DEFAULT_WEBWALLET_ICON = ` - ` +` export const TESTNET_WHITELIST_URL = "https://static.hydrogen.argent47.net/webwallet/iframe_whitelist_testnet.json" diff --git a/src/errors/index.ts b/src/errors/index.ts index ebda897..ddf85d6 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -30,7 +30,7 @@ export class GetTBAOwnerFailure extends Error { export class NotTokenboundAccountOwner extends Error { name = "NotTokenboundAccountOwner" - message = "Selected wallet isn’t the tokenbound account owner" + message = "Selected wallet is not owner of tokenbound account" } export class NotAuthorizedError extends Error { diff --git a/src/main.ts b/src/main.ts index d17c2da..dd1e678 100644 --- a/src/main.ts +++ b/src/main.ts @@ -32,6 +32,7 @@ export const connect = async ({ }: ConnectOptionsWithConnectors | ConnectOptions): Promise => { const { tokenboundOptions } = restOptions as ConnectOptions const { connectors } = restOptions as ConnectOptionsWithConnectors + selectedConnector = null const availableConnectors = !connectors || connectors.length === 0 @@ -40,6 +41,7 @@ export const connect = async ({ }) : connectors + const lastWalletId = localStorage.getItem("starknetLastConnectedWallet") if (modalMode === "neverAsk") { try { @@ -62,7 +64,6 @@ export const connect = async ({ throw new Error(error as any) } } - const installedWallets = await sn.getAvailableWallets(restOptions) // we return/display wallet options once per first-dapp (ever) connect if (modalMode === "canAsk") { @@ -103,6 +104,7 @@ export const connect = async ({ customOrder: connectors ? connectors?.length > 0 : false, }) + const getTarget = (): ShadowRoot => { const modalId = "starknetkit-modal-container" const existingElement = document.getElementById(modalId) @@ -137,6 +139,7 @@ export const connect = async ({ if (!selectedConnector) throw new ConnectorNotConnectedError() const connectorData = (await connector?.connect()) ?? null if (!selectedConnector.wallet) return + const { selectedAddress, parentAccount, @@ -144,6 +147,8 @@ export const connect = async ({ parentAccountId, provider, } = selectedConnector.wallet + + if (parentAccount) { const isOwnerOfTBA = await hasAccountOwnership( chainId, @@ -153,6 +158,7 @@ export const connect = async ({ ) if (!isOwnerOfTBA) throw new NotTokenboundAccountOwner() } + const wallet = resultType === "wallet" ? selectedConnector.wallet : null if (wallet) { diff --git a/src/modal/Controller.svelte b/src/modal/Controller.svelte index 5884618..02d0ada 100644 --- a/src/modal/Controller.svelte +++ b/src/modal/Controller.svelte @@ -1,13 +1,13 @@