@chipi-stack/backend 7.0.0 → 9.0.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.
@@ -1,25 +1,18 @@
1
1
  import { STARKNET_CONTRACTS } from '@chipi-stack/types';
2
2
  import { formatAmount, API_ENDPOINTS } from '@chipi-stack/shared';
3
3
  import { RpcProvider, Account } from 'starknet';
4
- import CryptoJS from 'crypto-js';
4
+ import CryptoES from 'crypto-es';
5
5
 
6
6
  // src/transactions.ts
7
7
  var decryptPrivateKey = (encryptedPrivateKey, password) => {
8
- if (!encryptedPrivateKey || !password) {
9
- console.error("Encrypted private key and password are required");
10
- return null;
11
- }
12
8
  try {
13
- const bytes = CryptoJS.AES.decrypt(encryptedPrivateKey, password);
14
- const decrypted = bytes.toString(CryptoJS.enc.Utf8);
15
- if (!decrypted) {
16
- console.error("Decryption resulted in empty string");
17
- return null;
18
- }
9
+ const bytes = CryptoES.AES.decrypt(encryptedPrivateKey, password);
10
+ const decrypted = bytes.toString(CryptoES.enc.Utf8);
11
+ if (!decrypted) throw new Error("Decryption failed");
19
12
  return decrypted;
20
13
  } catch (error) {
21
14
  console.error("Decryption failed:", error);
22
- return null;
15
+ throw new Error(`Decryption failed: ${error}`);
23
16
  }
24
17
  };
25
18
 
@@ -42,42 +35,48 @@ var executePaymasterTransaction = async (params) => {
42
35
  wallet.publicKey,
43
36
  privateKeyDecrypted
44
37
  );
45
- const typeDataResponse = await fetch(`${backendUrl}/transactions/prepare-typed-data`, {
46
- method: "POST",
47
- headers: {
48
- "Content-Type": "application/json",
49
- "Authorization": `Bearer ${bearerToken}`,
50
- "X-API-Key": apiPublicKey
51
- },
52
- body: JSON.stringify({
53
- publicKey: wallet.publicKey,
54
- calls,
55
- accountClassHash: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
56
- })
57
- });
38
+ const typeDataResponse = await fetch(
39
+ `${backendUrl}/transactions/prepare-typed-data`,
40
+ {
41
+ method: "POST",
42
+ headers: {
43
+ "Content-Type": "application/json",
44
+ Authorization: `Bearer ${bearerToken}`,
45
+ "X-API-Key": apiPublicKey
46
+ },
47
+ body: JSON.stringify({
48
+ publicKey: wallet.publicKey,
49
+ calls,
50
+ accountClassHash: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
51
+ })
52
+ }
53
+ );
58
54
  if (!typeDataResponse.ok) {
59
55
  const errorText = await typeDataResponse.text();
60
56
  throw new Error(`Error en la API: ${errorText}`);
61
57
  }
62
58
  const typeData = await typeDataResponse.json();
63
59
  const userSignature = await account.signMessage(typeData);
64
- const executeTransaction = await fetch(`${backendUrl}/transactions/execute-sponsored-transaction`, {
65
- method: "POST",
66
- headers: {
67
- "Content-Type": "application/json",
68
- "Authorization": `Bearer ${bearerToken}`,
69
- "X-API-Key": apiPublicKey
70
- },
71
- body: JSON.stringify({
72
- publicKey: wallet.publicKey,
73
- typeData,
74
- userSignature: {
75
- r: userSignature.r.toString(),
76
- s: userSignature.s.toString(),
77
- recovery: userSignature.recovery
78
- }
79
- })
80
- });
60
+ const executeTransaction = await fetch(
61
+ `${backendUrl}/transactions/execute-sponsored-transaction`,
62
+ {
63
+ method: "POST",
64
+ headers: {
65
+ "Content-Type": "application/json",
66
+ Authorization: `Bearer ${bearerToken}`,
67
+ "X-API-Key": apiPublicKey
68
+ },
69
+ body: JSON.stringify({
70
+ publicKey: wallet.publicKey,
71
+ typeData,
72
+ userSignature: {
73
+ r: userSignature.r.toString(),
74
+ s: userSignature.s.toString(),
75
+ recovery: userSignature.recovery
76
+ }
77
+ })
78
+ }
79
+ );
81
80
  if (!executeTransaction.ok) {
82
81
  const errorText = await executeTransaction.text();
83
82
  throw new Error(`Error en la API de ejecuci\xF3n: ${errorText}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/encryption.ts","../src/gasless.ts","../src/transactions.ts"],"names":[],"mappings":"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","file":"transactions.mjs","sourcesContent":["import CryptoJS from \"crypto-js\";\n\nexport const 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\nexport const decryptPrivateKey = (\n encryptedPrivateKey: string,\n password: string,\n): string | null => {\n if (!encryptedPrivateKey || !password) {\n console.error(\"Encrypted private key and password are required\");\n return null;\n }\n\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedPrivateKey, password);\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\n if (!decrypted) {\n console.error(\"Decryption resulted in empty string\");\n return null;\n }\n return decrypted;\n } catch (error) {\n console.error(\"Decryption failed:\", error);\n return null;\n }\n};\n","import type { ExecuteSponsoredTransactionResponse, ExecuteTransactionParams } from '@chipi-stack/types';\nimport { Account, RpcProvider, TypedData } from 'starknet';\nimport { decryptPrivateKey } from './lib';\n\n// This will need to be imported from the actual gasless SDK or implemented\n// For now, this is a placeholder implementation based on the original SDK\n\n/**\n * Execute a paymaster transaction (gasless)\n */\nexport const executePaymasterTransaction = async (\n params: ExecuteTransactionParams & {backendUrl: string} // Backend url shit is temporary\n): Promise<string> => {\n try {\n const { encryptKey, wallet, calls, apiPublicKey, bearerToken,backendUrl } = params;\n\n // Fetch the encrypted private key from clerk public metadata\n const privateKeyDecrypted = decryptPrivateKey(\n wallet.encryptedPrivateKey,\n encryptKey\n );\n\n if (!privateKeyDecrypted) {\n throw new Error(\"Failed to decrypt private key\");\n }\n\n const provider = new RpcProvider({\n nodeUrl: \"https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7\",\n });\n\n const account = new Account(\n provider,\n wallet.publicKey,\n privateKeyDecrypted\n );\n\n // Build the type data\n const typeDataResponse = await fetch(`${backendUrl}/transactions/prepare-typed-data`, {\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: wallet.publicKey,\n calls: calls,\n accountClassHash: \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\"\n }),\n });\n\n if (!typeDataResponse.ok) {\n const errorText = await typeDataResponse.text();\n throw new Error(`Error en la API: ${errorText}`);\n }\n\n const typeData = await typeDataResponse.json() as TypedData;\n\n // Sign the message\n const userSignature = await account.signMessage(typeData);\n\n \n // Execute the transaction\n const executeTransaction = await fetch(`${backendUrl}/transactions/execute-sponsored-transaction`, {\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: wallet.publicKey,\n typeData: typeData,\n userSignature: {\n r: (userSignature as any).r.toString(),\n s: (userSignature as any).s.toString(),\n recovery: (userSignature as any).recovery\n }\n }),\n });\n\n if (!executeTransaction.ok) {\n const errorText = await executeTransaction.text();\n throw new Error(`Error en la API de ejecución: ${errorText}`);\n }\n\n const result = await executeTransaction.json() as ExecuteSponsoredTransactionResponse;\n \n if (!result.transactionHash) {\n throw new Error('La respuesta no contiene el hash de la transacción');\n }\n\n return result.transactionHash;\n } catch (error) {\n console.error(\"Error sending transaction with paymaster\", error);\n throw error;\n }\n};\n\n","import {\n STARKNET_CONTRACTS,\n type ExecuteTransactionParams,\n type RecordSendTransactionParams,\n type Transaction,\n type TransferParams,\n} from '@chipi-stack/types';\nimport { API_ENDPOINTS, formatAmount } from '@chipi-stack/shared';\nimport { ChipiClient } from './client';\nimport { executePaymasterTransaction } from './gasless';\n\n/**\n * Transaction management utilities\n */\nexport class ChipiTransactions {\n constructor(private client: ChipiClient) {}\n /**\n * Execute a gasless transaction using paymaster\n */\n async executeTransaction(\n params: Omit<ExecuteTransactionParams, 'apiPublicKey'>\n ): Promise<string> {\n return executePaymasterTransaction({\n ...params,\n apiPublicKey: this.client.getApiPublicKey(),\n backendUrl: this.client.baseUrl,\n });\n }\n\n /**\n * Transfer tokens\n */\n async transfer({\n params,\n bearerToken,\n }: {\n params: TransferParams;\n bearerToken: string;\n }): Promise<string> {\n const { encryptKey, wallet, token, otherToken, recipient, amount } = params\n const contract = STARKNET_CONTRACTS[token];\n let contractAddress = contract.contractAddress;\n let decimals = contract.decimals;\n if (token === 'OTHER') {\n if (!otherToken) {\n throw new Error('Other token is required when token is OTHER');\n }\n contractAddress = otherToken.contractAddress;\n decimals = otherToken.decimals;\n }\n const formattedAmount = formatAmount(amount, decimals);\n return this.executeTransaction({\n encryptKey,\n wallet,\n bearerToken,\n calls: [\n {\n contractAddress,\n entrypoint: 'transfer',\n calldata: [\n recipient,\n formattedAmount,\n '0x0',\n ],\n },\n ],\n });\n }\n\n /**\n * Approve token spending\n */\n async approve(params: {\n encryptKey: string;\n wallet: any;\n contractAddress: string;\n spender: string;\n amount: string | number;\n decimals?: number;\n bearerToken: string;\n }): Promise<string> {\n const formattedAmount = formatAmount(params.amount, params.decimals);\n \n return this.executeTransaction({\n encryptKey: params.encryptKey,\n wallet: params.wallet,\n bearerToken: params.bearerToken,\n calls: [\n {\n contractAddress: params.contractAddress,\n entrypoint: 'approve',\n calldata: [\n params.spender,\n formattedAmount,\n '0x0',\n ],\n },\n ],\n });\n }\n\n /**\n * Call any contract method\n */\n async callAnyContract(params: {\n encryptKey: string;\n wallet: any;\n calls: any[];\n bearerToken: string;\n }): Promise<string> {\n return this.executeTransaction({\n encryptKey: params.encryptKey,\n wallet: params.wallet,\n bearerToken: params.bearerToken,\n calls: params.calls,\n });\n }\n\n /**\n * Record a send transaction\n */\n async recordSendTransaction(\n {\n params,\n bearerToken,\n }: {\n params: RecordSendTransactionParams;\n bearerToken: string;\n }\n ): Promise<Transaction> {\n const response = await this.client.post<Transaction>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/record-send`,\n bearerToken,\n body: params,\n });\n return response;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/encryption.ts","../src/gasless.ts","../src/transactions.ts"],"names":[],"mappings":"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","file":"transactions.mjs","sourcesContent":["import CryptoES from \"crypto-es\";\n\nexport const encryptPrivateKey = (\n privateKey: string,\n password: string\n): string => {\n return CryptoES.AES.encrypt(privateKey, password).toString();\n};\n\nexport const decryptPrivateKey = (\n encryptedPrivateKey: string,\n password: string\n): string => {\n try {\n const bytes = CryptoES.AES.decrypt(encryptedPrivateKey, password);\n const decrypted = bytes.toString(CryptoES.enc.Utf8);\n\n // Check if the decrypted string is empty\n if (!decrypted) throw new Error(\"Decryption failed\");\n\n return decrypted;\n } catch (error) {\n console.error(\"Decryption failed:\", error);\n throw new Error(`Decryption failed: ${error}`);\n }\n};\n","import type {\n ExecuteSponsoredTransactionResponse,\n ExecuteTransactionParams,\n} from \"@chipi-stack/types\";\nimport { Account, RpcProvider, TypedData } from \"starknet\";\nimport { decryptPrivateKey } from \"./encryption\";\n\n// This will need to be imported from the actual gasless SDK or implemented\n// For now, this is a placeholder implementation based on the original SDK\n\n/**\n * Execute a paymaster transaction (gasless)\n */\nexport const executePaymasterTransaction = async (\n params: ExecuteTransactionParams & { backendUrl: string } // Backend url shit is temporary\n): Promise<string> => {\n try {\n const { encryptKey, wallet, calls, apiPublicKey, bearerToken, backendUrl } =\n params;\n\n // Fetch the encrypted private key from clerk public metadata\n const privateKeyDecrypted = decryptPrivateKey(\n wallet.encryptedPrivateKey,\n encryptKey\n );\n\n if (!privateKeyDecrypted) {\n throw new Error(\"Failed to decrypt private key\");\n }\n\n const provider = new RpcProvider({\n nodeUrl: \"https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7\",\n });\n\n const account = new Account(\n provider,\n wallet.publicKey,\n privateKeyDecrypted\n );\n\n // Build the type data\n const typeDataResponse = await fetch(\n `${backendUrl}/transactions/prepare-typed-data`,\n {\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: wallet.publicKey,\n calls: calls,\n accountClassHash:\n \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\",\n }),\n }\n );\n\n if (!typeDataResponse.ok) {\n const errorText = await typeDataResponse.text();\n throw new Error(`Error en la API: ${errorText}`);\n }\n\n const typeData = (await typeDataResponse.json()) as TypedData;\n\n // Sign the message\n const userSignature = await account.signMessage(typeData);\n\n // Execute the transaction\n const executeTransaction = await fetch(\n `${backendUrl}/transactions/execute-sponsored-transaction`,\n {\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: wallet.publicKey,\n typeData: typeData,\n userSignature: {\n r: (userSignature as any).r.toString(),\n s: (userSignature as any).s.toString(),\n recovery: (userSignature as any).recovery,\n },\n }),\n }\n );\n\n if (!executeTransaction.ok) {\n const errorText = await executeTransaction.text();\n throw new Error(`Error en la API de ejecución: ${errorText}`);\n }\n\n const result =\n (await executeTransaction.json()) as ExecuteSponsoredTransactionResponse;\n\n if (!result.transactionHash) {\n throw new Error(\"La respuesta no contiene el hash de la transacción\");\n }\n\n return result.transactionHash;\n } catch (error) {\n console.error(\"Error sending transaction with paymaster\", error);\n throw error;\n }\n};\n","import {\n STARKNET_CONTRACTS,\n type ExecuteTransactionParams,\n type RecordSendTransactionParams,\n type Transaction,\n type TransferParams,\n} from '@chipi-stack/types';\nimport { API_ENDPOINTS, formatAmount } from '@chipi-stack/shared';\nimport { ChipiClient } from './client';\nimport { executePaymasterTransaction } from './gasless';\n\n/**\n * Transaction management utilities\n */\nexport class ChipiTransactions {\n constructor(private client: ChipiClient) {}\n /**\n * Execute a gasless transaction using paymaster\n */\n async executeTransaction(\n params: Omit<ExecuteTransactionParams, 'apiPublicKey'>\n ): Promise<string> {\n return executePaymasterTransaction({\n ...params,\n apiPublicKey: this.client.getApiPublicKey(),\n backendUrl: this.client.baseUrl,\n });\n }\n\n /**\n * Transfer tokens\n */\n async transfer({\n params,\n bearerToken,\n }: {\n params: TransferParams;\n bearerToken: string;\n }): Promise<string> {\n const { encryptKey, wallet, token, otherToken, recipient, amount } = params\n const contract = STARKNET_CONTRACTS[token];\n let contractAddress = contract.contractAddress;\n let decimals = contract.decimals;\n if (token === 'OTHER') {\n if (!otherToken) {\n throw new Error('Other token is required when token is OTHER');\n }\n contractAddress = otherToken.contractAddress;\n decimals = otherToken.decimals;\n }\n const formattedAmount = formatAmount(amount, decimals);\n return this.executeTransaction({\n encryptKey,\n wallet,\n bearerToken,\n calls: [\n {\n contractAddress,\n entrypoint: 'transfer',\n calldata: [\n recipient,\n formattedAmount,\n '0x0',\n ],\n },\n ],\n });\n }\n\n /**\n * Approve token spending\n */\n async approve(params: {\n encryptKey: string;\n wallet: any;\n contractAddress: string;\n spender: string;\n amount: string | number;\n decimals?: number;\n bearerToken: string;\n }): Promise<string> {\n const formattedAmount = formatAmount(params.amount, params.decimals);\n \n return this.executeTransaction({\n encryptKey: params.encryptKey,\n wallet: params.wallet,\n bearerToken: params.bearerToken,\n calls: [\n {\n contractAddress: params.contractAddress,\n entrypoint: 'approve',\n calldata: [\n params.spender,\n formattedAmount,\n '0x0',\n ],\n },\n ],\n });\n }\n\n /**\n * Call any contract method\n */\n async callAnyContract(params: {\n encryptKey: string;\n wallet: any;\n calls: any[];\n bearerToken: string;\n }): Promise<string> {\n return this.executeTransaction({\n encryptKey: params.encryptKey,\n wallet: params.wallet,\n bearerToken: params.bearerToken,\n calls: params.calls,\n });\n }\n\n /**\n * Record a send transaction\n */\n async recordSendTransaction(\n {\n params,\n bearerToken,\n }: {\n params: RecordSendTransactionParams;\n bearerToken: string;\n }\n ): Promise<Transaction> {\n const response = await this.client.post<Transaction>({\n endpoint: `${API_ENDPOINTS.TRANSACTIONS}/record-send`,\n bearerToken,\n body: params,\n });\n return response;\n }\n}\n"]}
@@ -7,17 +7,9 @@ import { C as ChipiClient } from './client-D4ZnPqgQ.mjs';
7
7
  declare class ChipiWallets {
8
8
  private client;
9
9
  constructor(client: ChipiClient);
10
- /**
11
- * Prepare wallet creation data
12
- */
13
- /**
14
- * Create a new wallet
15
- */
16
10
  createWallet(params: CreateWalletParams & {
17
11
  bearerToken: string;
18
12
  }): Promise<CreateWalletResponse>;
19
- encryptPrivateKey: (privateKey: string, password: string) => string;
20
- decryptPrivateKey: (encryptedPrivateKey: string, encryptKey: string) => string;
21
13
  /**
22
14
  * Create a custodial merchant wallet
23
15
  */
@@ -26,6 +18,7 @@ declare class ChipiWallets {
26
18
  bearerToken: string;
27
19
  }): Promise<WalletData>;
28
20
  getWallet(params: GetWalletParams): Promise<WalletDataResponse>;
21
+ getPrivateKeyAX: () => string;
29
22
  }
30
23
 
31
24
  export { ChipiWallets };
package/dist/wallets.d.ts CHANGED
@@ -7,17 +7,9 @@ import { C as ChipiClient } from './client-D4ZnPqgQ.js';
7
7
  declare class ChipiWallets {
8
8
  private client;
9
9
  constructor(client: ChipiClient);
10
- /**
11
- * Prepare wallet creation data
12
- */
13
- /**
14
- * Create a new wallet
15
- */
16
10
  createWallet(params: CreateWalletParams & {
17
11
  bearerToken: string;
18
12
  }): Promise<CreateWalletResponse>;
19
- encryptPrivateKey: (privateKey: string, password: string) => string;
20
- decryptPrivateKey: (encryptedPrivateKey: string, encryptKey: string) => string;
21
13
  /**
22
14
  * Create a custodial merchant wallet
23
15
  */
@@ -26,6 +18,7 @@ declare class ChipiWallets {
26
18
  bearerToken: string;
27
19
  }): Promise<WalletData>;
28
20
  getWallet(params: GetWalletParams): Promise<WalletDataResponse>;
21
+ getPrivateKeyAX: () => string;
29
22
  }
30
23
 
31
24
  export { ChipiWallets };
package/dist/wallets.js CHANGED
@@ -1,60 +1,33 @@
1
1
  'use strict';
2
2
 
3
3
  var shared = require('@chipi-stack/shared');
4
+ var CryptoES2 = require('crypto-es');
4
5
  var starknet = require('starknet');
5
- var CryptoJS = require('crypto-js');
6
6
 
7
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
8
 
9
- var CryptoJS__default = /*#__PURE__*/_interopDefault(CryptoJS);
9
+ var CryptoES2__default = /*#__PURE__*/_interopDefault(CryptoES2);
10
+
11
+ // src/wallets.ts
12
+ var encryptPrivateKey = (privateKey, password) => {
13
+ return CryptoES2__default.default.AES.encrypt(privateKey, password).toString();
14
+ };
10
15
 
11
16
  // src/wallets.ts
12
17
  var ChipiWallets = class {
13
18
  constructor(client) {
14
19
  this.client = client;
15
- this.encryptPrivateKey = (privateKey, password) => {
16
- if (!privateKey || !password) {
17
- throw new Error("Private key and password are required");
18
- }
19
- return CryptoJS__default.default.AES.encrypt(privateKey, password).toString();
20
- };
21
- this.decryptPrivateKey = (encryptedPrivateKey, encryptKey) => {
22
- try {
23
- return CryptoJS__default.default.AES.decrypt(encryptedPrivateKey, encryptKey).toString(CryptoJS__default.default.enc.Utf8);
24
- } catch (error) {
25
- throw new Error(`Failed to decrypt private key: ${error instanceof Error ? error.message : "Unknown error"}`);
26
- }
20
+ this.getPrivateKeyAX = () => {
21
+ const privateKeyBytes = CryptoES2__default.default.lib.WordArray.random(32);
22
+ const privateKey = privateKeyBytes.toString(CryptoES2__default.default.enc.Hex);
23
+ const fullPrivateKey = `0x${privateKey}`;
24
+ const maxStarknetValue = BigInt(
25
+ "0x800000000000000000000000000000000000000000000000000000000000000"
26
+ );
27
+ const privateKeyBigInt = BigInt(fullPrivateKey) % maxStarknetValue;
28
+ return `0x${privateKeyBigInt.toString(16)}`;
27
29
  };
28
30
  }
29
- /**
30
- * Prepare wallet creation data
31
- */
32
- // async prepareWalletCreation(
33
- // params: Omit<PrepareWalletCreationParams, 'apiPublicKey'>
34
- // ): Promise<PrepareWalletCreationResponse> {
35
- // const response = await this.client.post<PrepareWalletCreationResponse>(
36
- // `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,
37
- // params
38
- // );
39
- // return response.data!;
40
- // }
41
- /**
42
- * Create a new wallet
43
- */
44
- // async createWallet(
45
- // params: Omit<CreateWalletParams, 'apiPublicKey' | 'nodeUrl'>,
46
- // nodeUrl?: string
47
- // ): Promise<CreateWalletResponse> {
48
- // const response = await this.client.post<CreateWalletResponse>(
49
- // API_ENDPOINTS.CHIPI_WALLETS,
50
- // {
51
- // ...params,
52
- // nodeUrl,
53
- // },
54
- // params.bearerToken
55
- // );
56
- // return response.data!;
57
- // }
58
31
  async createWallet(params) {
59
32
  try {
60
33
  const { encryptKey, externalUserId, bearerToken } = params;
@@ -92,10 +65,7 @@ var ChipiWallets = class {
92
65
  unique: `${starknet.num.toHex(0)}`,
93
66
  calldata: AXConstructorCallData.map((value) => starknet.num.toHex(value))
94
67
  };
95
- const encryptedPrivateKey = this.encryptPrivateKey(
96
- privateKeyAX,
97
- encryptKey
98
- );
68
+ const encryptedPrivateKey = encryptPrivateKey(privateKeyAX, encryptKey);
99
69
  const executeTransactionResponse = await this.client.post({
100
70
  endpoint: `${shared.API_ENDPOINTS.CHIPI_WALLETS}`,
101
71
  bearerToken,
@@ -151,11 +121,13 @@ var ChipiWallets = class {
151
121
  async getWallet(params) {
152
122
  try {
153
123
  const { externalUserId, bearerToken } = params;
154
- const getWalletResponse = await this.client.get({
155
- endpoint: `${shared.API_ENDPOINTS.CHIPI_WALLETS}/by-user`,
156
- params: { externalUserId },
157
- bearerToken
158
- });
124
+ const getWalletResponse = await this.client.get(
125
+ {
126
+ endpoint: `${shared.API_ENDPOINTS.CHIPI_WALLETS}/by-user`,
127
+ params: { externalUserId },
128
+ bearerToken
129
+ }
130
+ );
159
131
  return {
160
132
  publicKey: getWalletResponse.publicKey,
161
133
  encryptedPrivateKey: getWalletResponse.encryptedPrivateKey
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/wallets.ts"],"names":["CryptoJS","RpcProvider","stark","ec","CairoCustomEnum","CairoOption","CairoOptionVariant","CallData","hash","Account","API_ENDPOINTS","num","ChipiTransactionError"],"mappings":"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","file":"wallets.js","sourcesContent":["import type {\n CreateWalletParams,\n CreateWalletResponse,\n PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n WalletData,\n WalletDataResponse,\n GetWalletParams,\n BackendGetWalletResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\n\nimport { ChipiTransactionError } from \"@chipi-stack/shared\";\nimport {\n Account,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n ec,\n hash,\n num,\n RpcProvider,\n stark,\n} 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(\n params: CreateWalletParams & { bearerToken: string }\n ): Promise<CreateWalletResponse> {\n try {\n \n const { encryptKey, externalUserId, bearerToken } = params;\n\n const provider = new RpcProvider({ nodeUrl: this.client.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 =\n \"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 \n const typeDataResponse =\n await this.client.post<PrepareWalletCreationResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n bearerToken,\n body: {\n publicKey,\n },\n });\n \n \n const { typeData, accountClassHash: accountClassHashResponse } =\n typeDataResponse;\n\n\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(\n privateKeyAX,\n encryptKey\n );\n // console.log(\"Encrypted private key: \", encryptedPrivateKey);\n\n // Llamar a la API para guardar la wallet en dashboard\n const executeTransactionResponse = await this.client.post<\n CreateWalletResponse & { message: string }\n >({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}`,\n bearerToken,\n body: {\n externalUserId,\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 \n return {\n txHash: executeTransactionResponse.txHash,\n walletPublicKey: executeTransactionResponse.walletPublicKey,\n wallet: executeTransactionResponse.wallet,\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 \"SSL connection error. Try using NODE_TLS_REJECT_UNAUTHORIZED=0 or verify the RPC URL\"\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 encryptPrivateKey = (privateKey: string, password: string): 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 decryptPrivateKey = (\n encryptedPrivateKey: string,\n encryptKey: string\n ): string => {\n try {\n \n return CryptoJS.AES.decrypt(encryptedPrivateKey, encryptKey).toString(CryptoJS.enc.Utf8);\n } catch (error) {\n \n throw new Error(`Failed to decrypt private key: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n /**\n * Create a custodial merchant wallet\n */\n async createCustodialWallet({\n params,\n bearerToken,\n }: {\n params: Omit<CreateCustodialWalletParams, \"orgId\">;\n bearerToken: string;\n }): Promise<WalletData> {\n const response = await this.client.post<WalletData>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/custodial`,\n bearerToken,\n body: params,\n });\n\n return response!;\n }\n\n async getWallet(\n params:GetWalletParams\n ): Promise<WalletDataResponse> {\n try {\n const { externalUserId, bearerToken } = params;\n const getWalletResponse =\n await this.client.get<BackendGetWalletResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,\n params: { externalUserId },\n bearerToken,\n });\n \n return {\n publicKey: getWalletResponse.publicKey,\n encryptedPrivateKey: getWalletResponse.encryptedPrivateKey,\n } \n \n } catch (err) {\n throw new Error(`getWallet error: ${String(err)}`);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/encryption.ts","../src/wallets.ts"],"names":["CryptoES","RpcProvider","stark","ec","CairoCustomEnum","CairoOption","CairoOptionVariant","CallData","hash","Account","API_ENDPOINTS","num","ChipiTransactionError"],"mappings":"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","file":"wallets.js","sourcesContent":["import CryptoES from \"crypto-es\";\n\nexport const encryptPrivateKey = (\n privateKey: string,\n password: string\n): string => {\n return CryptoES.AES.encrypt(privateKey, password).toString();\n};\n\nexport const decryptPrivateKey = (\n encryptedPrivateKey: string,\n password: string\n): string => {\n try {\n const bytes = CryptoES.AES.decrypt(encryptedPrivateKey, password);\n const decrypted = bytes.toString(CryptoES.enc.Utf8);\n\n // Check if the decrypted string is empty\n if (!decrypted) throw new Error(\"Decryption failed\");\n\n return decrypted;\n } catch (error) {\n console.error(\"Decryption failed:\", error);\n throw new Error(`Decryption failed: ${error}`);\n }\n};\n","import type {\n CreateWalletParams,\n CreateWalletResponse,\n PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n WalletData,\n GetWalletParams,\n WalletDataResponse,\n BackendGetWalletResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport CryptoES from \"crypto-es\";\n\nimport { ChipiTransactionError } from \"@chipi-stack/shared\";\nimport {\n Account,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n ec,\n hash,\n num,\n RpcProvider,\n stark,\n} from \"starknet\";\nimport { DeploymentData } from \"@avnu/gasless-sdk\";\nimport { encryptPrivateKey, decryptPrivateKey } from \"./encryption\";\n/**\n * Wallet management utilities\n */\nexport class ChipiWallets {\n constructor(private client: ChipiClient) {}\n\n async createWallet(\n params: CreateWalletParams & { bearerToken: string }\n ): Promise<CreateWalletResponse> {\n try {\n const { encryptKey, externalUserId, bearerToken } = params;\n\n const provider = new RpcProvider({ nodeUrl: this.client.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 =\n \"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 const typeDataResponse =\n await this.client.post<PrepareWalletCreationResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n bearerToken,\n body: {\n publicKey,\n },\n });\n\n const { typeData, accountClassHash: accountClassHashResponse } =\n typeDataResponse;\n\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 = 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 this.client.post<\n CreateWalletResponse & { message: string }\n >({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}`,\n bearerToken,\n body: {\n externalUserId,\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\n return {\n txHash: executeTransactionResponse.txHash,\n walletPublicKey: executeTransactionResponse.walletPublicKey,\n wallet: executeTransactionResponse.wallet,\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 \"SSL connection error. Try using NODE_TLS_REJECT_UNAUTHORIZED=0 or verify the RPC URL\"\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 * Create a custodial merchant wallet\n */\n async createCustodialWallet({\n params,\n bearerToken,\n }: {\n params: Omit<CreateCustodialWalletParams, \"orgId\">;\n bearerToken: string;\n }): Promise<WalletData> {\n const response = await this.client.post<WalletData>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/custodial`,\n bearerToken,\n body: params,\n });\n\n return response!;\n }\n\n async getWallet(params: GetWalletParams): Promise<WalletDataResponse> {\n try {\n const { externalUserId, bearerToken } = params;\n const getWalletResponse = await this.client.get<BackendGetWalletResponse>(\n {\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,\n params: { externalUserId },\n bearerToken,\n }\n );\n\n return {\n publicKey: getWalletResponse.publicKey,\n encryptedPrivateKey: getWalletResponse.encryptedPrivateKey,\n };\n } catch (err) {\n throw new Error(`getWallet error: ${String(err)}`);\n }\n }\n getPrivateKeyAX = () => {\n // Generate 32 random bytes (256 bits)\n // const privateKeyBytes = Crypto.getRandomBytes(32); old implementation\n const privateKeyBytes = CryptoES.lib.WordArray.random(32);\n // Convert to hex string and ensure it's 64 characters (32 bytes)\n const privateKey = privateKeyBytes.toString(CryptoES.enc.Hex);\n\n // Add '0x' prefix\n const fullPrivateKey = `0x${privateKey}`;\n\n // Ensure the private key is within Starknet's valid range (0 to 2^251 - 1)\n // Convert to BigInt and take modulo 2^251\n const maxStarknetValue = BigInt(\n \"0x800000000000000000000000000000000000000000000000000000000000000\"\n );\n const privateKeyBigInt = BigInt(fullPrivateKey) % maxStarknetValue;\n\n // Convert back to hex string with '0x' prefix\n return `0x${privateKeyBigInt.toString(16)}`;\n };\n}\n"]}
package/dist/wallets.mjs CHANGED
@@ -1,54 +1,27 @@
1
1
  import { API_ENDPOINTS, ChipiTransactionError } from '@chipi-stack/shared';
2
+ import CryptoES2 from 'crypto-es';
2
3
  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 encryptPrivateKey = (privateKey, password) => {
7
+ return CryptoES2.AES.encrypt(privateKey, password).toString();
8
+ };
4
9
 
5
10
  // src/wallets.ts
6
11
  var ChipiWallets = class {
7
12
  constructor(client) {
8
13
  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
- this.decryptPrivateKey = (encryptedPrivateKey, encryptKey) => {
16
- try {
17
- return CryptoJS.AES.decrypt(encryptedPrivateKey, encryptKey).toString(CryptoJS.enc.Utf8);
18
- } catch (error) {
19
- throw new Error(`Failed to decrypt private key: ${error instanceof Error ? error.message : "Unknown error"}`);
20
- }
14
+ this.getPrivateKeyAX = () => {
15
+ const privateKeyBytes = CryptoES2.lib.WordArray.random(32);
16
+ const privateKey = privateKeyBytes.toString(CryptoES2.enc.Hex);
17
+ const fullPrivateKey = `0x${privateKey}`;
18
+ const maxStarknetValue = BigInt(
19
+ "0x800000000000000000000000000000000000000000000000000000000000000"
20
+ );
21
+ const privateKeyBigInt = BigInt(fullPrivateKey) % maxStarknetValue;
22
+ return `0x${privateKeyBigInt.toString(16)}`;
21
23
  };
22
24
  }
23
- /**
24
- * Prepare wallet creation data
25
- */
26
- // async prepareWalletCreation(
27
- // params: Omit<PrepareWalletCreationParams, 'apiPublicKey'>
28
- // ): Promise<PrepareWalletCreationResponse> {
29
- // const response = await this.client.post<PrepareWalletCreationResponse>(
30
- // `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,
31
- // params
32
- // );
33
- // return response.data!;
34
- // }
35
- /**
36
- * Create a new wallet
37
- */
38
- // async createWallet(
39
- // params: Omit<CreateWalletParams, 'apiPublicKey' | 'nodeUrl'>,
40
- // nodeUrl?: string
41
- // ): Promise<CreateWalletResponse> {
42
- // const response = await this.client.post<CreateWalletResponse>(
43
- // API_ENDPOINTS.CHIPI_WALLETS,
44
- // {
45
- // ...params,
46
- // nodeUrl,
47
- // },
48
- // params.bearerToken
49
- // );
50
- // return response.data!;
51
- // }
52
25
  async createWallet(params) {
53
26
  try {
54
27
  const { encryptKey, externalUserId, bearerToken } = params;
@@ -86,10 +59,7 @@ var ChipiWallets = class {
86
59
  unique: `${num.toHex(0)}`,
87
60
  calldata: AXConstructorCallData.map((value) => num.toHex(value))
88
61
  };
89
- const encryptedPrivateKey = this.encryptPrivateKey(
90
- privateKeyAX,
91
- encryptKey
92
- );
62
+ const encryptedPrivateKey = encryptPrivateKey(privateKeyAX, encryptKey);
93
63
  const executeTransactionResponse = await this.client.post({
94
64
  endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}`,
95
65
  bearerToken,
@@ -145,11 +115,13 @@ var ChipiWallets = class {
145
115
  async getWallet(params) {
146
116
  try {
147
117
  const { externalUserId, bearerToken } = params;
148
- const getWalletResponse = await this.client.get({
149
- endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,
150
- params: { externalUserId },
151
- bearerToken
152
- });
118
+ const getWalletResponse = await this.client.get(
119
+ {
120
+ endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,
121
+ params: { externalUserId },
122
+ bearerToken
123
+ }
124
+ );
153
125
  return {
154
126
  publicKey: getWalletResponse.publicKey,
155
127
  encryptedPrivateKey: getWalletResponse.encryptedPrivateKey
@@ -1 +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 PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n WalletData,\n WalletDataResponse,\n GetWalletParams,\n BackendGetWalletResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\n\nimport { ChipiTransactionError } from \"@chipi-stack/shared\";\nimport {\n Account,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n ec,\n hash,\n num,\n RpcProvider,\n stark,\n} 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(\n params: CreateWalletParams & { bearerToken: string }\n ): Promise<CreateWalletResponse> {\n try {\n \n const { encryptKey, externalUserId, bearerToken } = params;\n\n const provider = new RpcProvider({ nodeUrl: this.client.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 =\n \"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 \n const typeDataResponse =\n await this.client.post<PrepareWalletCreationResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n bearerToken,\n body: {\n publicKey,\n },\n });\n \n \n const { typeData, accountClassHash: accountClassHashResponse } =\n typeDataResponse;\n\n\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(\n privateKeyAX,\n encryptKey\n );\n // console.log(\"Encrypted private key: \", encryptedPrivateKey);\n\n // Llamar a la API para guardar la wallet en dashboard\n const executeTransactionResponse = await this.client.post<\n CreateWalletResponse & { message: string }\n >({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}`,\n bearerToken,\n body: {\n externalUserId,\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 \n return {\n txHash: executeTransactionResponse.txHash,\n walletPublicKey: executeTransactionResponse.walletPublicKey,\n wallet: executeTransactionResponse.wallet,\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 \"SSL connection error. Try using NODE_TLS_REJECT_UNAUTHORIZED=0 or verify the RPC URL\"\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 encryptPrivateKey = (privateKey: string, password: string): 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 decryptPrivateKey = (\n encryptedPrivateKey: string,\n encryptKey: string\n ): string => {\n try {\n \n return CryptoJS.AES.decrypt(encryptedPrivateKey, encryptKey).toString(CryptoJS.enc.Utf8);\n } catch (error) {\n \n throw new Error(`Failed to decrypt private key: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n };\n /**\n * Create a custodial merchant wallet\n */\n async createCustodialWallet({\n params,\n bearerToken,\n }: {\n params: Omit<CreateCustodialWalletParams, \"orgId\">;\n bearerToken: string;\n }): Promise<WalletData> {\n const response = await this.client.post<WalletData>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/custodial`,\n bearerToken,\n body: params,\n });\n\n return response!;\n }\n\n async getWallet(\n params:GetWalletParams\n ): Promise<WalletDataResponse> {\n try {\n const { externalUserId, bearerToken } = params;\n const getWalletResponse =\n await this.client.get<BackendGetWalletResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,\n params: { externalUserId },\n bearerToken,\n });\n \n return {\n publicKey: getWalletResponse.publicKey,\n encryptedPrivateKey: getWalletResponse.encryptedPrivateKey,\n } \n \n } catch (err) {\n throw new Error(`getWallet error: ${String(err)}`);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/encryption.ts","../src/wallets.ts"],"names":["CryptoES"],"mappings":"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","file":"wallets.mjs","sourcesContent":["import CryptoES from \"crypto-es\";\n\nexport const encryptPrivateKey = (\n privateKey: string,\n password: string\n): string => {\n return CryptoES.AES.encrypt(privateKey, password).toString();\n};\n\nexport const decryptPrivateKey = (\n encryptedPrivateKey: string,\n password: string\n): string => {\n try {\n const bytes = CryptoES.AES.decrypt(encryptedPrivateKey, password);\n const decrypted = bytes.toString(CryptoES.enc.Utf8);\n\n // Check if the decrypted string is empty\n if (!decrypted) throw new Error(\"Decryption failed\");\n\n return decrypted;\n } catch (error) {\n console.error(\"Decryption failed:\", error);\n throw new Error(`Decryption failed: ${error}`);\n }\n};\n","import type {\n CreateWalletParams,\n CreateWalletResponse,\n PrepareWalletCreationResponse,\n CreateCustodialWalletParams,\n WalletData,\n GetWalletParams,\n WalletDataResponse,\n BackendGetWalletResponse,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"@chipi-stack/shared\";\nimport { ChipiClient } from \"./client\";\nimport CryptoES from \"crypto-es\";\n\nimport { ChipiTransactionError } from \"@chipi-stack/shared\";\nimport {\n Account,\n CairoCustomEnum,\n CairoOption,\n CairoOptionVariant,\n CallData,\n ec,\n hash,\n num,\n RpcProvider,\n stark,\n} from \"starknet\";\nimport { DeploymentData } from \"@avnu/gasless-sdk\";\nimport { encryptPrivateKey, decryptPrivateKey } from \"./encryption\";\n/**\n * Wallet management utilities\n */\nexport class ChipiWallets {\n constructor(private client: ChipiClient) {}\n\n async createWallet(\n params: CreateWalletParams & { bearerToken: string }\n ): Promise<CreateWalletResponse> {\n try {\n const { encryptKey, externalUserId, bearerToken } = params;\n\n const provider = new RpcProvider({ nodeUrl: this.client.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 =\n \"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 const typeDataResponse =\n await this.client.post<PrepareWalletCreationResponse>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/prepare-creation`,\n bearerToken,\n body: {\n publicKey,\n },\n });\n\n const { typeData, accountClassHash: accountClassHashResponse } =\n typeDataResponse;\n\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 = 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 this.client.post<\n CreateWalletResponse & { message: string }\n >({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}`,\n bearerToken,\n body: {\n externalUserId,\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\n return {\n txHash: executeTransactionResponse.txHash,\n walletPublicKey: executeTransactionResponse.walletPublicKey,\n wallet: executeTransactionResponse.wallet,\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 \"SSL connection error. Try using NODE_TLS_REJECT_UNAUTHORIZED=0 or verify the RPC URL\"\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 * Create a custodial merchant wallet\n */\n async createCustodialWallet({\n params,\n bearerToken,\n }: {\n params: Omit<CreateCustodialWalletParams, \"orgId\">;\n bearerToken: string;\n }): Promise<WalletData> {\n const response = await this.client.post<WalletData>({\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/custodial`,\n bearerToken,\n body: params,\n });\n\n return response!;\n }\n\n async getWallet(params: GetWalletParams): Promise<WalletDataResponse> {\n try {\n const { externalUserId, bearerToken } = params;\n const getWalletResponse = await this.client.get<BackendGetWalletResponse>(\n {\n endpoint: `${API_ENDPOINTS.CHIPI_WALLETS}/by-user`,\n params: { externalUserId },\n bearerToken,\n }\n );\n\n return {\n publicKey: getWalletResponse.publicKey,\n encryptedPrivateKey: getWalletResponse.encryptedPrivateKey,\n };\n } catch (err) {\n throw new Error(`getWallet error: ${String(err)}`);\n }\n }\n getPrivateKeyAX = () => {\n // Generate 32 random bytes (256 bits)\n // const privateKeyBytes = Crypto.getRandomBytes(32); old implementation\n const privateKeyBytes = CryptoES.lib.WordArray.random(32);\n // Convert to hex string and ensure it's 64 characters (32 bytes)\n const privateKey = privateKeyBytes.toString(CryptoES.enc.Hex);\n\n // Add '0x' prefix\n const fullPrivateKey = `0x${privateKey}`;\n\n // Ensure the private key is within Starknet's valid range (0 to 2^251 - 1)\n // Convert to BigInt and take modulo 2^251\n const maxStarknetValue = BigInt(\n \"0x800000000000000000000000000000000000000000000000000000000000000\"\n );\n const privateKeyBigInt = BigInt(fullPrivateKey) % maxStarknetValue;\n\n // Convert back to hex string with '0x' prefix\n return `0x${privateKeyBigInt.toString(16)}`;\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chipi-stack/backend",
3
- "version": "7.0.0",
3
+ "version": "9.0.0",
4
4
  "description": "Chipi Backend SDK - Server utilities for wallet creation, transactions, and SKU management",
5
5
  "homepage": "https://github.com/chipi-pay/chipi-sdk",
6
6
  "bugs": {
@@ -65,14 +65,13 @@
65
65
  ],
66
66
  "dependencies": {
67
67
  "@avnu/gasless-sdk": "0.1.8",
68
- "crypto-js": "^4.2.0",
68
+ "crypto-es": "^2.1.0",
69
69
  "starknet": "6.11.0",
70
- "@chipi-stack/shared": "^7.0.0",
71
- "@chipi-stack/types": "^7.0.0"
70
+ "@chipi-stack/shared": "^9.0.0",
71
+ "@chipi-stack/types": "^9.0.0"
72
72
  },
73
73
  "devDependencies": {
74
74
  "@types/node": "^22.15.15",
75
- "@types/crypto-js": "^4.2.2",
76
75
  "eslint": "^9.33.0",
77
76
  "prettier": "^3.0.0",
78
77
  "rimraf": "^5.0.0",