@chipi-stack/backend 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wallets.ts"],"names":["CryptoJS","RpcProvider","stark","ec","CairoCustomEnum","CairoOption","CairoOptionVariant","CallData","hash","Account","num","ChipiTransactionError","API_ENDPOINTS"],"mappings":"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","file":"wallets.js","sourcesContent":["import type {\n CreateWalletParams,\n CreateWalletResponse,\n PrepareWalletCreationParams,\n PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n GetMerchantWalletParams,\n PaginationQuery,\n PaginatedResponse,\n WalletData,\n} from '@chipi-stack/types';\nimport { API_ENDPOINTS } from '@chipi-stack/shared';\nimport { ChipiClient } from './client';\n\nimport { ChipiTransactionError } from '@chipi-stack/shared';\nimport { Account, CairoCustomEnum, CairoOption, CairoOptionVariant, CallData, ec, hash, num, RpcProvider, stark } from 'starknet';\nimport CryptoJS from \"crypto-js\";\nimport { DeploymentData } from '@avnu/gasless-sdk';\n\n/**\n * Wallet management utilities\n */\nexport class ChipiWallets {\n constructor(private client: ChipiClient) {}\n\n /**\n * Prepare wallet creation data\n */\n // async prepareWalletCreation(\n // params: Omit<PrepareWalletCreationParams, 'apiPublicKey'>\n // ): Promise<PrepareWalletCreationResponse> {\n // const response = await this.client.post<PrepareWalletCreationResponse>(\n // `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n // params\n // );\n\n // return response.data!;\n // }\n\n /**\n * Create a new wallet\n */\n // async createWallet(\n // params: Omit<CreateWalletParams, 'apiPublicKey' | 'nodeUrl'>,\n // nodeUrl?: string\n // ): Promise<CreateWalletResponse> {\n // const response = await this.client.post<CreateWalletResponse>(\n // API_ENDPOINTS.CHIPI_WALLETS,\n // {\n // ...params,\n // nodeUrl,\n // },\n // params.bearerToken\n // );\n\n // return response.data!;\n // }\n\n async createWallet(params: CreateWalletParams & { backendUrl: string }): Promise<CreateWalletResponse> {\n try {\n const { encryptKey, apiPublicKey, bearerToken, nodeUrl, backendUrl } = params;\n \n const provider = new RpcProvider({ nodeUrl: nodeUrl });\n // Generating the private key with Stark Curve\n const privateKeyAX = stark.randomAddress();\n const starkKeyPubAX = ec.starkCurve.getStarkKey(privateKeyAX);\n \n // Using Argent X Account v0.4.0 class hash\n const accountClassHash = \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\" //params.argentClassHash;\n \n // Calculate future address of the ArgentX account\n const axSigner = new CairoCustomEnum({\n Starknet: { pubkey: starkKeyPubAX },\n });\n // Set the dApp Guardian address\n const axGuardian = new CairoOption<unknown>(CairoOptionVariant.None);\n \n const AXConstructorCallData = CallData.compile({\n owner: axSigner,\n guardian: axGuardian,\n });\n \n const publicKey = hash.calculateContractAddressFromHash(\n starkKeyPubAX,\n accountClassHash,\n AXConstructorCallData,\n 0\n );\n // console.log(\"Contract address: \", contractAddress);\n \n // Initiating Account\n const account = new Account(provider, publicKey, privateKeyAX);\n // console.log(\"Account \", { ...account });\n \n // Backend Call API to create the wallet\n console.log(\"apiPublicKey\", apiPublicKey);\n const typeDataResponse = await fetch(`${backendUrl}/chipi-wallets/prepare-creation`, {\n method: \"POST\",\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${bearerToken}`,\n 'x-api-key': apiPublicKey,\n },\n body: JSON.stringify({\n publicKey,\n }),\n });\n const { typeData, accountClassHash: accountClassHashResponse } = await typeDataResponse.json() as PrepareWalletCreationResponse;\n \n // console.log(\"Type data: \", typeData);\n // Sign the message\n const userSignature = await account.signMessage(typeData);\n \n // console.log(\"User signature: \", userSignature);\n const deploymentData: DeploymentData = {\n class_hash: accountClassHashResponse,\n salt: starkKeyPubAX,\n unique: `${num.toHex(0)}`,\n calldata: AXConstructorCallData.map((value) => num.toHex(value)),\n };\n \n // console.log(\"Deployment data: ------ \", deploymentData);\n const encryptedPrivateKey = this.encryptPrivateKey(privateKeyAX, encryptKey);\n // console.log(\"Encrypted private key: \", encryptedPrivateKey);\n \n // Llamar a la API para guardar la wallet en dashboard\n const executeTransactionResponse = await fetch(`${backendUrl}/chipi-wallets`, {\n method: \"POST\",\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${bearerToken}`,\n 'x-api-key': apiPublicKey,\n },\n body: JSON.stringify({\n apiPublicKey,\n publicKey,\n userSignature: {\n r: (userSignature as any).r.toString(),\n s: (userSignature as any).s.toString(),\n recovery: (userSignature as any).recovery\n },\n typeData,\n encryptedPrivateKey,\n deploymentData: {\n ...deploymentData,\n salt: `${deploymentData.salt}`,\n calldata: deploymentData.calldata.map(data => `${data}`),\n }\n }),\n });\n const executeTransaction = await executeTransactionResponse.json() as CreateWalletResponse;\n if (executeTransaction.success) {\n return {\n success: true,\n txHash: executeTransaction.txHash,\n walletPublicKey: executeTransaction.walletPublicKey,\n wallet: executeTransaction.wallet,\n };\n } else {\n return {\n success: false,\n txHash: \"\",\n walletPublicKey: \"\",\n wallet: {\n publicKey: \"\",\n encryptedPrivateKey: \"\",\n }\n }\n }\n } catch (error: unknown) {\n console.error(\"Error detallado:\", error);\n \n if (error instanceof Error && error.message.includes(\"SSL\")) {\n throw new Error(\n \"Error de conexión SSL. Intenta usando NODE_TLS_REJECT_UNAUTHORIZED=0 o verifica la URL del RPC\"\n );\n }\n throw new ChipiTransactionError(\n `Failed to create wallet: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n 'WALLET_CREATION_FAILED'\n );\n }\n }\n \n \n encryptPrivateKey = (\n privateKey: string,\n password: string,\n ): string => {\n if (!privateKey || !password) {\n throw new Error(\"Private key and password are required\");\n }\n \n return CryptoJS.AES.encrypt(privateKey, password).toString();\n };\n\n\n /**\n * Create a custodial merchant wallet\n */\n async createCustodialWallet(\n params: Omit<CreateCustodialWalletParams, 'orgId'>,\n orgId: string\n ): Promise<WalletData> {\n const response = await this.client.post<WalletData>(\n `${API_ENDPOINTS.CHIPI_WALLETS}/merchant`,\n {\n ...params,\n orgId,\n }\n );\n\n return response.data!;\n }\n\n /**\n * Get merchant wallet by API key and chain\n */\n async getMerchantWallet(\n params: GetMerchantWalletParams\n ): Promise<WalletData> {\n const response = await this.client.get<WalletData>(\n `${API_ENDPOINTS.CHIPI_WALLETS}/merchant`,\n {\n apiKeyId: params.apiKeyId,\n chain: params.chain,\n }\n );\n\n return response.data!;\n }\n\n /**\n * Get wallets for an organization\n */\n async getWallets(\n query: PaginationQuery & {\n apiKeyId: string;\n orgId: string;\n }\n ): Promise<PaginatedResponse<WalletData>> {\n const response = await this.client.get<PaginatedResponse<WalletData>>(\n API_ENDPOINTS.CHIPI_WALLETS,\n query\n );\n\n return response.data!;\n }\n}\n"]}
@@ -0,0 +1,184 @@
1
+ import { ChipiTransactionError, API_ENDPOINTS } from '@chipi-stack/shared';
2
+ import { RpcProvider, stark, ec, CairoCustomEnum, CairoOption, CairoOptionVariant, CallData, hash, Account, num } from 'starknet';
3
+ import CryptoJS from 'crypto-js';
4
+
5
+ // src/wallets.ts
6
+ var ChipiWallets = class {
7
+ constructor(client) {
8
+ this.client = client;
9
+ this.encryptPrivateKey = (privateKey, password) => {
10
+ if (!privateKey || !password) {
11
+ throw new Error("Private key and password are required");
12
+ }
13
+ return CryptoJS.AES.encrypt(privateKey, password).toString();
14
+ };
15
+ }
16
+ /**
17
+ * Prepare wallet creation data
18
+ */
19
+ // async prepareWalletCreation(
20
+ // params: Omit<PrepareWalletCreationParams, 'apiPublicKey'>
21
+ // ): Promise<PrepareWalletCreationResponse> {
22
+ // const response = await this.client.post<PrepareWalletCreationResponse>(
23
+ // `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,
24
+ // params
25
+ // );
26
+ // return response.data!;
27
+ // }
28
+ /**
29
+ * Create a new wallet
30
+ */
31
+ // async createWallet(
32
+ // params: Omit<CreateWalletParams, 'apiPublicKey' | 'nodeUrl'>,
33
+ // nodeUrl?: string
34
+ // ): Promise<CreateWalletResponse> {
35
+ // const response = await this.client.post<CreateWalletResponse>(
36
+ // API_ENDPOINTS.CHIPI_WALLETS,
37
+ // {
38
+ // ...params,
39
+ // nodeUrl,
40
+ // },
41
+ // params.bearerToken
42
+ // );
43
+ // return response.data!;
44
+ // }
45
+ async createWallet(params) {
46
+ try {
47
+ const { encryptKey, apiPublicKey, bearerToken, nodeUrl, backendUrl } = params;
48
+ const provider = new RpcProvider({ nodeUrl });
49
+ const privateKeyAX = stark.randomAddress();
50
+ const starkKeyPubAX = ec.starkCurve.getStarkKey(privateKeyAX);
51
+ const accountClassHash = "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f";
52
+ const axSigner = new CairoCustomEnum({
53
+ Starknet: { pubkey: starkKeyPubAX }
54
+ });
55
+ const axGuardian = new CairoOption(CairoOptionVariant.None);
56
+ const AXConstructorCallData = CallData.compile({
57
+ owner: axSigner,
58
+ guardian: axGuardian
59
+ });
60
+ const publicKey = hash.calculateContractAddressFromHash(
61
+ starkKeyPubAX,
62
+ accountClassHash,
63
+ AXConstructorCallData,
64
+ 0
65
+ );
66
+ const account = new Account(provider, publicKey, privateKeyAX);
67
+ console.log("apiPublicKey", apiPublicKey);
68
+ const typeDataResponse = await fetch(`${backendUrl}/chipi-wallets/prepare-creation`, {
69
+ method: "POST",
70
+ headers: {
71
+ "Content-Type": "application/json",
72
+ "Authorization": `Bearer ${bearerToken}`,
73
+ "x-api-key": apiPublicKey
74
+ },
75
+ body: JSON.stringify({
76
+ publicKey
77
+ })
78
+ });
79
+ const { typeData, accountClassHash: accountClassHashResponse } = await typeDataResponse.json();
80
+ const userSignature = await account.signMessage(typeData);
81
+ const deploymentData = {
82
+ class_hash: accountClassHashResponse,
83
+ salt: starkKeyPubAX,
84
+ unique: `${num.toHex(0)}`,
85
+ calldata: AXConstructorCallData.map((value) => num.toHex(value))
86
+ };
87
+ const encryptedPrivateKey = this.encryptPrivateKey(privateKeyAX, encryptKey);
88
+ const executeTransactionResponse = await fetch(`${backendUrl}/chipi-wallets`, {
89
+ method: "POST",
90
+ headers: {
91
+ "Content-Type": "application/json",
92
+ "Authorization": `Bearer ${bearerToken}`,
93
+ "x-api-key": apiPublicKey
94
+ },
95
+ body: JSON.stringify({
96
+ apiPublicKey,
97
+ publicKey,
98
+ userSignature: {
99
+ r: userSignature.r.toString(),
100
+ s: userSignature.s.toString(),
101
+ recovery: userSignature.recovery
102
+ },
103
+ typeData,
104
+ encryptedPrivateKey,
105
+ deploymentData: {
106
+ ...deploymentData,
107
+ salt: `${deploymentData.salt}`,
108
+ calldata: deploymentData.calldata.map((data) => `${data}`)
109
+ }
110
+ })
111
+ });
112
+ const executeTransaction = await executeTransactionResponse.json();
113
+ if (executeTransaction.success) {
114
+ return {
115
+ success: true,
116
+ txHash: executeTransaction.txHash,
117
+ walletPublicKey: executeTransaction.walletPublicKey,
118
+ wallet: executeTransaction.wallet
119
+ };
120
+ } else {
121
+ return {
122
+ success: false,
123
+ txHash: "",
124
+ walletPublicKey: "",
125
+ wallet: {
126
+ publicKey: "",
127
+ encryptedPrivateKey: ""
128
+ }
129
+ };
130
+ }
131
+ } catch (error) {
132
+ console.error("Error detallado:", error);
133
+ if (error instanceof Error && error.message.includes("SSL")) {
134
+ throw new Error(
135
+ "Error de conexi\xF3n SSL. Intenta usando NODE_TLS_REJECT_UNAUTHORIZED=0 o verifica la URL del RPC"
136
+ );
137
+ }
138
+ throw new ChipiTransactionError(
139
+ `Failed to create wallet: ${error instanceof Error ? error.message : "Unknown error"}`,
140
+ "WALLET_CREATION_FAILED"
141
+ );
142
+ }
143
+ }
144
+ /**
145
+ * Create a custodial merchant wallet
146
+ */
147
+ async createCustodialWallet(params, orgId) {
148
+ const response = await this.client.post(
149
+ `${API_ENDPOINTS.CHIPI_WALLETS}/merchant`,
150
+ {
151
+ ...params,
152
+ orgId
153
+ }
154
+ );
155
+ return response.data;
156
+ }
157
+ /**
158
+ * Get merchant wallet by API key and chain
159
+ */
160
+ async getMerchantWallet(params) {
161
+ const response = await this.client.get(
162
+ `${API_ENDPOINTS.CHIPI_WALLETS}/merchant`,
163
+ {
164
+ apiKeyId: params.apiKeyId,
165
+ chain: params.chain
166
+ }
167
+ );
168
+ return response.data;
169
+ }
170
+ /**
171
+ * Get wallets for an organization
172
+ */
173
+ async getWallets(query) {
174
+ const response = await this.client.get(
175
+ API_ENDPOINTS.CHIPI_WALLETS,
176
+ query
177
+ );
178
+ return response.data;
179
+ }
180
+ };
181
+
182
+ export { ChipiWallets };
183
+ //# sourceMappingURL=wallets.mjs.map
184
+ //# sourceMappingURL=wallets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wallets.ts"],"names":[],"mappings":"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","file":"wallets.mjs","sourcesContent":["import type {\n CreateWalletParams,\n CreateWalletResponse,\n PrepareWalletCreationParams,\n PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n GetMerchantWalletParams,\n PaginationQuery,\n PaginatedResponse,\n WalletData,\n} from '@chipi-stack/types';\nimport { API_ENDPOINTS } from '@chipi-stack/shared';\nimport { ChipiClient } from './client';\n\nimport { ChipiTransactionError } from '@chipi-stack/shared';\nimport { Account, CairoCustomEnum, CairoOption, CairoOptionVariant, CallData, ec, hash, num, RpcProvider, stark } from 'starknet';\nimport CryptoJS from \"crypto-js\";\nimport { DeploymentData } from '@avnu/gasless-sdk';\n\n/**\n * Wallet management utilities\n */\nexport class ChipiWallets {\n constructor(private client: ChipiClient) {}\n\n /**\n * Prepare wallet creation data\n */\n // async prepareWalletCreation(\n // params: Omit<PrepareWalletCreationParams, 'apiPublicKey'>\n // ): Promise<PrepareWalletCreationResponse> {\n // const response = await this.client.post<PrepareWalletCreationResponse>(\n // `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n // params\n // );\n\n // return response.data!;\n // }\n\n /**\n * Create a new wallet\n */\n // async createWallet(\n // params: Omit<CreateWalletParams, 'apiPublicKey' | 'nodeUrl'>,\n // nodeUrl?: string\n // ): Promise<CreateWalletResponse> {\n // const response = await this.client.post<CreateWalletResponse>(\n // API_ENDPOINTS.CHIPI_WALLETS,\n // {\n // ...params,\n // nodeUrl,\n // },\n // params.bearerToken\n // );\n\n // return response.data!;\n // }\n\n async createWallet(params: CreateWalletParams & { backendUrl: string }): Promise<CreateWalletResponse> {\n try {\n const { encryptKey, apiPublicKey, bearerToken, nodeUrl, backendUrl } = params;\n \n const provider = new RpcProvider({ nodeUrl: nodeUrl });\n // Generating the private key with Stark Curve\n const privateKeyAX = stark.randomAddress();\n const starkKeyPubAX = ec.starkCurve.getStarkKey(privateKeyAX);\n \n // Using Argent X Account v0.4.0 class hash\n const accountClassHash = \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\" //params.argentClassHash;\n \n // Calculate future address of the ArgentX account\n const axSigner = new CairoCustomEnum({\n Starknet: { pubkey: starkKeyPubAX },\n });\n // Set the dApp Guardian address\n const axGuardian = new CairoOption<unknown>(CairoOptionVariant.None);\n \n const AXConstructorCallData = CallData.compile({\n owner: axSigner,\n guardian: axGuardian,\n });\n \n const publicKey = hash.calculateContractAddressFromHash(\n starkKeyPubAX,\n accountClassHash,\n AXConstructorCallData,\n 0\n );\n // console.log(\"Contract address: \", contractAddress);\n \n // Initiating Account\n const account = new Account(provider, publicKey, privateKeyAX);\n // console.log(\"Account \", { ...account });\n \n // Backend Call API to create the wallet\n console.log(\"apiPublicKey\", apiPublicKey);\n const typeDataResponse = await fetch(`${backendUrl}/chipi-wallets/prepare-creation`, {\n method: \"POST\",\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${bearerToken}`,\n 'x-api-key': apiPublicKey,\n },\n body: JSON.stringify({\n publicKey,\n }),\n });\n const { typeData, accountClassHash: accountClassHashResponse } = await typeDataResponse.json() as PrepareWalletCreationResponse;\n \n // console.log(\"Type data: \", typeData);\n // Sign the message\n const userSignature = await account.signMessage(typeData);\n \n // console.log(\"User signature: \", userSignature);\n const deploymentData: DeploymentData = {\n class_hash: accountClassHashResponse,\n salt: starkKeyPubAX,\n unique: `${num.toHex(0)}`,\n calldata: AXConstructorCallData.map((value) => num.toHex(value)),\n };\n \n // console.log(\"Deployment data: ------ \", deploymentData);\n const encryptedPrivateKey = this.encryptPrivateKey(privateKeyAX, encryptKey);\n // console.log(\"Encrypted private key: \", encryptedPrivateKey);\n \n // Llamar a la API para guardar la wallet en dashboard\n const executeTransactionResponse = await fetch(`${backendUrl}/chipi-wallets`, {\n method: \"POST\",\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${bearerToken}`,\n 'x-api-key': apiPublicKey,\n },\n body: JSON.stringify({\n apiPublicKey,\n publicKey,\n userSignature: {\n r: (userSignature as any).r.toString(),\n s: (userSignature as any).s.toString(),\n recovery: (userSignature as any).recovery\n },\n typeData,\n encryptedPrivateKey,\n deploymentData: {\n ...deploymentData,\n salt: `${deploymentData.salt}`,\n calldata: deploymentData.calldata.map(data => `${data}`),\n }\n }),\n });\n const executeTransaction = await executeTransactionResponse.json() as CreateWalletResponse;\n if (executeTransaction.success) {\n return {\n success: true,\n txHash: executeTransaction.txHash,\n walletPublicKey: executeTransaction.walletPublicKey,\n wallet: executeTransaction.wallet,\n };\n } else {\n return {\n success: false,\n txHash: \"\",\n walletPublicKey: \"\",\n wallet: {\n publicKey: \"\",\n encryptedPrivateKey: \"\",\n }\n }\n }\n } catch (error: unknown) {\n console.error(\"Error detallado:\", error);\n \n if (error instanceof Error && error.message.includes(\"SSL\")) {\n throw new Error(\n \"Error de conexión SSL. Intenta usando NODE_TLS_REJECT_UNAUTHORIZED=0 o verifica la URL del RPC\"\n );\n }\n throw new ChipiTransactionError(\n `Failed to create wallet: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n 'WALLET_CREATION_FAILED'\n );\n }\n }\n \n \n encryptPrivateKey = (\n privateKey: string,\n password: string,\n ): string => {\n if (!privateKey || !password) {\n throw new Error(\"Private key and password are required\");\n }\n \n return CryptoJS.AES.encrypt(privateKey, password).toString();\n };\n\n\n /**\n * Create a custodial merchant wallet\n */\n async createCustodialWallet(\n params: Omit<CreateCustodialWalletParams, 'orgId'>,\n orgId: string\n ): Promise<WalletData> {\n const response = await this.client.post<WalletData>(\n `${API_ENDPOINTS.CHIPI_WALLETS}/merchant`,\n {\n ...params,\n orgId,\n }\n );\n\n return response.data!;\n }\n\n /**\n * Get merchant wallet by API key and chain\n */\n async getMerchantWallet(\n params: GetMerchantWalletParams\n ): Promise<WalletData> {\n const response = await this.client.get<WalletData>(\n `${API_ENDPOINTS.CHIPI_WALLETS}/merchant`,\n {\n apiKeyId: params.apiKeyId,\n chain: params.chain,\n }\n );\n\n return response.data!;\n }\n\n /**\n * Get wallets for an organization\n */\n async getWallets(\n query: PaginationQuery & {\n apiKeyId: string;\n orgId: string;\n }\n ): Promise<PaginatedResponse<WalletData>> {\n const response = await this.client.get<PaginatedResponse<WalletData>>(\n API_ENDPOINTS.CHIPI_WALLETS,\n query\n );\n\n return response.data!;\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "@chipi-stack/backend",
3
+ "version": "0.1.0",
4
+ "description": "Chipi Backend SDK - Server utilities for wallet creation, transactions, and SKU management",
5
+ "homepage": "https://github.com/chipi-pay/chipi-sdk",
6
+ "bugs": {
7
+ "url": "https://github.com/chipi-pay/chipi-sdk/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/chipi-pay/chipi-sdk.git",
12
+ "directory": "sdks/backend"
13
+ },
14
+ "license": "MIT",
15
+ "author": "Chipi Pay",
16
+ "exports": {
17
+ ".": {
18
+ "import": {
19
+ "types": "./dist/index.d.ts",
20
+ "default": "./dist/index.mjs"
21
+ },
22
+ "require": {
23
+ "types": "./dist/index.d.ts",
24
+ "default": "./dist/index.js"
25
+ }
26
+ },
27
+ "./wallets": {
28
+ "import": {
29
+ "types": "./dist/wallets.d.ts",
30
+ "default": "./dist/wallets.mjs"
31
+ },
32
+ "require": {
33
+ "types": "./dist/wallets.d.ts",
34
+ "default": "./dist/wallets.js"
35
+ }
36
+ },
37
+ "./transactions": {
38
+ "import": {
39
+ "types": "./dist/transactions.d.ts",
40
+ "default": "./dist/transactions.mjs"
41
+ },
42
+ "require": {
43
+ "types": "./dist/transactions.d.ts",
44
+ "default": "./dist/transactions.js"
45
+ }
46
+ },
47
+ "./skus": {
48
+ "import": {
49
+ "types": "./dist/skus.d.ts",
50
+ "default": "./dist/skus.mjs"
51
+ },
52
+ "require": {
53
+ "types": "./dist/skus.d.ts",
54
+ "default": "./dist/skus.js"
55
+ }
56
+ },
57
+ "./package.json": "./package.json"
58
+ },
59
+ "main": "./dist/index.js",
60
+ "files": [
61
+ "dist",
62
+ "wallets",
63
+ "transactions",
64
+ "skus"
65
+ ],
66
+ "scripts": {
67
+ "build": "tsup",
68
+ "build:declarations": "tsc -p tsconfig.declarations.json",
69
+ "clean": "rimraf ./dist",
70
+ "dev": "tsup --watch",
71
+ "dev:publish": "pnpm dev -- --env.publish",
72
+ "format": "prettier --write src/**/*.ts",
73
+ "format:check": "prettier --check src/**/*.ts",
74
+ "lint": "eslint src",
75
+ "typecheck": "tsc --noEmit"
76
+ },
77
+ "dependencies": {
78
+ "@avnu/gasless-sdk": "0.1.8",
79
+ "@chipi-stack/shared": "workspace:^",
80
+ "@chipi-stack/types": "workspace:^",
81
+ "crypto-js": "^4.2.0",
82
+ "starknet": "6.11.0"
83
+ },
84
+ "devDependencies": {
85
+ "@types/node": "^22.15.15",
86
+ "@types/crypto-js": "^4.2.2",
87
+ "eslint": "^9.33.0",
88
+ "prettier": "^3.0.0",
89
+ "rimraf": "^5.0.0",
90
+ "tsup": "^8.3.6",
91
+ "typescript": "^5.7.3"
92
+ },
93
+ "engines": {
94
+ "node": ">=18.17.0"
95
+ },
96
+ "publishConfig": {
97
+ "access": "public"
98
+ }
99
+ }