Repository: Crossmint/crossmint-sdk
Pull request #1040: Delegate signers & balances: add types / errors
Author: login: jmderby
Created: 2025-04-12T00:45:23Z | Merged: 2025-04-14T16:50:43Z

## Description

PR improves the typing around get delegate signers and get balances. Exposes two types that also get surfaced through the react-ui: `DelegatedSigner` and `WalletBalance`. 

## Test plan

Ensure tests pass, type names make sense.

## Package updates

@crossmint/wallets-sdk
@crossmint/client-sdk-react-ui


Diff:
diff --git a/.changeset/nice-mayflies-knock.md b/.changeset/nice-mayflies-knock.md
new file mode 100644
index 000000000..a00485b2a
--- /dev/null
+++ b/.changeset/nice-mayflies-knock.md
@@ -0,0 +1,5 @@
+---
+"@crossmint/client-sdk-react-ui": patch
+---
+
+Expose two new types from wallets-sdk: WalletBalance, DelegatedSigner
diff --git a/.changeset/tall-fans-drum.md b/.changeset/tall-fans-drum.md
new file mode 100644
index 000000000..e3a760b4c
--- /dev/null
+++ b/.changeset/tall-fans-drum.md
@@ -0,0 +1,5 @@
+---
+"@crossmint/wallets-sdk": patch
+---
+
+Fix get delegate signers and get balances types and error handling
diff --git a/packages/client/ui/react-ui/src/index.ts b/packages/client/ui/react-ui/src/index.ts
index 404a2869a..6584fedc2 100644
--- a/packages/client/ui/react-ui/src/index.ts
+++ b/packages/client/ui/react-ui/src/index.ts
@@ -6,5 +6,5 @@ export type { LoginMethod } from "./types/auth";
 
 export { CrossmintEvents, useCrossmintEvents } from "@crossmint/client-sdk-base";
 
-export type { EVMSmartWallet, SolanaSmartWallet } from "@crossmint/wallets-sdk";
+export type { EVMSmartWallet, SolanaSmartWallet, DelegatedSigner, WalletBalance } from "@crossmint/wallets-sdk";
 export type { CrossmintEvent, CrossmintEventMap } from "@crossmint/client-sdk-base";
diff --git a/packages/wallets/package.json b/packages/wallets/package.json
index b42ab614c..bc31447e1 100644
--- a/packages/wallets/package.json
+++ b/packages/wallets/package.json
@@ -33,7 +33,7 @@
         "viem": "2.23.6"
     },
     "devDependencies": {
-        "@hey-api/openapi-ts": "0.64.5",
+        "@hey-api/openapi-ts": "0.66.3",
         "typedoc": "0.26.5",
         "typedoc-plugin-frontmatter": "1.0.0",
         "typedoc-plugin-markdown": "4.2.3"
diff --git a/packages/wallets/src/api/client.ts b/packages/wallets/src/api/client.ts
index 7402f8b69..1866b08d9 100644
--- a/packages/wallets/src/api/client.ts
+++ b/packages/wallets/src/api/client.ts
@@ -173,15 +173,6 @@ class ApiClient extends CrossmintApiClient {
         return response.json();
     }
 
-    async getDelegatedSigners(walletLocator: WalletLocator): Promise<GetSignerResponse[]> {
-        const walletResponse = await this.get(`${this.apiPrefix}/${walletLocator}`, {
-            headers: this.headers,
-        });
-        const wallet = await walletResponse.json();
-        const signers = wallet.config?.delegatedSigners ?? [];
-        return signers;
-    }
-
     public get isServerSide() {
         return this.parsedAPIKey.usageOrigin === APIKeyUsageOrigin.SERVER;
     }
diff --git a/packages/wallets/src/api/types.ts b/packages/wallets/src/api/types.ts
index ac06bd57c..75c2144cb 100644
--- a/packages/wallets/src/api/types.ts
+++ b/packages/wallets/src/api/types.ts
@@ -58,10 +58,14 @@ export type GetTransactionsResponse =
     | WalletsV1ControllerGetTransactionsWithoutChain4Error;
 export type GetNftsResponse = Nftevm | Nftsol | FetchContentFromWalletError;
 export type GetBalanceResponse = WalletBalanceResponseDto | BalanceControllerGetBalanceForLocator2Error;
+export type WalletBalance = WalletBalanceResponseDto;
 
 export type RegisterSignerParams = CreateSignerInputDto;
 export type RegisterSignerResponse = DelegatedSignerDto | WalletsV1ControllerCreateDelegatedSigner4Error;
 export type GetSignerResponse = DelegatedSignerDto | WalletsV1ControllerGetDelegatedSigner4Error;
+export type GetDelegatedSignersResponse = Array<DelegatedSignerDto> | WalletsV1ControllerGetDelegatedSigner4Error;
+export type DelegatedSigner = DelegatedSignerDto;
+
 type WalletType = CreateWalletDto["type"];
 export type EvmWalletLocator = `me:${WalletType}` | Address;
 type SolanaAddress = string;
diff --git a/packages/wallets/src/evm/wallet.ts b/packages/wallets/src/evm/wallet.ts
index ea52fb696..26517a34a 100644
--- a/packages/wallets/src/evm/wallet.ts
+++ b/packages/wallets/src/evm/wallet.ts
@@ -19,6 +19,7 @@ import type {
     EvmWalletLocator,
     CreateTransactionSuccessResponse,
     GetTransactionsResponse,
+    WalletBalance,
 } from "../api";
 import { sleep } from "../utils";
 import type { Callbacks } from "../utils/options";
@@ -68,12 +69,17 @@ export class EVMSmartWalletImpl implements ViemWallet {
      * Get the wallet balances
      * @param tokens - The tokens
      * @returns The balances
+     * @throws {Error} If the balances cannot be retrieved
      */
-    public async getBalances(tokens: Address[]) {
-        return await this.apiClient.getBalance(this.address, {
+    public async getBalances(tokens: Address[]): Promise<WalletBalance> {
+        const response = await this.apiClient.getBalance(this.address, {
             chains: [this.chain],
             tokens,
         });
+        if ("error" in response) {
+            throw new Error(`Failed to get balances: ${JSON.stringify(response.error)}`);
+        }
+        return response;
     }
 
     /**
diff --git a/packages/wallets/src/index.ts b/packages/wallets/src/index.ts
index 9b2383699..e318f0436 100644
--- a/packages/wallets/src/index.ts
+++ b/packages/wallets/src/index.ts
@@ -4,3 +4,4 @@ export type { Callbacks } from "./utils/options";
 export type { SolanaSmartWallet, SolanaMPCWallet, SolanaSignerInput } from "./solana";
 export type { EVMSmartWallet, EVMSignerInput, EVMSigner, EVMSmartWalletChain } from "./evm";
 export type { WalletTypeToArgs } from "./services/types";
+export type { DelegatedSigner, WalletBalance } from "./api";
diff --git a/packages/wallets/src/openapi.json b/packages/wallets/src/openapi.json
index 0082fb237..52a891fe6 100644
--- a/packages/wallets/src/openapi.json
+++ b/packages/wallets/src/openapi.json
@@ -9009,6 +9009,80 @@
                                                 }
                                             }
                                         ]
+                                    },
+                                    "delegatedSigners": {
+                                        "type": "array",
+                                        "items": {
+                                            "type": "object",
+                                            "properties": {
+                                                "type": {
+                                                    "type": "string",
+                                                    "enum": ["solana-keypair", "solana-fireblocks-custodial"],
+                                                    "description": "Specifies the type of Solana signer being used, describing the method of key management and transaction signing."
+                                                },
+                                                "locator": {
+                                                    "type": "string",
+                                                    "description": "The locator of the signer"
+                                                },
+                                                "transaction": {
+                                                    "type": "object",
+                                                    "properties": {
+                                                        "onChain": {
+                                                            "type": "object",
+                                                            "properties": {
+                                                                "transaction": {
+                                                                    "type": "string"
+                                                                },
+                                                                "lastValidBlockHeight": {
+                                                                    "type": "number"
+                                                                }
+                                                            }
+                                                        },
+                                                        "id": {
+                                                            "type": "string"
+                                                        },
+                                                        "status": {
+                                                            "type": "string"
+                                                        },
+                                                        "approvals": {
+                                                            "type": "object",
+                                                            "properties": {
+                                                                "required": {
+                                                                    "type": "number"
+                                                                },
+                                                                "pending": {
+                                                                    "type": "array",
+                                                                    "items": {
+                                                                        "type": "object",
+                                                                        "properties": {
+                                                                            "signer": {
+                                                                                "type": "string"
+                                                                            },
+                                                                            "message": {
+                                                                                "type": "string"
+                                                                            }
+                                                                        }
+                                                                    }
+                                                                },
+                                                                "submitted": {
+                                                                    "type": "array",
+                                                                    "items": {
+                                                                        "type": "object"
+                                                                    }
+                                                                }
+                                                            }
+                                                        },
+                                                        "createdAt": {
+                                                            "type": "string",
+                                                            "format": "date-time"
+                                                        }
+                                                    },
+                                                    "description": "The transaction for the signer"
+                                                }
+                                            },
+                                            "required": ["type", "locator", "transaction"]
+                                        },
+                                        "description": "Optional array of additional signers for the wallet"
                                     }
                                 },
                                 "required": ["adminSigner"],
diff --git a/packages/wallets/src/solana/services/delegated-signers-service.test.ts b/packages/wallets/src/solana/services/delegated-signers-service.test.ts
index 2d38d6aa9..7af1866f5 100644
--- a/packages/wallets/src/solana/services/delegated-signers-service.test.ts
+++ b/packages/wallets/src/solana/services/delegated-signers-service.test.ts
@@ -4,6 +4,7 @@ import type { ApiClient } from "../../api";
 import { mock } from "vitest-mock-extended";
 import type { SolanaTransactionsService } from "./transactions-service";
 import type { SolanaNonCustodialSigner } from "../types/signers";
+import { WalletNotAvailableError, WalletTypeNotSupportedError } from "../../utils/errors";
 
 vi.mock("../../utils", () => ({
     sleep: vi.fn(),
@@ -75,22 +76,60 @@ describe("SolanaDelegatedSignerService", () => {
         });
     });
 
-    describe("getDelegatedSigner", () => {
-        it("should get a delegated signer", async () => {
-            const signerAddress = "mock-signer-address";
+    describe("getDelegatedSigners", () => {
+        it("should get all delegated signers", async () => {
+            const delegatedSigners = [
+                {
+                    address: "mock-signer-address-1",
+                    status: "active",
+                },
+                {
+                    address: "mock-signer-address-2",
+                    status: "active",
+                },
+            ];
+
+            apiClient.getWallet.mockResolvedValueOnce({
+                type: "solana-smart-wallet",
+                config: {
+                    delegatedSigners: delegatedSigners,
+                },
+            });
 
-            apiClient.getSigner.mockResolvedValueOnce({
-                address: signerAddress,
-                status: "active",
+            const result = await delegatedSignerService.getDelegatedSigners();
+
+            expect(apiClient.getWallet).toHaveBeenCalledWith(walletLocator);
+            expect(result).toEqual(delegatedSigners);
+        });
+
+        it("should return empty array when no delegated signers exist", async () => {
+            apiClient.getWallet.mockResolvedValueOnce({
+                type: "solana-smart-wallet",
+                config: {},
             });
 
-            const result = await delegatedSignerService.getDelegatedSigner(signerAddress);
+            const result = await delegatedSignerService.getDelegatedSigners();
 
-            expect(apiClient.getSigner).toHaveBeenCalledWith(walletLocator, signerAddress);
-            expect(result).toEqual({
-                address: signerAddress,
-                status: "active",
+            expect(apiClient.getWallet).toHaveBeenCalledWith(walletLocator);
+            expect(result).toEqual([]);
+        });
+
+        it("should throw error when wallet type is not supported", async () => {
+            apiClient.getWallet.mockResolvedValueOnce({
+                type: "unsupported-wallet-type",
             });
+
+            await expect(delegatedSignerService.getDelegatedSigners()).rejects.toThrow(WalletTypeNotSupportedError);
+            expect(apiClient.getWallet).toHaveBeenCalledWith(walletLocator);
+        });
+
+        it("should throw error when wallet is not available", async () => {
+            apiClient.getWallet.mockResolvedValueOnce({
+                error: "wallet not found",
+            });
+
+            await expect(delegatedSignerService.getDelegatedSigners()).rejects.toThrow(WalletNotAvailableError);
+            expect(apiClient.getWallet).toHaveBeenCalledWith(walletLocator);
         });
     });
 });
diff --git a/packages/wallets/src/solana/services/delegated-signers-service.ts b/packages/wallets/src/solana/services/delegated-signers-service.ts
index 8af159ada..bb68c83b6 100644
--- a/packages/wallets/src/solana/services/delegated-signers-service.ts
+++ b/packages/wallets/src/solana/services/delegated-signers-service.ts
@@ -1,7 +1,8 @@
-import type { ApiClient, SolanaWalletLocator } from "@/api";
+import type { ApiClient, DelegatedSigner, SolanaWalletLocator } from "@/api";
 
 import type { SolanaTransactionsService } from "./transactions-service";
 import type { SolanaNonCustodialSigner } from "../types/signers";
+import { WalletNotAvailableError, WalletTypeNotSupportedError } from "../../utils/errors";
 
 export class SolanaDelegatedSignerService {
     constructor(
@@ -28,7 +29,14 @@ export class SolanaDelegatedSignerService {
     }
 
     public async getDelegatedSigners() {
-        const response = await this.apiClient.getDelegatedSigners(this.walletLocator);
-        return response;
+        const walletResponse = await this.apiClient.getWallet(this.walletLocator);
+        if ("error" in walletResponse) {
+            throw new WalletNotAvailableError(JSON.stringify(walletResponse));
+        }
+        if (walletResponse.type !== "solana-smart-wallet") {
+            throw new WalletTypeNotSupportedError(`Wallet type ${walletResponse.type} not supported`);
+        }
+        const signers = (walletResponse.config?.delegatedSigners as unknown as DelegatedSigner[]) ?? [];
+        return signers;
     }
 }
diff --git a/packages/wallets/src/solana/types/wallet.ts b/packages/wallets/src/solana/types/wallet.ts
index 91f0c7feb..3c19d5bbd 100644
--- a/packages/wallets/src/solana/types/wallet.ts
+++ b/packages/wallets/src/solana/types/wallet.ts
@@ -1,9 +1,10 @@
 import type {
-    GetBalanceResponse,
     GetNftsResponse,
     GetSignerResponse,
+    WalletBalance,
     GetTransactionsResponse,
     SolanaWalletLocator,
+    DelegatedSigner,
 } from "@/api";
 import type { SolanaNonCustodialSignerInput, SolanaSigner } from "./signers";
 import type { PublicKey, VersionedTransaction } from "@solana/web3.js";
@@ -25,7 +26,7 @@ export interface BaseSolanaWallet {
      * @param tokens - The tokens
      * @returns The balances
      */
-    getBalances(tokens: SolanaSupportedToken[]): Promise<GetBalanceResponse>;
+    getBalances(tokens: SolanaSupportedToken[]): Promise<WalletBalance>;
 
     /**
      * Get the wallet transactions
@@ -45,7 +46,7 @@ export interface BaseSolanaWallet {
 
 export interface SolanaSmartWallet extends BaseSolanaWallet {
     addDelegatedSigner(signer: string): Promise<GetSignerResponse>;
-    getDelegatedSigners(): Promise<GetSignerResponse[]>;
+    getDelegatedSigners(): Promise<DelegatedSigner[]>;
     adminSigner: SolanaSigner;
     sendTransaction(parameters: SmartWalletTransactionParams): Promise<string>;
 }
diff --git a/packages/wallets/src/solana/wallet.ts b/packages/wallets/src/solana/wallet.ts
index 84a84658a..3da1c5a68 100644
--- a/packages/wallets/src/solana/wallet.ts
+++ b/packages/wallets/src/solana/wallet.ts
@@ -2,11 +2,11 @@ import type { Connection, PublicKey, VersionedTransaction } from "@solana/web3.j
 
 import type {
     ApiClient,
-    GetBalanceResponse,
+    DelegatedSigner,
     GetNftsResponse,
-    GetSignerResponse,
     GetTransactionsResponse,
     SolanaWalletLocator,
+    WalletBalance,
 } from "../api";
 import type { Callbacks } from "../utils/options";
 import type { SolanaSupportedToken } from "./tokens";
@@ -64,10 +64,14 @@ export abstract class SolanaWallet implements BaseSolanaWallet {
      * @param tokens - The tokens
      * @returns The balances
      */
-    public async getBalances(tokens: SolanaSupportedToken[]): Promise<GetBalanceResponse> {
-        return await this.apiClient.getBalance(this.address, {
+    public async getBalances(tokens: SolanaSupportedToken[]): Promise<WalletBalance> {
+        const response = await this.apiClient.getBalance(this.address, {
             tokens,
         });
+        if ("error" in response) {
+            throw new Error(`Failed to get balances: ${JSON.stringify(response.error)}`);
+        }
+        return response;
     }
 
     /**
@@ -146,8 +150,10 @@ export class SolanaSmartWalletImpl extends SolanaWallet implements SolanaSmartWa
     /**
      * Gets delegated signers for the wallet
      * @returns The delegated signers
+     * @throws {WalletNotAvailableError} If the wallet is not found
+     * @throws {WalletTypeNotSupportedError} If the wallet type is not supported
      */
-    public async getDelegatedSigners(): Promise<GetSignerResponse[]> {
+    public async getDelegatedSigners(): Promise<DelegatedSigner[]> {
         return await this.delegatedSignerService.getDelegatedSigners();
     }
 
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 28bd54584..56c7b4cd8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1174,8 +1174,8 @@ importers:
         version: 2.23.6(bufferutil@4.0.8)(typescript@5.5.3)(utf-8-validate@5.0.10)(zod@3.22.4)
     devDependencies:
       '@hey-api/openapi-ts':
-        specifier: 0.64.5
-        version: 0.64.5(typescript@5.5.3)
+        specifier: 0.66.3
+        version: 0.66.3(typescript@5.5.3)
       typedoc:
         specifier: 0.26.5
         version: 0.26.5(typescript@5.5.3)
@@ -3436,13 +3436,13 @@ packages:
   '@hey-api/client-fetch@0.8.1':
     resolution: {integrity: sha512-AaVNVLBl7N9Fun7QDnb00YDubAFjB9ICi5U6kmzcJSnnQTQGRMsuBBRupQV5ERdMMFt71zjSDym7Z+gLVe8m3A==}
 
-  '@hey-api/json-schema-ref-parser@1.0.2':
-    resolution: {integrity: sha512-F6LSkttZcT/XiX3ydeDqTY3uRN3BLJMwyMTk4kg/ichZlKUp3+3Odv0WokSmXGSoZGTW/N66FROMYAm5NPdJlA==}
+  '@hey-api/json-schema-ref-parser@1.0.4':
+    resolution: {integrity: sha512-IaJ4yFgU5r63KZyeySHRKSM1bavFIda8KdwCFi5BxQCIklltzEByBksNOPms+yHXpWWfR+OopIusVZV8roycYg==}
     engines: {node: '>= 16'}
 
-  '@hey-api/openapi-ts@0.64.5':
-    resolution: {integrity: sha512-Vl6QQbkb+TXPG/ihobCPj/13KFJPfnjTVljno+T18L2ywL8cRHDFYqi5356ktBixBuwK2cSJvKzxYR6TIMq+AA==}
-    engines: {node: ^18.18.0 || ^20.9.0 || >=22.11.0}
+  '@hey-api/openapi-ts@0.66.3':
+    resolution: {integrity: sha512-kws5hZo/M5WuapSYVvA7Nr+/4bCCjzDEzdjxUqWH8VV28MG7nob+TwZRgqaus7POZmJ2+zc2oCzHhdlvOTYVLA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=22.10.0}
     hasBin: true
     peerDependencies:
       typescript: ^5.5.3
@@ -20330,15 +20330,15 @@ snapshots:
 
   '@hey-api/client-fetch@0.8.1': {}
 
-  '@hey-api/json-schema-ref-parser@1.0.2':
+  '@hey-api/json-schema-ref-parser@1.0.4':
     dependencies:
       '@jsdevtools/ono': 7.1.3
       '@types/json-schema': 7.0.15
       js-yaml: 4.1.0
 
-  '@hey-api/openapi-ts@0.64.5(typescript@5.5.3)':
+  '@hey-api/openapi-ts@0.66.3(typescript@5.5.3)':
     dependencies:
-      '@hey-api/json-schema-ref-parser': 1.0.2
+      '@hey-api/json-schema-ref-parser': 1.0.4
       c12: 2.0.1
       commander: 13.0.0
       handlebars: 4.7.8


Reviews:
user: login: jmderby
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T00:49:38Z
user: login: AlbertoElias
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T16:19:30Z
user: login: AlbertoElias
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T16:20:06Z

Review comments:
diff_hunk: @@ -9009,6 +9009,80 @@
                                                 }
path: packages/wallets/src/openapi.json
user: login: jmderby
body: having to manually update this schema anytime main api changes is pita. a nice to have would be hit the api and retrieve the schema for all /wallets endpoints would be nice but might not be trivial to implement.
created_at: 2025-04-12T00:49:38Z
author_association: CONTRIBUTOR
diff_hunk: @@ -9009,6 +9009,80 @@
                                                 }
path: packages/wallets/src/openapi.json
user: login: AlbertoElias
body: yeah, not a fan of our autogen tool because we can't attach it to a url. maybe a pre-commit script?
created_at: 2025-04-12T16:19:30Z
author_association: CONTRIBUTOR

PR comments:
user: login: changeset-bot[bot]
created_at: 2025-04-12T00:45:27Z
body: ###  🦋  Changeset detected

Latest commit: 34ca59ce2683397d6d5ad42acfed27f37cc27f48

**The changes in this PR will be included in the next version bump.**

<details><summary>This PR includes changesets to release 9 packages</summary>

  | Name                                            | Type  |
| ----------------------------------------------- | ----- |
| @crossmint/client-sdk-react-ui                  | Patch |
| @crossmint/wallets-sdk                          | Patch |
| @crossmint/auth-ssr-nextjs-demo                 | Patch |
| @crossmint/client-sdk-react-ui-starter          | Patch |
| @crossmint/client-sdk-nextjs-starter            | Patch |
| @crossmint/client-sdk-smart-wallet-next-starter | Patch |
| @crossmint/client-sdk-react-base                | Patch |
| @crossmint/client-sdk-react-native-ui           | Patch |
| expo-demo                                       | Patch |

</details>

Not sure what this means? [Click here  to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add another changeset to this PR](https://github.com/Crossmint/crossmint-sdk/new/jonathan/add-delegate-balance-types?filename=.changeset/giant-sheep-joke.md&value=---%0A%22%40crossmint%2Fclient-sdk-react-ui%22%3A%20patch%0A%22%40crossmint%2Fwallets-sdk%22%3A%20patch%0A---%0A%0ADelegate%20signers%20%26%20balances%3A%20add%20types%20%2F%20errors%0A)


author_association: NONE
user: login: vercel[bot]
created_at: 2025-04-12T00:45:28Z
body: [vc]: #yAF5LhT5EaXAl9OKHsjXC3Tfq2RkzogjANHDZMAV1Nc=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJzbWFydC13YWxsZXQtYXV0aC1kZW1vIiwicm9vdERpcmVjdG9yeSI6ImFwcHMvd2FsbGV0cy9zbWFydC13YWxsZXQvbmV4dCIsImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9jcm9zc21pbnQvc21hcnQtd2FsbGV0LWF1dGgtZGVtby9CcnEyQ29ldXE4RnIxUGpZVUZTTjhRWkxib1hiIiwicHJldmlld1VybCI6InNtYXJ0LXdhbGxldC1hdXRoLWRlbW8tZ2l0LWpvbmF0aGFuLWFkZC1kZWxlZ2EtODI3OTE2LWNyb3NzbWludC52ZXJjZWwuYXBwIiwibmV4dENvbW1pdFN0YXR1cyI6IklHTk9SRUQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiIn19LHsibmFtZSI6ImNyb3NzbWludC1zZGstcmVtaXgtc3NyIiwicm9vdERpcmVjdG9yeSI6ImFwcHMvcGF5bWVudHMvbmV4dGpzIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2Nyb3NzbWludC9jcm9zc21pbnQtc2RrLXJlbWl4LXNzci80OGlYeTlLb25HVmFqUWo0TmpidXJ2WWFoU2dkIiwicHJldmlld1VybCI6ImNyb3NzbWludC1zZGstcmVtaXgtc3NyLWdpdC1qb25hdGhhbi1hZGQtZGVsZWctMGE2ZjkzLWNyb3NzbWludC52ZXJjZWwuYXBwIiwibmV4dENvbW1pdFN0YXR1cyI6IkRFUExPWUVEIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6ImNyb3NzbWludC1zZGstcmVtaXgtc3NyLWdpdC1qb25hdGhhbi1hZGQtZGVsZWctMGE2ZjkzLWNyb3NzbWludC52ZXJjZWwuYXBwIn19XX0=
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **crossmint-sdk-remix-ssr** | ✅ Ready ([Inspect](https://vercel.com/crossmint/crossmint-sdk-remix-ssr/48iXy9KonGVajQj4NjburvYahSgd)) | [Visit Preview](https://crossmint-sdk-remix-ssr-git-jonathan-add-deleg-0a6f93-crossmint.vercel.app) | 💬 [**Add feedback**](https://vercel.live/open-feedback/crossmint-sdk-remix-ssr-git-jonathan-add-deleg-0a6f93-crossmint.vercel.app?via=pr-comment-feedback-link) | Apr 12, 2025 3:15am |

<details><summary>1 Skipped Deployment</summary>

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **smart-wallet-auth-demo** | ⬜️ Ignored ([Inspect](https://vercel.com/crossmint/smart-wallet-auth-demo/Brq2Coeuq8Fr1PjYUFSN8QZLboXb)) | [Visit Preview](https://smart-wallet-auth-demo-git-jonathan-add-delega-827916-crossmint.vercel.app) |  | Apr 12, 2025 3:15am |
</details>



author_association: NONE