@joai/warps-wallet-gaupa 1.0.0-beta.11 → 1.0.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +44 -27
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -27
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Transaction } from '@multiversx/sdk-core';
|
|
2
1
|
import { WalletProvider, WarpWalletProvider, WarpClientConfig, WarpChainInfo, WarpWalletDetails, WalletProviderFactory } from '@joai/warps';
|
|
2
|
+
import { Transaction } from '@multiversx/sdk-core';
|
|
3
3
|
|
|
4
4
|
type ProviderConfig = {
|
|
5
5
|
apiKey: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Transaction } from '@multiversx/sdk-core';
|
|
2
1
|
import { WalletProvider, WarpWalletProvider, WarpClientConfig, WarpChainInfo, WarpWalletDetails, WalletProviderFactory } from '@joai/warps';
|
|
2
|
+
import { Transaction } from '@multiversx/sdk-core';
|
|
3
3
|
|
|
4
4
|
type ProviderConfig = {
|
|
5
5
|
apiKey: string;
|
package/dist/index.js
CHANGED
|
@@ -26,20 +26,21 @@ __export(index_exports, {
|
|
|
26
26
|
module.exports = __toCommonJS(index_exports);
|
|
27
27
|
|
|
28
28
|
// src/GaupaWalletProvider.ts
|
|
29
|
-
var import_sdk_core = require("@multiversx/sdk-core");
|
|
30
29
|
var import_warps = require("@joai/warps");
|
|
30
|
+
var import_sdk_core = require("@multiversx/sdk-core");
|
|
31
31
|
|
|
32
32
|
// src/config.ts
|
|
33
33
|
var getGaupaApiUrl = (env) => {
|
|
34
|
-
if (env === "devnet") return "https://devnet-login.gaupa.xyz
|
|
35
|
-
return "https://login.gaupa.xyz
|
|
34
|
+
if (env === "devnet") return "https://devnet-login.gaupa.xyz";
|
|
35
|
+
if (env === "testnet") return "https://testnet-login.gaupa.xyz";
|
|
36
|
+
return "https://login.gaupa.xyz";
|
|
36
37
|
};
|
|
37
38
|
|
|
38
39
|
// src/GaupaApiClient.ts
|
|
39
40
|
var GaupaApiClient = class {
|
|
40
|
-
constructor(apiKey, apiUrl
|
|
41
|
-
this.apiKey = apiKey;
|
|
41
|
+
constructor(publicKey, apiKey, apiUrl) {
|
|
42
42
|
this.publicKey = publicKey;
|
|
43
|
+
this.apiKey = apiKey;
|
|
43
44
|
this.baseUrl = apiUrl.replace(/\/$/, "");
|
|
44
45
|
}
|
|
45
46
|
async createAgenticWallet(request) {
|
|
@@ -48,6 +49,12 @@ var GaupaApiClient = class {
|
|
|
48
49
|
body: JSON.stringify(request)
|
|
49
50
|
});
|
|
50
51
|
}
|
|
52
|
+
async signTransaction(request) {
|
|
53
|
+
return await this.request("/manage/submit-agentic-transaction", {
|
|
54
|
+
method: "POST",
|
|
55
|
+
body: JSON.stringify(request)
|
|
56
|
+
});
|
|
57
|
+
}
|
|
51
58
|
async signMessage(request) {
|
|
52
59
|
return this.request("/manage/sign-agentic-message", {
|
|
53
60
|
method: "POST",
|
|
@@ -65,11 +72,21 @@ var GaupaApiClient = class {
|
|
|
65
72
|
...options,
|
|
66
73
|
headers
|
|
67
74
|
});
|
|
75
|
+
const responseStatus = response.status;
|
|
76
|
+
let responseBody;
|
|
77
|
+
try {
|
|
78
|
+
responseBody = await response.text();
|
|
79
|
+
} catch (error) {
|
|
80
|
+
responseBody = `Failed to read response body: ${error}`;
|
|
81
|
+
}
|
|
68
82
|
if (!response.ok) {
|
|
69
|
-
|
|
70
|
-
|
|
83
|
+
throw new Error(`Gaupa API error (${responseStatus}): ${responseBody || "Unknown error"}`);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
return JSON.parse(responseBody || "{}");
|
|
87
|
+
} catch (error) {
|
|
88
|
+
throw new Error(`Failed to parse response JSON: ${error}. Response: ${responseBody}`);
|
|
71
89
|
}
|
|
72
|
-
return response.json();
|
|
73
90
|
}
|
|
74
91
|
};
|
|
75
92
|
|
|
@@ -80,8 +97,7 @@ var _GaupaWalletProvider = class _GaupaWalletProvider {
|
|
|
80
97
|
this.chain = chain;
|
|
81
98
|
this.gaupaConfig = gaupaConfig;
|
|
82
99
|
this.cachedAddress = null;
|
|
83
|
-
|
|
84
|
-
this.client = new GaupaApiClient(gaupaConfig.apiKey, apiUrl, gaupaConfig.publicKey);
|
|
100
|
+
this.client = new GaupaApiClient(gaupaConfig.publicKey, gaupaConfig.apiKey, getGaupaApiUrl(config.env));
|
|
85
101
|
}
|
|
86
102
|
async getAddress() {
|
|
87
103
|
if (this.cachedAddress) return this.cachedAddress;
|
|
@@ -99,22 +115,16 @@ var _GaupaWalletProvider = class _GaupaWalletProvider {
|
|
|
99
115
|
async signTransaction(tx) {
|
|
100
116
|
const walletAddress = await this.getAddress();
|
|
101
117
|
if (!walletAddress) throw new Error("GaupaWalletProvider: Wallet address not found");
|
|
102
|
-
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
walletAddress
|
|
107
|
-
});
|
|
108
|
-
tx.signature = new Uint8Array(Buffer.from(result.signature, "hex"));
|
|
118
|
+
tx.sender = import_sdk_core.Address.newFromBech32(walletAddress);
|
|
119
|
+
const result = await this.client.signTransaction(this.formatTransactionForApi(tx));
|
|
120
|
+
if (!result.data?.transaction?.signature) throw new Error("Gaupa API did not return a valid transaction signature");
|
|
121
|
+
tx.signature = new Uint8Array(Buffer.from(result.data.transaction.signature, "hex"));
|
|
109
122
|
return tx;
|
|
110
123
|
}
|
|
111
124
|
async signMessage(message) {
|
|
112
125
|
const walletAddress = await this.getAddress();
|
|
113
126
|
if (!walletAddress) throw new Error("GaupaWalletProvider: Wallet address not found");
|
|
114
|
-
const result = await this.client.signMessage({
|
|
115
|
-
message,
|
|
116
|
-
walletAddress
|
|
117
|
-
});
|
|
127
|
+
const result = await this.client.signMessage({ message, walletAddress });
|
|
118
128
|
if (!result.signature) throw new Error("Gaupa API did not return signature");
|
|
119
129
|
return result.signature;
|
|
120
130
|
}
|
|
@@ -143,13 +153,20 @@ var _GaupaWalletProvider = class _GaupaWalletProvider {
|
|
|
143
153
|
}
|
|
144
154
|
}
|
|
145
155
|
formatTransactionForApi(tx) {
|
|
156
|
+
const walletAddress = tx.sender.toBech32();
|
|
146
157
|
return {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
158
|
+
walletAddress,
|
|
159
|
+
send: false,
|
|
160
|
+
relay: false,
|
|
161
|
+
transaction: {
|
|
162
|
+
sender: walletAddress,
|
|
163
|
+
receiver: tx.receiver.toBech32(),
|
|
164
|
+
value: tx.value.toString(),
|
|
165
|
+
gasLimit: Number(tx.gasLimit),
|
|
166
|
+
gasPrice: Number(tx.gasPrice),
|
|
167
|
+
...tx.nonce !== void 0 && { nonce: Number(tx.nonce) },
|
|
168
|
+
...tx.data?.length && { data: Buffer.from(tx.data).toString("base64") }
|
|
169
|
+
}
|
|
153
170
|
};
|
|
154
171
|
}
|
|
155
172
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/GaupaWalletProvider.ts","../src/config.ts","../src/GaupaApiClient.ts","../src/helpers.ts"],"sourcesContent":["export * from './GaupaWalletProvider'\nexport * from './helpers'\nexport * from './types'\n","import { Address, Transaction } from '@multiversx/sdk-core'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { getGaupaApiUrl } from './config'\nimport { GaupaApiClient } from './GaupaApiClient'\nimport { ProviderConfig } from './types'\n\nexport class GaupaWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'gaupa'\n private readonly client: GaupaApiClient\n private cachedAddress: string | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly gaupaConfig: ProviderConfig\n ) {\n const apiUrl = getGaupaApiUrl(config.env)\n this.client = new GaupaApiClient(gaupaConfig.apiKey, apiUrl, gaupaConfig.publicKey)\n }\n\n async getAddress(): Promise<string | null> {\n if (this.cachedAddress) return this.cachedAddress\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) return null\n this.cachedAddress = address\n return address\n }\n\n async getPublicKey(): Promise<string | null> {\n const address = await this.getAddress()\n if (!address) return null\n const pubKey = Address.newFromBech32(address).getPublicKey().toString('hex')\n return pubKey\n }\n\n async signTransaction(tx: Transaction): Promise<Transaction> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n const transactionData = this.formatTransactionForApi(tx)\n const message = JSON.stringify(transactionData)\n\n const result = await this.client.signMessage({\n message,\n walletAddress,\n })\n\n tx.signature = new Uint8Array(Buffer.from(result.signature, 'hex'))\n\n return tx\n }\n\n async signMessage(message: string): Promise<string> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n const result = await this.client.signMessage({\n message,\n walletAddress,\n })\n\n if (!result.signature) throw new Error('Gaupa API did not return signature')\n\n return result.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromPrivateKey() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async export(): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: export() is not supported. Private keys are managed by Gaupa and cannot be exported.')\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const wallet = await this.client.createAgenticWallet({})\n if (!wallet.success || !wallet.wallet.address_multiversx) throw new Error('Gaupa API did not return a valid wallet')\n\n const walletDetails: WarpWalletDetails = {\n provider: GaupaWalletProvider.PROVIDER_NAME,\n address: wallet.wallet.address_multiversx,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n this.cachedAddress = wallet.wallet.address_multiversx\n\n return walletDetails\n } catch (error) {\n throw new Error(`GaupaWalletProvider: Failed to generate wallet: ${error}`)\n }\n }\n\n private formatTransactionForApi(tx: Transaction) {\n return {\n receiver: tx.receiver.toBech32(),\n value: tx.value.toString(),\n ...(tx.data?.length && { data: Buffer.from(tx.data).toString('base64') }),\n gasLimit: Number(tx.gasLimit),\n gasPrice: Number(tx.gasPrice),\n ...(tx.nonce !== undefined && { nonce: Number(tx.nonce) }),\n }\n }\n}\n","import { WarpChainEnv } from '@joai/warps'\n\nexport const getGaupaApiUrl = (env: WarpChainEnv): string => {\n if (env === 'devnet') return 'https://devnet-login.gaupa.xyz/api'\n return 'https://login.gaupa.xyz/api'\n}\n","type CreateAgenticWalletRequest = { shard?: number }\ntype CreateAgenticWalletResponse = {\n success: boolean\n wallet: { address_multiversx: string; address_evm?: string; shard?: number | null }\n}\ntype SignMessageRequest = { message: string; walletAddress: string }\ntype SignMessageResponse = { address: string; signature: string; message: string; version: number; signer: string; txHash?: string }\n\nexport class GaupaApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n private readonly publicKey: string\n\n constructor(apiKey: string, apiUrl: string, publicKey: string) {\n this.apiKey = apiKey\n this.publicKey = publicKey\n this.baseUrl = apiUrl.replace(/\\/$/, '')\n }\n\n async createAgenticWallet(request: CreateAgenticWalletRequest): Promise<CreateAgenticWalletResponse> {\n return this.request<CreateAgenticWalletResponse>('/manage/create-agentic-wallet', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n async signMessage(request: SignMessageRequest): Promise<SignMessageResponse> {\n return this.request<SignMessageResponse>('/manage/sign-agentic-message', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'Public-Key': this.publicKey,\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error')\n throw new Error(`Gaupa API error (${response.status}): ${errorText}`)\n }\n\n return response.json()\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { GaupaWalletProvider } from './GaupaWalletProvider'\nimport { ProviderConfig } from './types'\n\nexport const createGaupaWalletProvider = (gaupaConfig: ProviderConfig): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new GaupaWalletProvider(config, chain, gaupaConfig)\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/GaupaWalletProvider.ts","../src/config.ts","../src/GaupaApiClient.ts","../src/helpers.ts"],"sourcesContent":["export * from './GaupaWalletProvider'\nexport * from './helpers'\nexport * from './types'\n","import {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { Address, Transaction } from '@multiversx/sdk-core'\nimport { getGaupaApiUrl } from './config'\nimport { GaupaApiClient } from './GaupaApiClient'\nimport { ProviderConfig } from './types'\n\nexport class GaupaWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'gaupa'\n private readonly client: GaupaApiClient\n private cachedAddress: string | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly gaupaConfig: ProviderConfig\n ) {\n this.client = new GaupaApiClient(gaupaConfig.publicKey, gaupaConfig.apiKey, getGaupaApiUrl(config.env))\n }\n\n async getAddress(): Promise<string | null> {\n if (this.cachedAddress) return this.cachedAddress\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) return null\n this.cachedAddress = address\n return address\n }\n\n async getPublicKey(): Promise<string | null> {\n const address = await this.getAddress()\n if (!address) return null\n const pubKey = Address.newFromBech32(address).getPublicKey().toString('hex')\n return pubKey\n }\n\n async signTransaction(tx: Transaction): Promise<Transaction> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n tx.sender = Address.newFromBech32(walletAddress)\n const result = await this.client.signTransaction(this.formatTransactionForApi(tx))\n if (!result.data?.transaction?.signature) throw new Error('Gaupa API did not return a valid transaction signature')\n\n tx.signature = new Uint8Array(Buffer.from(result.data.transaction.signature, 'hex'))\n\n return tx\n }\n\n async signMessage(message: string): Promise<string> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n const result = await this.client.signMessage({ message, walletAddress })\n if (!result.signature) throw new Error('Gaupa API did not return signature')\n\n return result.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromPrivateKey() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async export(): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: export() is not supported. Private keys are managed by Gaupa and cannot be exported.')\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const wallet = await this.client.createAgenticWallet({})\n if (!wallet.success || !wallet.wallet.address_multiversx) throw new Error('Gaupa API did not return a valid wallet')\n\n const walletDetails: WarpWalletDetails = {\n provider: GaupaWalletProvider.PROVIDER_NAME,\n address: wallet.wallet.address_multiversx,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n this.cachedAddress = wallet.wallet.address_multiversx\n\n return walletDetails\n } catch (error) {\n throw new Error(`GaupaWalletProvider: Failed to generate wallet: ${error}`)\n }\n }\n\n private formatTransactionForApi(tx: Transaction) {\n const walletAddress = tx.sender.toBech32()\n return {\n walletAddress,\n send: false,\n relay: false,\n transaction: {\n sender: walletAddress,\n receiver: tx.receiver.toBech32(),\n value: tx.value.toString(),\n gasLimit: Number(tx.gasLimit),\n gasPrice: Number(tx.gasPrice),\n ...(tx.nonce !== undefined && { nonce: Number(tx.nonce) }),\n ...(tx.data?.length && { data: Buffer.from(tx.data).toString('base64') }),\n },\n }\n }\n}\n","import { WarpChainEnv } from '@joai/warps'\n\nexport const getGaupaApiUrl = (env: WarpChainEnv): string => {\n if (env === 'devnet') return 'https://devnet-login.gaupa.xyz'\n if (env === 'testnet') return 'https://testnet-login.gaupa.xyz'\n return 'https://login.gaupa.xyz'\n}\n","type CreateAgenticWalletRequest = { shard?: number; userId?: string }\ntype CreateAgenticWalletResponse = {\n success: boolean\n wallet: { address_multiversx: string; address_evm?: string; shard?: number | null }\n}\ntype SignMessageRequest = { message: string; walletAddress: string }\ntype SignMessageResponse = { address: string; signature: string; message: string; version: number; signer: string; txHash?: string }\ntype SignTransactionRequest = {\n userId?: string\n walletAddress?: string\n send?: boolean\n relay?: boolean\n transaction: {\n sender?: string\n receiver: string\n value: string\n data?: string\n gasLimit: number\n gasPrice: number\n nonce?: number\n }\n}\ntype SignTransactionResponse = {\n status: string\n data: {\n transaction: {\n nonce: number\n value: string\n receiver: string\n sender: string\n gasPrice: number\n gasLimit: number\n chainID: string\n version: number\n signature: string\n }\n sender: string\n receiver: string\n timestamp: string\n }\n}\n\nexport class GaupaApiClient {\n private readonly publicKey: string\n private readonly apiKey: string\n private readonly baseUrl: string\n\n constructor(publicKey: string, apiKey: string, apiUrl: string) {\n this.publicKey = publicKey\n this.apiKey = apiKey\n this.baseUrl = apiUrl.replace(/\\/$/, '')\n }\n\n async createAgenticWallet(request: CreateAgenticWalletRequest): Promise<CreateAgenticWalletResponse> {\n return this.request<CreateAgenticWalletResponse>('/manage/create-agentic-wallet', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n async signTransaction(request: SignTransactionRequest): Promise<SignTransactionResponse> {\n return await this.request<SignTransactionResponse>('/manage/submit-agentic-transaction', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n async signMessage(request: SignMessageRequest): Promise<SignMessageResponse> {\n return this.request<SignMessageResponse>('/manage/sign-agentic-message', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'Public-Key': this.publicKey,\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n const responseStatus = response.status\n let responseBody: string | undefined\n\n try {\n responseBody = await response.text()\n } catch (error) {\n responseBody = `Failed to read response body: ${error}`\n }\n\n if (!response.ok) {\n throw new Error(`Gaupa API error (${responseStatus}): ${responseBody || 'Unknown error'}`)\n }\n\n try {\n return JSON.parse(responseBody || '{}')\n } catch (error) {\n throw new Error(`Failed to parse response JSON: ${error}. Response: ${responseBody}`)\n }\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { GaupaWalletProvider } from './GaupaWalletProvider'\nimport { ProviderConfig } from './types'\n\nexport const createGaupaWalletProvider = (gaupaConfig: ProviderConfig): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new GaupaWalletProvider(config, chain, gaupaConfig)\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
// src/GaupaWalletProvider.ts
|
|
2
|
-
import { Address } from "@multiversx/sdk-core";
|
|
3
2
|
import {
|
|
4
3
|
getWarpWalletAddressFromConfig,
|
|
5
4
|
setWarpWalletInConfig
|
|
6
5
|
} from "@joai/warps";
|
|
6
|
+
import { Address } from "@multiversx/sdk-core";
|
|
7
7
|
|
|
8
8
|
// src/config.ts
|
|
9
9
|
var getGaupaApiUrl = (env) => {
|
|
10
|
-
if (env === "devnet") return "https://devnet-login.gaupa.xyz
|
|
11
|
-
return "https://login.gaupa.xyz
|
|
10
|
+
if (env === "devnet") return "https://devnet-login.gaupa.xyz";
|
|
11
|
+
if (env === "testnet") return "https://testnet-login.gaupa.xyz";
|
|
12
|
+
return "https://login.gaupa.xyz";
|
|
12
13
|
};
|
|
13
14
|
|
|
14
15
|
// src/GaupaApiClient.ts
|
|
15
16
|
var GaupaApiClient = class {
|
|
16
|
-
constructor(apiKey, apiUrl
|
|
17
|
-
this.apiKey = apiKey;
|
|
17
|
+
constructor(publicKey, apiKey, apiUrl) {
|
|
18
18
|
this.publicKey = publicKey;
|
|
19
|
+
this.apiKey = apiKey;
|
|
19
20
|
this.baseUrl = apiUrl.replace(/\/$/, "");
|
|
20
21
|
}
|
|
21
22
|
async createAgenticWallet(request) {
|
|
@@ -24,6 +25,12 @@ var GaupaApiClient = class {
|
|
|
24
25
|
body: JSON.stringify(request)
|
|
25
26
|
});
|
|
26
27
|
}
|
|
28
|
+
async signTransaction(request) {
|
|
29
|
+
return await this.request("/manage/submit-agentic-transaction", {
|
|
30
|
+
method: "POST",
|
|
31
|
+
body: JSON.stringify(request)
|
|
32
|
+
});
|
|
33
|
+
}
|
|
27
34
|
async signMessage(request) {
|
|
28
35
|
return this.request("/manage/sign-agentic-message", {
|
|
29
36
|
method: "POST",
|
|
@@ -41,11 +48,21 @@ var GaupaApiClient = class {
|
|
|
41
48
|
...options,
|
|
42
49
|
headers
|
|
43
50
|
});
|
|
51
|
+
const responseStatus = response.status;
|
|
52
|
+
let responseBody;
|
|
53
|
+
try {
|
|
54
|
+
responseBody = await response.text();
|
|
55
|
+
} catch (error) {
|
|
56
|
+
responseBody = `Failed to read response body: ${error}`;
|
|
57
|
+
}
|
|
44
58
|
if (!response.ok) {
|
|
45
|
-
|
|
46
|
-
|
|
59
|
+
throw new Error(`Gaupa API error (${responseStatus}): ${responseBody || "Unknown error"}`);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
return JSON.parse(responseBody || "{}");
|
|
63
|
+
} catch (error) {
|
|
64
|
+
throw new Error(`Failed to parse response JSON: ${error}. Response: ${responseBody}`);
|
|
47
65
|
}
|
|
48
|
-
return response.json();
|
|
49
66
|
}
|
|
50
67
|
};
|
|
51
68
|
|
|
@@ -56,8 +73,7 @@ var _GaupaWalletProvider = class _GaupaWalletProvider {
|
|
|
56
73
|
this.chain = chain;
|
|
57
74
|
this.gaupaConfig = gaupaConfig;
|
|
58
75
|
this.cachedAddress = null;
|
|
59
|
-
|
|
60
|
-
this.client = new GaupaApiClient(gaupaConfig.apiKey, apiUrl, gaupaConfig.publicKey);
|
|
76
|
+
this.client = new GaupaApiClient(gaupaConfig.publicKey, gaupaConfig.apiKey, getGaupaApiUrl(config.env));
|
|
61
77
|
}
|
|
62
78
|
async getAddress() {
|
|
63
79
|
if (this.cachedAddress) return this.cachedAddress;
|
|
@@ -75,22 +91,16 @@ var _GaupaWalletProvider = class _GaupaWalletProvider {
|
|
|
75
91
|
async signTransaction(tx) {
|
|
76
92
|
const walletAddress = await this.getAddress();
|
|
77
93
|
if (!walletAddress) throw new Error("GaupaWalletProvider: Wallet address not found");
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
walletAddress
|
|
83
|
-
});
|
|
84
|
-
tx.signature = new Uint8Array(Buffer.from(result.signature, "hex"));
|
|
94
|
+
tx.sender = Address.newFromBech32(walletAddress);
|
|
95
|
+
const result = await this.client.signTransaction(this.formatTransactionForApi(tx));
|
|
96
|
+
if (!result.data?.transaction?.signature) throw new Error("Gaupa API did not return a valid transaction signature");
|
|
97
|
+
tx.signature = new Uint8Array(Buffer.from(result.data.transaction.signature, "hex"));
|
|
85
98
|
return tx;
|
|
86
99
|
}
|
|
87
100
|
async signMessage(message) {
|
|
88
101
|
const walletAddress = await this.getAddress();
|
|
89
102
|
if (!walletAddress) throw new Error("GaupaWalletProvider: Wallet address not found");
|
|
90
|
-
const result = await this.client.signMessage({
|
|
91
|
-
message,
|
|
92
|
-
walletAddress
|
|
93
|
-
});
|
|
103
|
+
const result = await this.client.signMessage({ message, walletAddress });
|
|
94
104
|
if (!result.signature) throw new Error("Gaupa API did not return signature");
|
|
95
105
|
return result.signature;
|
|
96
106
|
}
|
|
@@ -119,13 +129,20 @@ var _GaupaWalletProvider = class _GaupaWalletProvider {
|
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
formatTransactionForApi(tx) {
|
|
132
|
+
const walletAddress = tx.sender.toBech32();
|
|
122
133
|
return {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
134
|
+
walletAddress,
|
|
135
|
+
send: false,
|
|
136
|
+
relay: false,
|
|
137
|
+
transaction: {
|
|
138
|
+
sender: walletAddress,
|
|
139
|
+
receiver: tx.receiver.toBech32(),
|
|
140
|
+
value: tx.value.toString(),
|
|
141
|
+
gasLimit: Number(tx.gasLimit),
|
|
142
|
+
gasPrice: Number(tx.gasPrice),
|
|
143
|
+
...tx.nonce !== void 0 && { nonce: Number(tx.nonce) },
|
|
144
|
+
...tx.data?.length && { data: Buffer.from(tx.data).toString("base64") }
|
|
145
|
+
}
|
|
129
146
|
};
|
|
130
147
|
}
|
|
131
148
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/GaupaWalletProvider.ts","../src/config.ts","../src/GaupaApiClient.ts","../src/helpers.ts"],"sourcesContent":["import { Address, Transaction } from '@multiversx/sdk-core'\nimport {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { getGaupaApiUrl } from './config'\nimport { GaupaApiClient } from './GaupaApiClient'\nimport { ProviderConfig } from './types'\n\nexport class GaupaWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'gaupa'\n private readonly client: GaupaApiClient\n private cachedAddress: string | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly gaupaConfig: ProviderConfig\n ) {\n const apiUrl = getGaupaApiUrl(config.env)\n this.client = new GaupaApiClient(gaupaConfig.apiKey, apiUrl, gaupaConfig.publicKey)\n }\n\n async getAddress(): Promise<string | null> {\n if (this.cachedAddress) return this.cachedAddress\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) return null\n this.cachedAddress = address\n return address\n }\n\n async getPublicKey(): Promise<string | null> {\n const address = await this.getAddress()\n if (!address) return null\n const pubKey = Address.newFromBech32(address).getPublicKey().toString('hex')\n return pubKey\n }\n\n async signTransaction(tx: Transaction): Promise<Transaction> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n const transactionData = this.formatTransactionForApi(tx)\n const message = JSON.stringify(transactionData)\n\n const result = await this.client.signMessage({\n message,\n walletAddress,\n })\n\n tx.signature = new Uint8Array(Buffer.from(result.signature, 'hex'))\n\n return tx\n }\n\n async signMessage(message: string): Promise<string> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n const result = await this.client.signMessage({\n message,\n walletAddress,\n })\n\n if (!result.signature) throw new Error('Gaupa API did not return signature')\n\n return result.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromPrivateKey() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async export(): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: export() is not supported. Private keys are managed by Gaupa and cannot be exported.')\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const wallet = await this.client.createAgenticWallet({})\n if (!wallet.success || !wallet.wallet.address_multiversx) throw new Error('Gaupa API did not return a valid wallet')\n\n const walletDetails: WarpWalletDetails = {\n provider: GaupaWalletProvider.PROVIDER_NAME,\n address: wallet.wallet.address_multiversx,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n this.cachedAddress = wallet.wallet.address_multiversx\n\n return walletDetails\n } catch (error) {\n throw new Error(`GaupaWalletProvider: Failed to generate wallet: ${error}`)\n }\n }\n\n private formatTransactionForApi(tx: Transaction) {\n return {\n receiver: tx.receiver.toBech32(),\n value: tx.value.toString(),\n ...(tx.data?.length && { data: Buffer.from(tx.data).toString('base64') }),\n gasLimit: Number(tx.gasLimit),\n gasPrice: Number(tx.gasPrice),\n ...(tx.nonce !== undefined && { nonce: Number(tx.nonce) }),\n }\n }\n}\n","import { WarpChainEnv } from '@joai/warps'\n\nexport const getGaupaApiUrl = (env: WarpChainEnv): string => {\n if (env === 'devnet') return 'https://devnet-login.gaupa.xyz/api'\n return 'https://login.gaupa.xyz/api'\n}\n","type CreateAgenticWalletRequest = { shard?: number }\ntype CreateAgenticWalletResponse = {\n success: boolean\n wallet: { address_multiversx: string; address_evm?: string; shard?: number | null }\n}\ntype SignMessageRequest = { message: string; walletAddress: string }\ntype SignMessageResponse = { address: string; signature: string; message: string; version: number; signer: string; txHash?: string }\n\nexport class GaupaApiClient {\n private readonly baseUrl: string\n private readonly apiKey: string\n private readonly publicKey: string\n\n constructor(apiKey: string, apiUrl: string, publicKey: string) {\n this.apiKey = apiKey\n this.publicKey = publicKey\n this.baseUrl = apiUrl.replace(/\\/$/, '')\n }\n\n async createAgenticWallet(request: CreateAgenticWalletRequest): Promise<CreateAgenticWalletResponse> {\n return this.request<CreateAgenticWalletResponse>('/manage/create-agentic-wallet', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n async signMessage(request: SignMessageRequest): Promise<SignMessageResponse> {\n return this.request<SignMessageResponse>('/manage/sign-agentic-message', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'Public-Key': this.publicKey,\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error')\n throw new Error(`Gaupa API error (${response.status}): ${errorText}`)\n }\n\n return response.json()\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { GaupaWalletProvider } from './GaupaWalletProvider'\nimport { ProviderConfig } from './types'\n\nexport const createGaupaWalletProvider = (gaupaConfig: ProviderConfig): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new GaupaWalletProvider(config, chain, gaupaConfig)\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/GaupaWalletProvider.ts","../src/config.ts","../src/GaupaApiClient.ts","../src/helpers.ts"],"sourcesContent":["import {\n getWarpWalletAddressFromConfig,\n setWarpWalletInConfig,\n WalletProvider,\n WarpChainInfo,\n WarpClientConfig,\n WarpWalletDetails,\n WarpWalletProvider,\n} from '@joai/warps'\nimport { Address, Transaction } from '@multiversx/sdk-core'\nimport { getGaupaApiUrl } from './config'\nimport { GaupaApiClient } from './GaupaApiClient'\nimport { ProviderConfig } from './types'\n\nexport class GaupaWalletProvider implements WalletProvider {\n static readonly PROVIDER_NAME: WarpWalletProvider = 'gaupa'\n private readonly client: GaupaApiClient\n private cachedAddress: string | null = null\n\n constructor(\n private readonly config: WarpClientConfig,\n private readonly chain: WarpChainInfo,\n private readonly gaupaConfig: ProviderConfig\n ) {\n this.client = new GaupaApiClient(gaupaConfig.publicKey, gaupaConfig.apiKey, getGaupaApiUrl(config.env))\n }\n\n async getAddress(): Promise<string | null> {\n if (this.cachedAddress) return this.cachedAddress\n const address = getWarpWalletAddressFromConfig(this.config, this.chain.name)\n if (!address) return null\n this.cachedAddress = address\n return address\n }\n\n async getPublicKey(): Promise<string | null> {\n const address = await this.getAddress()\n if (!address) return null\n const pubKey = Address.newFromBech32(address).getPublicKey().toString('hex')\n return pubKey\n }\n\n async signTransaction(tx: Transaction): Promise<Transaction> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n tx.sender = Address.newFromBech32(walletAddress)\n const result = await this.client.signTransaction(this.formatTransactionForApi(tx))\n if (!result.data?.transaction?.signature) throw new Error('Gaupa API did not return a valid transaction signature')\n\n tx.signature = new Uint8Array(Buffer.from(result.data.transaction.signature, 'hex'))\n\n return tx\n }\n\n async signMessage(message: string): Promise<string> {\n const walletAddress = await this.getAddress()\n if (!walletAddress) throw new Error('GaupaWalletProvider: Wallet address not found')\n\n const result = await this.client.signMessage({ message, walletAddress })\n if (!result.signature) throw new Error('Gaupa API did not return signature')\n\n return result.signature\n }\n\n async importFromMnemonic(mnemonic: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromMnemonic() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async importFromPrivateKey(privateKey: string): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: importFromPrivateKey() is not supported. Use generate() to create a new wallet via Gaupa API.')\n }\n\n async export(): Promise<WarpWalletDetails> {\n throw new Error('GaupaWalletProvider: export() is not supported. Private keys are managed by Gaupa and cannot be exported.')\n }\n\n async generate(): Promise<WarpWalletDetails> {\n try {\n const wallet = await this.client.createAgenticWallet({})\n if (!wallet.success || !wallet.wallet.address_multiversx) throw new Error('Gaupa API did not return a valid wallet')\n\n const walletDetails: WarpWalletDetails = {\n provider: GaupaWalletProvider.PROVIDER_NAME,\n address: wallet.wallet.address_multiversx,\n }\n\n setWarpWalletInConfig(this.config, this.chain.name, walletDetails)\n this.cachedAddress = wallet.wallet.address_multiversx\n\n return walletDetails\n } catch (error) {\n throw new Error(`GaupaWalletProvider: Failed to generate wallet: ${error}`)\n }\n }\n\n private formatTransactionForApi(tx: Transaction) {\n const walletAddress = tx.sender.toBech32()\n return {\n walletAddress,\n send: false,\n relay: false,\n transaction: {\n sender: walletAddress,\n receiver: tx.receiver.toBech32(),\n value: tx.value.toString(),\n gasLimit: Number(tx.gasLimit),\n gasPrice: Number(tx.gasPrice),\n ...(tx.nonce !== undefined && { nonce: Number(tx.nonce) }),\n ...(tx.data?.length && { data: Buffer.from(tx.data).toString('base64') }),\n },\n }\n }\n}\n","import { WarpChainEnv } from '@joai/warps'\n\nexport const getGaupaApiUrl = (env: WarpChainEnv): string => {\n if (env === 'devnet') return 'https://devnet-login.gaupa.xyz'\n if (env === 'testnet') return 'https://testnet-login.gaupa.xyz'\n return 'https://login.gaupa.xyz'\n}\n","type CreateAgenticWalletRequest = { shard?: number; userId?: string }\ntype CreateAgenticWalletResponse = {\n success: boolean\n wallet: { address_multiversx: string; address_evm?: string; shard?: number | null }\n}\ntype SignMessageRequest = { message: string; walletAddress: string }\ntype SignMessageResponse = { address: string; signature: string; message: string; version: number; signer: string; txHash?: string }\ntype SignTransactionRequest = {\n userId?: string\n walletAddress?: string\n send?: boolean\n relay?: boolean\n transaction: {\n sender?: string\n receiver: string\n value: string\n data?: string\n gasLimit: number\n gasPrice: number\n nonce?: number\n }\n}\ntype SignTransactionResponse = {\n status: string\n data: {\n transaction: {\n nonce: number\n value: string\n receiver: string\n sender: string\n gasPrice: number\n gasLimit: number\n chainID: string\n version: number\n signature: string\n }\n sender: string\n receiver: string\n timestamp: string\n }\n}\n\nexport class GaupaApiClient {\n private readonly publicKey: string\n private readonly apiKey: string\n private readonly baseUrl: string\n\n constructor(publicKey: string, apiKey: string, apiUrl: string) {\n this.publicKey = publicKey\n this.apiKey = apiKey\n this.baseUrl = apiUrl.replace(/\\/$/, '')\n }\n\n async createAgenticWallet(request: CreateAgenticWalletRequest): Promise<CreateAgenticWalletResponse> {\n return this.request<CreateAgenticWalletResponse>('/manage/create-agentic-wallet', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n async signTransaction(request: SignTransactionRequest): Promise<SignTransactionResponse> {\n return await this.request<SignTransactionResponse>('/manage/submit-agentic-transaction', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n async signMessage(request: SignMessageRequest): Promise<SignMessageResponse> {\n return this.request<SignMessageResponse>('/manage/sign-agentic-message', {\n method: 'POST',\n body: JSON.stringify(request),\n })\n }\n\n private async request<T>(endpoint: string, options: RequestInit = {}): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'Public-Key': this.publicKey,\n }\n\n const response = await fetch(url, {\n ...options,\n headers,\n })\n\n const responseStatus = response.status\n let responseBody: string | undefined\n\n try {\n responseBody = await response.text()\n } catch (error) {\n responseBody = `Failed to read response body: ${error}`\n }\n\n if (!response.ok) {\n throw new Error(`Gaupa API error (${responseStatus}): ${responseBody || 'Unknown error'}`)\n }\n\n try {\n return JSON.parse(responseBody || '{}')\n } catch (error) {\n throw new Error(`Failed to parse response JSON: ${error}. Response: ${responseBody}`)\n }\n }\n}\n","import { WalletProviderFactory, WarpChainInfo, WarpClientConfig } from '@joai/warps'\nimport { GaupaWalletProvider } from './GaupaWalletProvider'\nimport { ProviderConfig } from './types'\n\nexport const createGaupaWalletProvider = (gaupaConfig: ProviderConfig): WalletProviderFactory => {\n return (config: WarpClientConfig, chain: WarpChainInfo) => new GaupaWalletProvider(config, chain, gaupaConfig)\n}\n"],"mappings":"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","names":[]}
|