@chipi-stack/starknet-connector 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Chipi Pay
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # @chipi-stack/starknet-connector
2
+
3
+ **"Connect with Chipi"** — a [starknet-react](https://starknet-react.com) /
4
+ [get-starknet](https://github.com/starknet-io/get-starknet) connector that lets
5
+ any Starknet dApp connect to a **Chipi hosted smart-account wallet** (passkey,
6
+ gasless via paymaster). No browser extension, no WalletConnect — the same model
7
+ Argent/Ready's "Web Wallet" and Cartridge Controller use.
8
+
9
+ ```bash
10
+ npm install @chipi-stack/starknet-connector
11
+ ```
12
+
13
+ ## Use it
14
+
15
+ Add one connector to your `StarknetConfig`:
16
+
17
+ ```tsx
18
+ import { StarknetConfig, publicProvider } from "@starknet-react/core";
19
+ import { mainnet } from "@starknet-react/chains";
20
+ import { ChipiConnector } from "@chipi-stack/starknet-connector";
21
+
22
+ const connectors = [
23
+ new ChipiConnector(), // "Connect with Chipi"
24
+ // ...your other connectors (argent(), braavos(), ...)
25
+ ];
26
+
27
+ export function App({ children }) {
28
+ return (
29
+ <StarknetConfig chains={[mainnet]} provider={publicProvider()} connectors={connectors}>
30
+ {children}
31
+ </StarknetConfig>
32
+ );
33
+ }
34
+ ```
35
+
36
+ That's it. Your existing `useConnect` / `useAccount` flow now offers "Connect
37
+ with Chipi", and `account.signMessage(...)` / `account.execute(...)` route to the
38
+ user's Chipi wallet — **gasless**, signed with their passkey.
39
+
40
+ ## How it works
41
+
42
+ ```
43
+ your dApp Chipi hosted wallet (connect.chipipay.com)
44
+ ───────── ──────────────────────────────────────────
45
+ ChipiConnector.connect()
46
+ └─ opens a popup ───────────► /connect (the user's authenticated wallet)
47
+ └─ postMessage ◄──────────► approval UI (passkey + gasless paymaster)
48
+ account.execute(calls)
49
+ └─ wallet_addInvokeTransaction ─► user approves ─► sponsored tx ─► tx hash
50
+ ```
51
+
52
+ - The connector is **transport only** — it opens the hosted wallet in a popup and
53
+ forwards get-starknet `wallet_*` RPC calls over `postMessage`. It holds no
54
+ keys and signs nothing itself.
55
+ - The hosted wallet renders a **decoded approval** for every sign/execute (it
56
+ shows the actual intent — token, amount, spender — and hard-blocks typed data
57
+ it can't read), then runs the real passkey + paymaster path.
58
+ - `account()` wraps the channel in a `starknet.js` `WalletAccount`, so the dApp
59
+ uses a standard `AccountInterface`.
60
+
61
+ ## Options
62
+
63
+ ```ts
64
+ new ChipiConnector({
65
+ walletUrl: "https://connect.chipipay.com", // hosted wallet base URL (default)
66
+ id: "chipi", // connector id
67
+ name: "Connect with Chipi", // display name
68
+ icon: "data:image/svg+xml;base64,...", // display icon
69
+ });
70
+ ```
71
+
72
+ ## Compatibility
73
+
74
+ - `@starknet-react/core` **>= 3** (peer) · tested against `5.x`
75
+ - `starknet` **>= 8.1.2** (peer) — `WalletAccount.connect` is identical across 8/9
76
+ - **Starknet mainnet** (v1). The wallet is mainnet-only.
77
+
78
+ ## Notes / limits (v1)
79
+
80
+ - **Popup-based** (external dApps). The in-app-browser ("parent") mode is in the
81
+ transport but not exposed yet — the hosted wallet side handles it in a later
82
+ release.
83
+ - Mainnet only — pass a mainnet `provider`.
84
+ - One approval at a time; a dApp that fires two prompts truly simultaneously has
85
+ its second request rejected (most dApps serialize).
86
+
87
+ MIT · [docs.chipipay.com](https://docs.chipipay.com) ·
88
+ [example](https://github.com/chipi-pay/sdks/tree/main/examples/connect-with-chipi)
@@ -0,0 +1,54 @@
1
+ /**
2
+ * `ChipiConnector` — a starknet-react / get-starknet connector for the Chipi
3
+ * hosted smart-account wallet. This is the Cartridge/Argent-Web-Wallet model:
4
+ * a self-contained connector package a dApp adds to its `connectors` array
5
+ * (`new ChipiConnector()`), with NO dependency on StarknetKit/Argent and NO
6
+ * browser extension. Clicking "Connect with Chipi" opens our hosted wallet
7
+ * (passkey + gasless paymaster) in a popup; the dApp's `wallet_*` RPC calls are
8
+ * forwarded over postMessage and answered after the user approves in Chipi's
9
+ * own (already-built) approval UI.
10
+ */
11
+ import { Connector } from "@starknet-react/core";
12
+ import type { AccountInterface, ProviderInterface } from "starknet";
13
+ import type { RpcMessage, RequestFnCall, RpcTypeToMessageMap, StarknetWindowObject } from "@starknet-io/types-js";
14
+ import { type ChipiTransportOptions } from "./transport.js";
15
+ type ConnectorIcons = StarknetWindowObject["icon"];
16
+ type ConnectorData = {
17
+ account?: string;
18
+ chainId?: bigint;
19
+ };
20
+ export interface ChipiConnectorOptions {
21
+ /** Hosted wallet base URL. Defaults to `https://connect.chipipay.com`. */
22
+ walletUrl?: string;
23
+ /** Override the connector id / display name / icon if embedding. */
24
+ id?: string;
25
+ name?: string;
26
+ icon?: ConnectorIcons;
27
+ transport?: ChipiTransportOptions;
28
+ }
29
+ export declare class ChipiConnector extends Connector {
30
+ private readonly transport;
31
+ private readonly _id;
32
+ private readonly _name;
33
+ private readonly _icon;
34
+ private _account;
35
+ private _swo;
36
+ constructor(options?: ChipiConnectorOptions);
37
+ get id(): string;
38
+ get name(): string;
39
+ get icon(): ConnectorIcons;
40
+ /** Hosted wallet — always available (no extension to detect). */
41
+ available(): boolean;
42
+ /** No silent reconnect in v1 — the user re-approves the popup each session. */
43
+ ready(): Promise<boolean>;
44
+ /** Lazily build the postMessage-backed get-starknet window object. */
45
+ private swo;
46
+ connect(): Promise<ConnectorData>;
47
+ disconnect(): Promise<void>;
48
+ private emitEvent;
49
+ account(provider: ProviderInterface): Promise<AccountInterface>;
50
+ chainId(): Promise<bigint>;
51
+ request<T extends RpcMessage["type"]>(call: RequestFnCall<T>): Promise<RpcTypeToMessageMap[T]["result"]>;
52
+ }
53
+ export {};
54
+ //# sourceMappingURL=connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.d.ts","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAIjF,KAAK,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACnD,KAAK,aAAa,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAU5D,MAAM,WAAW,qBAAqB;IACpC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,SAAS,CAAC,EAAE,qBAAqB,CAAC;CAInC;AAED,qBAAa,cAAe,SAAQ,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,IAAI,CAAqC;gBAErC,OAAO,GAAE,qBAA0B;IAc/C,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,cAAc,CAEzB;IAED,iEAAiE;IACjE,SAAS,IAAI,OAAO;IAIpB,+EAA+E;IACzE,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,sEAAsE;IACtE,OAAO,CAAC,GAAG;IAsBL,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAWjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC,OAAO,CAAC,SAAS;IAIX,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAO/D,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAI1B,OAAO,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,EACxC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;CAG7C"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * `ChipiConnector` — a starknet-react / get-starknet connector for the Chipi
3
+ * hosted smart-account wallet. This is the Cartridge/Argent-Web-Wallet model:
4
+ * a self-contained connector package a dApp adds to its `connectors` array
5
+ * (`new ChipiConnector()`), with NO dependency on StarknetKit/Argent and NO
6
+ * browser extension. Clicking "Connect with Chipi" opens our hosted wallet
7
+ * (passkey + gasless paymaster) in a popup; the dApp's `wallet_*` RPC calls are
8
+ * forwarded over postMessage and answered after the user approves in Chipi's
9
+ * own (already-built) approval UI.
10
+ */
11
+ import { Connector } from "@starknet-react/core";
12
+ import { WalletAccount } from "starknet";
13
+ import { ChipiPopupTransport } from "./transport.js";
14
+ /** Starknet mainnet chain id (felt of the shortstring "SN_MAIN"). */
15
+ const SN_MAIN = BigInt("0x534e5f4d41494e");
16
+ // A tiny neobrutalist "C" mark (precomputed data URI); swap for the real Chipi
17
+ // logo before launch. Precomputed so we need neither btoa (SSR-unsafe) nor Buffer.
18
+ const CHIPI_ICON = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHJ4PSI4IiBmaWxsPSIjMEExNzJEIi8+PHRleHQgeD0iMTYiIHk9IjIyIiBmb250LWZhbWlseT0iQXJpYWwiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSJib2xkIiBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5DPC90ZXh0Pjwvc3ZnPg==";
19
+ export class ChipiConnector extends Connector {
20
+ constructor(options = {}) {
21
+ super();
22
+ this._account = null;
23
+ this._swo = null;
24
+ const walletUrl = options.walletUrl ?? options.transport?.walletUrl ?? "https://connect.chipipay.com";
25
+ this.transport = new ChipiPopupTransport({
26
+ ...options.transport,
27
+ walletUrl,
28
+ mode: "popup", // v1: external-dApp popup only (parent host not yet built)
29
+ });
30
+ this._id = options.id ?? "chipi";
31
+ this._name = options.name ?? "Connect with Chipi";
32
+ this._icon = options.icon ?? CHIPI_ICON;
33
+ }
34
+ get id() {
35
+ return this._id;
36
+ }
37
+ get name() {
38
+ return this._name;
39
+ }
40
+ get icon() {
41
+ return this._icon;
42
+ }
43
+ /** Hosted wallet — always available (no extension to detect). */
44
+ available() {
45
+ return true;
46
+ }
47
+ /** No silent reconnect in v1 — the user re-approves the popup each session. */
48
+ async ready() {
49
+ return this._account !== null;
50
+ }
51
+ /** Lazily build the postMessage-backed get-starknet window object. */
52
+ swo() {
53
+ if (this._swo)
54
+ return this._swo;
55
+ const transport = this.transport;
56
+ const request = (async (call) => transport.request(call));
57
+ this._swo = {
58
+ id: this._id,
59
+ name: this._name,
60
+ version: "1.0.0",
61
+ icon: typeof this._icon === "string" ? this._icon : (this._icon?.dark ?? ""),
62
+ request,
63
+ on: ((event, handler) => {
64
+ if (event === "accountsChanged" || event === "networkChanged")
65
+ transport.on(event, handler);
66
+ }),
67
+ off: ((event, handler) => {
68
+ if (event === "accountsChanged" || event === "networkChanged")
69
+ transport.off(event, handler);
70
+ }),
71
+ };
72
+ return this._swo;
73
+ }
74
+ async connect() {
75
+ await this.transport.open();
76
+ const accounts = (await this.transport.request({ type: "wallet_requestAccounts" }));
77
+ const account = accounts?.[0];
78
+ if (!account)
79
+ throw new Error("chipi_no_account");
80
+ this._account = account;
81
+ const data = { account, chainId: SN_MAIN };
82
+ this.emitEvent("connect", data);
83
+ return data;
84
+ }
85
+ async disconnect() {
86
+ this.transport.close();
87
+ this._account = null;
88
+ this._swo = null;
89
+ this.emitEvent("disconnect");
90
+ }
91
+ // `Connector` extends eventemitter3's EventEmitter, but the bundled .d.ts
92
+ // doesn't surface `emit` cleanly through the abstract class — reach it via a
93
+ // narrow cast rather than fight the upstream typing.
94
+ emitEvent(event, data) {
95
+ this.emit(event, data);
96
+ }
97
+ async account(provider) {
98
+ if (!this._account)
99
+ throw new Error("chipi_not_connected");
100
+ // WalletAccount routes execute()/signMessage() through the SWO's request(),
101
+ // i.e. over our postMessage channel to the hosted wallet.
102
+ return WalletAccount.connect(provider, this.swo());
103
+ }
104
+ async chainId() {
105
+ return SN_MAIN;
106
+ }
107
+ async request(call) {
108
+ return this.transport.request(call);
109
+ }
110
+ }
111
+ //# sourceMappingURL=connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector.js","sourceRoot":"","sources":["../src/connector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { ChipiConnector } from "./connector.js";
2
+ export type { ChipiConnectorOptions } from "./connector.js";
3
+ export { ChipiPopupTransport } from "./transport.js";
4
+ export type { ChipiTransportOptions } from "./transport.js";
5
+ export { CHIPI_WC, isChipiWalletMessage, isChipiDappMessage } from "./protocol.js";
6
+ export type { ChipiRpcCall, ChipiReadyMessage, ChipiRpcRequestMessage, ChipiRpcResultMessage, ChipiEventMessage, ChipiWalletMessage, ChipiDappMessage, } from "./protocol.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnF,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ // "Connect with Chipi" — a starknet-react / get-starknet connector for the
2
+ // Chipi hosted smart-account wallet. No StarknetKit, no extension, no
3
+ // WalletConnect.
4
+ //
5
+ // import { ChipiConnector } from "@chipi-stack/starknet-connector";
6
+ // <StarknetConfig connectors={[new ChipiConnector(), braavos(), argent()]}>
7
+ //
8
+ export { ChipiConnector } from "./connector.js";
9
+ export { ChipiPopupTransport } from "./transport.js";
10
+ export { CHIPI_WC, isChipiWalletMessage, isChipiDappMessage } from "./protocol.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,sEAAsE;AACtE,iBAAiB;AACjB,EAAE;AACF,sEAAsE;AACtE,8EAA8E;AAC9E,EAAE;AACF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Wire protocol between the "Connect with Chipi" connector (running in the dApp)
3
+ * and the Chipi hosted wallet (running at `connect.chipipay.com` in a popup).
4
+ *
5
+ * Both sides import these shapes so the contract stays in lock-step. The
6
+ * transport is `window.postMessage` — the dApp opens the wallet in a popup,
7
+ * forwards get-starknet `wallet_*` RPC calls over the channel, and the wallet
8
+ * answers after the user approves in its own (already-built) approval UI.
9
+ */
10
+ /** A get-starknet RPC call as sent over the wire — just the discriminant +
11
+ * optional params (the full typed `RpcMessage` carries result/errors we don't
12
+ * serialize). */
13
+ export interface ChipiRpcCall {
14
+ type: string;
15
+ params?: unknown;
16
+ }
17
+ /** Namespace tag on every message so we ignore unrelated postMessages. */
18
+ export declare const CHIPI_WC: "chipi-connect/v1";
19
+ /** wallet → dApp: the hosted wallet page finished loading and is listening. */
20
+ export interface ChipiReadyMessage {
21
+ channel: typeof CHIPI_WC;
22
+ type: "ready";
23
+ }
24
+ /** dApp → wallet: forward a get-starknet `wallet_*` RPC call. */
25
+ export interface ChipiRpcRequestMessage {
26
+ channel: typeof CHIPI_WC;
27
+ type: "rpc";
28
+ id: string;
29
+ /** The dApp origin, so the wallet can show it + enforce Verify checks. */
30
+ origin: string;
31
+ call: ChipiRpcCall;
32
+ }
33
+ /** wallet → dApp: the result (or error) for a given request id. */
34
+ export type ChipiRpcResultMessage = {
35
+ channel: typeof CHIPI_WC;
36
+ type: "rpc-result";
37
+ id: string;
38
+ ok: true;
39
+ result: unknown;
40
+ } | {
41
+ channel: typeof CHIPI_WC;
42
+ type: "rpc-result";
43
+ id: string;
44
+ ok: false;
45
+ error: {
46
+ code: number;
47
+ message: string;
48
+ };
49
+ };
50
+ /** wallet → dApp: an account/network change to propagate to the dApp. */
51
+ export interface ChipiEventMessage {
52
+ channel: typeof CHIPI_WC;
53
+ type: "event";
54
+ event: "accountsChanged" | "networkChanged";
55
+ data: unknown;
56
+ }
57
+ export type ChipiWalletMessage = ChipiReadyMessage | ChipiRpcResultMessage | ChipiEventMessage;
58
+ export type ChipiDappMessage = ChipiRpcRequestMessage;
59
+ export declare function isChipiWalletMessage(data: unknown): data is ChipiWalletMessage;
60
+ /** Type guard for a dApp→wallet message (used by the hosted wallet side). */
61
+ export declare function isChipiDappMessage(data: unknown): data is ChipiDappMessage;
62
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH;;iBAEiB;AACjB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,0EAA0E;AAC1E,eAAO,MAAM,QAAQ,EAAG,kBAA2B,CAAC;AAEpD,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,QAAQ,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,iEAAiE;AACjE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,QAAQ,CAAC;IACzB,IAAI,EAAE,KAAK,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,MAAM,qBAAqB,GAC7B;IAAE,OAAO,EAAE,OAAO,QAAQ,CAAC;IAAC,IAAI,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACvF;IACE,OAAO,EAAE,OAAO,QAAQ,CAAC;IACzB,IAAI,EAAE,YAAY,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C,CAAC;AAEN,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,QAAQ,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,iBAAiB,GAAG,gBAAgB,CAAC;IAC5C,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,qBAAqB,GAAG,iBAAiB,CAAC;AAC/F,MAAM,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEtD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAM9E;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,gBAAgB,CAO1E"}
@@ -0,0 +1,15 @@
1
+ /** Namespace tag on every message so we ignore unrelated postMessages. */
2
+ export const CHIPI_WC = "chipi-connect/v1";
3
+ export function isChipiWalletMessage(data) {
4
+ return (typeof data === "object" &&
5
+ data !== null &&
6
+ data.channel === CHIPI_WC);
7
+ }
8
+ /** Type guard for a dApp→wallet message (used by the hosted wallet side). */
9
+ export function isChipiDappMessage(data) {
10
+ return (typeof data === "object" &&
11
+ data !== null &&
12
+ data.channel === CHIPI_WC &&
13
+ data.type === "rpc");
14
+ }
15
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAiBA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,QAAQ,GAAG,kBAA2B,CAAC;AAwCpD,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACZ,IAA8B,CAAC,OAAO,KAAK,QAAQ,CACrD,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACZ,IAA8B,CAAC,OAAO,KAAK,QAAQ;QACnD,IAA2B,CAAC,IAAI,KAAK,KAAK,CAC5C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Client-side (dApp) transport: opens the Chipi hosted wallet in a popup,
3
+ * performs the ready handshake, and forwards get-starknet `wallet_*` RPC calls
4
+ * over `postMessage`, correlating responses by id. The popup is reused across
5
+ * requests; if the user closed it, the next request reopens it.
6
+ */
7
+ import { type ChipiRpcCall } from "./protocol.js";
8
+ export interface ChipiTransportOptions {
9
+ /** Hosted wallet base URL, e.g. `https://connect.chipipay.com`. */
10
+ walletUrl: string;
11
+ /**
12
+ * Transport mode:
13
+ * - `"popup"` (default): open the hosted wallet in a popup window — the
14
+ * universal model, works for any external dApp.
15
+ * - `"parent"`: the dApp is embedded in an iframe INSIDE the Chipi wallet
16
+ * (in-app browser); talk to `window.parent` instead of opening a popup, so
17
+ * approval renders inline in the wallet. Only works when the dApp is
18
+ * actually iframed by the Chipi host.
19
+ * - `"auto"`: use `"parent"` when running inside an iframe, else `"popup"`.
20
+ */
21
+ mode?: "popup" | "parent" | "auto";
22
+ /** Popup window name. */
23
+ windowName?: string;
24
+ /** Popup window features. */
25
+ windowFeatures?: string;
26
+ /** Ready-handshake timeout (ms). */
27
+ openTimeoutMs?: number;
28
+ }
29
+ type EventName = "accountsChanged" | "networkChanged";
30
+ type EventHandler = (data: unknown) => void;
31
+ export declare class ChipiPopupTransport {
32
+ private readonly opts;
33
+ private readonly walletOrigin;
34
+ private readonly url;
35
+ private target;
36
+ private ownsTarget;
37
+ private ready;
38
+ private listening;
39
+ private readonly pending;
40
+ private readonly handlers;
41
+ private readyDeferred;
42
+ private openPromise;
43
+ private closeWatch;
44
+ constructor(opts: ChipiTransportOptions);
45
+ on(event: EventName, handler: EventHandler): void;
46
+ off(event: EventName, handler: EventHandler): void;
47
+ private ensureListener;
48
+ private onMessage;
49
+ /** Resolve "auto" → "parent" when iframed, else "popup". */
50
+ private resolveMode;
51
+ /** Open (or reuse) the wallet (popup window OR the parent frame) and wait for
52
+ * its ready handshake. Concurrent calls share ONE handshake. */
53
+ open(): Promise<void>;
54
+ private doOpen;
55
+ private awaitReady;
56
+ /** Reject every in-flight request (popup closed / disconnected). */
57
+ private rejectAllPending;
58
+ /** While requests are in flight, watch for the user closing the popup and
59
+ * reject them — otherwise the dApp's promise would hang forever. */
60
+ private startCloseWatch;
61
+ private stopCloseWatch;
62
+ /** Forward a get-starknet RPC call to the wallet, awaiting its response. */
63
+ request(call: ChipiRpcCall): Promise<unknown>;
64
+ /** Close the popup (if we own one) + reject in-flight requests. */
65
+ close(): void;
66
+ }
67
+ export {};
68
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAGL,KAAK,YAAY,EAGlB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AACtD,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAiB5C,qBAAa,mBAAmB;IAgBlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAfjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGpB;IACJ,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,aAAa,CAAkD;IACvE,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,UAAU,CAA+C;gBAEpC,IAAI,EAAE,qBAAqB;IAKxD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAIjD,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAIlD,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,SAAS,CAuBf;IAEF,4DAA4D;IAC5D,OAAO,CAAC,WAAW;IAMnB;oEACgE;IAC1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAcb,MAAM;YAsBN,UAAU;IAgBxB,oEAAoE;IACpE,OAAO,CAAC,gBAAgB;IAKxB;wEACoE;IACpE,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,cAAc;IAOtB,4EAA4E;IACtE,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBnD,mEAAmE;IACnE,KAAK,IAAI,IAAI;CAed"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Client-side (dApp) transport: opens the Chipi hosted wallet in a popup,
3
+ * performs the ready handshake, and forwards get-starknet `wallet_*` RPC calls
4
+ * over `postMessage`, correlating responses by id. The popup is reused across
5
+ * requests; if the user closed it, the next request reopens it.
6
+ */
7
+ import { CHIPI_WC, isChipiWalletMessage, } from "./protocol.js";
8
+ function deferred() {
9
+ let resolve;
10
+ let reject;
11
+ const promise = new Promise((res, rej) => {
12
+ resolve = res;
13
+ reject = rej;
14
+ });
15
+ return { promise, resolve, reject };
16
+ }
17
+ function randomId() {
18
+ // App-runtime ids; uniqueness only needs to hold within one open popup.
19
+ return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
20
+ }
21
+ export class ChipiPopupTransport {
22
+ constructor(opts) {
23
+ this.opts = opts;
24
+ this.target = null;
25
+ this.ownsTarget = false;
26
+ this.ready = false;
27
+ this.listening = false;
28
+ this.pending = new Map();
29
+ this.handlers = new Map();
30
+ this.readyDeferred = null;
31
+ this.openPromise = null;
32
+ this.closeWatch = null;
33
+ this.onMessage = (e) => {
34
+ if (e.origin !== this.walletOrigin || !isChipiWalletMessage(e.data))
35
+ return;
36
+ // Isolate to OUR wallet window — without this, a second Chipi popup (another
37
+ // dApp, same origin) could leak its `ready`/`event` into this transport.
38
+ if (this.target && e.source !== this.target)
39
+ return;
40
+ const msg = e.data;
41
+ if (msg.type === "ready") {
42
+ this.ready = true;
43
+ this.readyDeferred?.resolve();
44
+ this.readyDeferred = null;
45
+ return;
46
+ }
47
+ if (msg.type === "rpc-result") {
48
+ const p = this.pending.get(msg.id);
49
+ if (!p)
50
+ return;
51
+ this.pending.delete(msg.id);
52
+ if (msg.ok)
53
+ p.resolve(msg.result);
54
+ else
55
+ p.reject(Object.assign(new Error(msg.error.message), { code: msg.error.code }));
56
+ return;
57
+ }
58
+ if (msg.type === "event") {
59
+ this.handlers.get(msg.event)?.forEach((h) => h(msg.data));
60
+ }
61
+ };
62
+ this.url = opts.walletUrl.replace(/\/$/, "") + "/connect";
63
+ this.walletOrigin = new URL(opts.walletUrl).origin;
64
+ }
65
+ on(event, handler) {
66
+ (this.handlers.get(event) ?? this.handlers.set(event, new Set()).get(event)).add(handler);
67
+ }
68
+ off(event, handler) {
69
+ this.handlers.get(event)?.delete(handler);
70
+ }
71
+ ensureListener() {
72
+ if (this.listening || typeof window === "undefined")
73
+ return;
74
+ window.addEventListener("message", this.onMessage);
75
+ this.listening = true;
76
+ }
77
+ /** Resolve "auto" → "parent" when iframed, else "popup". */
78
+ resolveMode() {
79
+ const mode = this.opts.mode ?? "popup";
80
+ if (mode !== "auto")
81
+ return mode;
82
+ return typeof window !== "undefined" && window.parent !== window ? "parent" : "popup";
83
+ }
84
+ /** Open (or reuse) the wallet (popup window OR the parent frame) and wait for
85
+ * its ready handshake. Concurrent calls share ONE handshake. */
86
+ async open() {
87
+ if (typeof window === "undefined")
88
+ throw new Error("chipi_connector_requires_browser");
89
+ this.ensureListener();
90
+ const isParent = this.resolveMode() === "parent";
91
+ if (this.ready && this.target && (isParent || !this.target.closed))
92
+ return;
93
+ if (this.openPromise)
94
+ return this.openPromise;
95
+ this.openPromise = this.doOpen(isParent);
96
+ try {
97
+ await this.openPromise;
98
+ }
99
+ finally {
100
+ this.openPromise = null;
101
+ }
102
+ }
103
+ async doOpen(isParent) {
104
+ if (isParent) {
105
+ if (window.parent === window)
106
+ throw new Error("chipi_not_in_iframe");
107
+ this.target = window.parent;
108
+ this.ownsTarget = false;
109
+ }
110
+ else {
111
+ this.ready = false;
112
+ // Unique per-open window name so a reconnect can never reuse a stale popup
113
+ // that still holds a previous session's pending approval.
114
+ const name = this.opts.windowName ?? `chipi-wallet-${randomId()}`;
115
+ this.target = window.open(this.url, name, this.opts.windowFeatures ?? "popup=yes,width=420,height=680");
116
+ this.ownsTarget = true;
117
+ if (!this.target)
118
+ throw Object.assign(new Error("Popup blocked"), { code: "popup_blocked" });
119
+ }
120
+ this.readyDeferred = deferred();
121
+ await this.awaitReady();
122
+ }
123
+ async awaitReady() {
124
+ // Generous: a cold login (Clerk / passkey) can take a while. We only reject
125
+ // here on an outright stall — the popup-closed watcher handles the real
126
+ // "user gave up / closed it" case quickly.
127
+ const timeoutMs = this.opts.openTimeoutMs ?? 180000;
128
+ let timer;
129
+ const timeout = new Promise((_, reject) => {
130
+ timer = setTimeout(() => reject(new Error("wallet_open_timeout")), timeoutMs);
131
+ });
132
+ try {
133
+ await Promise.race([this.readyDeferred.promise, timeout]);
134
+ }
135
+ finally {
136
+ if (timer)
137
+ clearTimeout(timer);
138
+ }
139
+ }
140
+ /** Reject every in-flight request (popup closed / disconnected). */
141
+ rejectAllPending(message) {
142
+ for (const [, p] of this.pending)
143
+ p.reject(Object.assign(new Error(message), { code: 4001 }));
144
+ this.pending.clear();
145
+ }
146
+ /** While requests are in flight, watch for the user closing the popup and
147
+ * reject them — otherwise the dApp's promise would hang forever. */
148
+ startCloseWatch() {
149
+ if (this.closeWatch || !this.ownsTarget)
150
+ return;
151
+ this.closeWatch = setInterval(() => {
152
+ if (this.target?.closed) {
153
+ this.ready = false;
154
+ this.target = null;
155
+ this.rejectAllPending("User closed the wallet");
156
+ this.stopCloseWatch();
157
+ }
158
+ else if (this.pending.size === 0) {
159
+ this.stopCloseWatch();
160
+ }
161
+ }, 500);
162
+ }
163
+ stopCloseWatch() {
164
+ if (this.closeWatch) {
165
+ clearInterval(this.closeWatch);
166
+ this.closeWatch = null;
167
+ }
168
+ }
169
+ /** Forward a get-starknet RPC call to the wallet, awaiting its response. */
170
+ async request(call) {
171
+ await this.open();
172
+ if (this.ownsTarget)
173
+ this.target?.focus();
174
+ const id = randomId();
175
+ const message = {
176
+ channel: CHIPI_WC,
177
+ type: "rpc",
178
+ id,
179
+ origin: window.location.origin,
180
+ call,
181
+ };
182
+ return new Promise((resolve, reject) => {
183
+ this.pending.set(id, { resolve, reject });
184
+ this.target.postMessage(message, this.walletOrigin);
185
+ this.startCloseWatch();
186
+ });
187
+ }
188
+ /** Close the popup (if we own one) + reject in-flight requests. */
189
+ close() {
190
+ this.stopCloseWatch();
191
+ try {
192
+ if (this.ownsTarget)
193
+ this.target?.close();
194
+ }
195
+ catch {
196
+ // ignore
197
+ }
198
+ this.target = null;
199
+ this.ready = false;
200
+ this.rejectAllPending("disconnected");
201
+ if (this.listening && typeof window !== "undefined") {
202
+ window.removeEventListener("message", this.onMessage);
203
+ this.listening = false;
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@chipi-stack/starknet-connector",
3
+ "version": "0.1.0",
4
+ "description": "\"Connect with Chipi\" — a starknet-react / get-starknet connector that lets any Starknet dApp connect to a Chipi hosted smart-account wallet (passkey, gasless). No browser extension, no WalletConnect.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "keywords": [
18
+ "chipi",
19
+ "chipi-pay",
20
+ "chipi-stack",
21
+ "starknet",
22
+ "starknet-react",
23
+ "get-starknet",
24
+ "connector",
25
+ "wallet",
26
+ "smart-account",
27
+ "gasless",
28
+ "web-wallet"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/chipi-pay/sdks.git"
33
+ },
34
+ "homepage": "https://docs.chipipay.com",
35
+ "license": "MIT",
36
+ "dependencies": {
37
+ "@starknet-io/types-js": "^0.7.7"
38
+ },
39
+ "devDependencies": {
40
+ "@starknet-react/core": "^5.0.0",
41
+ "starknet": ">=9.2.1",
42
+ "typescript": "^5.7.3",
43
+ "vitest": "^3.2.4"
44
+ },
45
+ "peerDependencies": {
46
+ "@starknet-react/core": ">=3",
47
+ "starknet": ">=8.1.2"
48
+ },
49
+ "engines": {
50
+ "node": ">=20.19.0"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "scripts": {
56
+ "build": "tsc",
57
+ "typecheck": "tsc --noEmit",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest"
60
+ }
61
+ }