zano_web3 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -5
- package/server/{dist/index.d.ts → src/index.ts} +2 -2
- package/server/{dist/server.js → src/server.ts} +245 -184
- package/server/{dist/types.d.ts → src/types.ts} +50 -42
- package/server/{dist/utils.js → src/utils.ts} +13 -11
- package/tsconfig.json +21 -0
- package/tsconfig.server.json +10 -0
- package/tsconfig.web.json +10 -0
- package/web/src/hooks.ts +18 -0
- package/web/src/index.ts +7 -0
- package/web/{dist/types.d.ts → src/types.ts} +35 -32
- package/web/{dist/zanoWallet.js → src/zanoWallet.ts} +217 -143
- package/server/dist/index.js +0 -3
- package/server/dist/index.js.map +0 -1
- package/server/dist/server.d.ts +0 -22
- package/server/dist/server.js.map +0 -1
- package/server/dist/types.js +0 -2
- package/server/dist/types.js.map +0 -1
- package/server/dist/utils.d.ts +0 -6
- package/server/dist/utils.js.map +0 -1
- package/web/dist/hooks.d.ts +0 -3
- package/web/dist/hooks.js +0 -14
- package/web/dist/hooks.js.map +0 -1
- package/web/dist/index.d.ts +0 -5
- package/web/dist/index.js +0 -6
- package/web/dist/index.js.map +0 -1
- package/web/dist/types.js +0 -2
- package/web/dist/types.js.map +0 -1
- package/web/dist/zanoWallet.d.ts +0 -37
- package/web/dist/zanoWallet.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zano_web3",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -48,9 +48,5 @@
|
|
|
48
48
|
"types": "./server/dist/index.d.ts"
|
|
49
49
|
}
|
|
50
50
|
},
|
|
51
|
-
"files": [
|
|
52
|
-
"web/dist",
|
|
53
|
-
"server/dist"
|
|
54
|
-
],
|
|
55
51
|
"homepage": "https://github.com/hyle-team/zano_web3#readme"
|
|
56
52
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import ServerWallet from "./server";
|
|
2
|
-
export {
|
|
1
|
+
import ServerWallet from "./server";
|
|
2
|
+
export {ServerWallet};
|
|
@@ -1,184 +1,245 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import Big from "big.js";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
else {
|
|
109
|
-
throw new ZanoError(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import Big from "big.js";
|
|
3
|
+
import {
|
|
4
|
+
AuthData,
|
|
5
|
+
AliasAuth,
|
|
6
|
+
PkeyAuth,
|
|
7
|
+
ValidationParams,
|
|
8
|
+
BalanceInfo,
|
|
9
|
+
} from './types';
|
|
10
|
+
|
|
11
|
+
import { ZANO_ASSET_ID, ZanoError } from './utils';
|
|
12
|
+
import { APIAsset, APIBalance } from './types';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
interface ConstructorParams {
|
|
16
|
+
walletUrl: string;
|
|
17
|
+
daemonUrl: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
class ServerWallet {
|
|
21
|
+
private walletUrl: string;
|
|
22
|
+
private daemonUrl: string;
|
|
23
|
+
|
|
24
|
+
constructor(params: ConstructorParams) {
|
|
25
|
+
this.walletUrl = params.walletUrl;
|
|
26
|
+
this.daemonUrl = params.daemonUrl;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private async fetchDaemon(method: string, params: any) {
|
|
30
|
+
const headers = { "Content-Type": "application/json" };
|
|
31
|
+
|
|
32
|
+
const data = {
|
|
33
|
+
jsonrpc: "2.0",
|
|
34
|
+
id: 0,
|
|
35
|
+
method: method,
|
|
36
|
+
params: params
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return axios.post(this.daemonUrl, data, { headers })
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private async fetchWallet(method: string, params: any) {
|
|
43
|
+
const headers = { "Content-Type": "application/json" };
|
|
44
|
+
|
|
45
|
+
const data = {
|
|
46
|
+
jsonrpc: "2.0",
|
|
47
|
+
id: 0,
|
|
48
|
+
method: method,
|
|
49
|
+
params: params
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
return axios.post(this.walletUrl, data, { headers })
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async updateWalletRpcUrl(rpcUrl: string) {
|
|
56
|
+
this.walletUrl = rpcUrl;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async updateDaemonRpcUrl(rpcUrl: string) {
|
|
60
|
+
this.daemonUrl = rpcUrl;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async getAssetsList() {
|
|
64
|
+
const count = 100; // Number of items to fetch per request
|
|
65
|
+
let offset = 0;
|
|
66
|
+
let allAssets: APIAsset[] = [];
|
|
67
|
+
let keepFetching = true;
|
|
68
|
+
|
|
69
|
+
while (keepFetching) {
|
|
70
|
+
try {
|
|
71
|
+
const response = await this.fetchDaemon("get_assets_list", { count, offset });
|
|
72
|
+
|
|
73
|
+
const assets = response.data.result.assets;
|
|
74
|
+
if (assets.length < count) {
|
|
75
|
+
keepFetching = false;
|
|
76
|
+
}
|
|
77
|
+
allAssets = allAssets.concat(assets);
|
|
78
|
+
offset += count;
|
|
79
|
+
} catch (error) {
|
|
80
|
+
throw new ZanoError("Failed to fetch assets list", "ASSETS_FETCH_ERROR");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return allAssets as APIAsset[];
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
async getAssetDetails(assetId: string) {
|
|
88
|
+
const assets = await this.getAssetsList();
|
|
89
|
+
const asset = assets.find((a) => a.asset_id === assetId);
|
|
90
|
+
|
|
91
|
+
if (!asset) {
|
|
92
|
+
throw new ZanoError(
|
|
93
|
+
`Asset with ID ${assetId} not found`,
|
|
94
|
+
"ASSET_NOT_FOUND"
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return asset as APIAsset;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
async getAssetInfo(assetId: string) {
|
|
103
|
+
try {
|
|
104
|
+
const response = await this.fetchDaemon("get_asset_info", { asset_id: assetId });
|
|
105
|
+
|
|
106
|
+
if (response.data.result) {
|
|
107
|
+
return response.data.result;
|
|
108
|
+
} else {
|
|
109
|
+
throw new ZanoError(
|
|
110
|
+
`Error fetching info for asset ID ${assetId}`,
|
|
111
|
+
"ASSET_INFO_ERROR"
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
} catch (error) {
|
|
115
|
+
console.error(error);
|
|
116
|
+
throw new ZanoError("Failed to fetch asset info", "ASSET_INFO_FETCH_ERROR");
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
async sendTransfer(assetId: string, address: string, amount: string) {
|
|
121
|
+
let decimalPoint: number;
|
|
122
|
+
|
|
123
|
+
if (assetId === ZANO_ASSET_ID) {
|
|
124
|
+
decimalPoint = 12;
|
|
125
|
+
} else {
|
|
126
|
+
const asset = await this.getAssetDetails(assetId);
|
|
127
|
+
decimalPoint = asset.decimal_point;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const bigAmount = new Big(amount)
|
|
131
|
+
.times(new Big(10).pow(decimalPoint))
|
|
132
|
+
.toString();
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
const response = await this.fetchWallet("transfer", {
|
|
136
|
+
destinations: [{ address, amount: bigAmount, asset_id: assetId }],
|
|
137
|
+
fee: "10000000000",
|
|
138
|
+
mixin: 15,
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
if (response.data.result) {
|
|
142
|
+
return response.data.result;
|
|
143
|
+
} else if (
|
|
144
|
+
response.data.error &&
|
|
145
|
+
response.data.error.message === "WALLET_RPC_ERROR_CODE_NOT_ENOUGH_MONEY"
|
|
146
|
+
) {
|
|
147
|
+
throw new ZanoError("Not enough funds", "NOT_ENOUGH_FUNDS");
|
|
148
|
+
} else {
|
|
149
|
+
throw new ZanoError("Error sending transfer", "TRANSFER_ERROR");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
} catch (error) {
|
|
153
|
+
if (error instanceof ZanoError) {
|
|
154
|
+
throw error; // Re-throw the custom error
|
|
155
|
+
} else {
|
|
156
|
+
throw new ZanoError("Failed to send transfer", "TRANSFER_SEND_ERROR");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
async getBalances() {
|
|
162
|
+
try {
|
|
163
|
+
const response = await this.fetchWallet("getbalance", {});
|
|
164
|
+
const balancesData = response.data.result.balances as APIBalance[];
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
const balances = balancesData.map((asset) => ({
|
|
168
|
+
name: asset.asset_info.full_name,
|
|
169
|
+
ticker: asset.asset_info.ticker,
|
|
170
|
+
id: asset.asset_info.asset_id,
|
|
171
|
+
amount: new Big(asset.unlocked)
|
|
172
|
+
.div(new Big(10).pow(asset.asset_info.decimal_point))
|
|
173
|
+
.toString(),
|
|
174
|
+
}));
|
|
175
|
+
|
|
176
|
+
return balances.sort((a, b) => {
|
|
177
|
+
if (a.id === ZANO_ASSET_ID)
|
|
178
|
+
return -1;
|
|
179
|
+
if (b.id === ZANO_ASSET_ID )
|
|
180
|
+
return 1;
|
|
181
|
+
return 0;
|
|
182
|
+
}) as BalanceInfo[];
|
|
183
|
+
|
|
184
|
+
} catch (error) {
|
|
185
|
+
throw new ZanoError("Failed to fetch balances", "BALANCES_FETCH_ERROR");
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
async validateWallet(authData: AuthData) {
|
|
190
|
+
|
|
191
|
+
const { message, address, signature } = authData;
|
|
192
|
+
|
|
193
|
+
const alias = (authData as AliasAuth).alias || undefined;
|
|
194
|
+
const pkey = (authData as PkeyAuth).pkey || undefined;
|
|
195
|
+
|
|
196
|
+
if (!message || (!alias && !pkey) || !signature) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const validationParams: ValidationParams = {
|
|
201
|
+
"buff": Buffer.from(message).toString("base64"),
|
|
202
|
+
"sig": signature
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
if (alias) {
|
|
206
|
+
validationParams['alias'] = alias;
|
|
207
|
+
} else {
|
|
208
|
+
validationParams['pkey'] = pkey;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const response = await this.fetchDaemon(
|
|
212
|
+
'validate_signature',
|
|
213
|
+
validationParams
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
const valid = response?.data?.result?.status === 'OK';
|
|
217
|
+
|
|
218
|
+
if (!valid) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (alias) {
|
|
223
|
+
const aliasDetailsResponse = await this.fetchDaemon(
|
|
224
|
+
'get_alias_details',
|
|
225
|
+
{
|
|
226
|
+
"alias": alias,
|
|
227
|
+
}
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
const aliasDetails = aliasDetailsResponse?.data?.result?.alias_details;
|
|
231
|
+
const aliasAddress = aliasDetails?.address;
|
|
232
|
+
|
|
233
|
+
const addressValid = !!aliasAddress && aliasAddress === address;
|
|
234
|
+
|
|
235
|
+
if (!addressValid) {
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return valid;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
export default ServerWallet;
|
|
@@ -1,42 +1,50 @@
|
|
|
1
|
-
export interface BaseAuthData {
|
|
2
|
-
address: string;
|
|
3
|
-
signature: string;
|
|
4
|
-
message: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
export interface
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
1
|
+
export interface BaseAuthData {
|
|
2
|
+
address: string;
|
|
3
|
+
signature: string;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface AliasAuth extends BaseAuthData {
|
|
8
|
+
alias: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface PkeyAuth extends BaseAuthData {
|
|
12
|
+
pkey: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type AuthData = AliasAuth | PkeyAuth;
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
export interface ValidationParams {
|
|
19
|
+
buff: string;
|
|
20
|
+
sig: string;
|
|
21
|
+
alias?: string;
|
|
22
|
+
pkey?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface APIAsset {
|
|
26
|
+
asset_id: string;
|
|
27
|
+
current_supply: number;
|
|
28
|
+
decimal_point: number;
|
|
29
|
+
full_name: string;
|
|
30
|
+
hidden_supply: boolean;
|
|
31
|
+
meta_info: string;
|
|
32
|
+
owner: string;
|
|
33
|
+
ticker: string;
|
|
34
|
+
total_max_supply: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface APIBalance {
|
|
38
|
+
asset_info: APIAsset;
|
|
39
|
+
awaiting_in: number;
|
|
40
|
+
awaiting_out: number;
|
|
41
|
+
total: number;
|
|
42
|
+
unlocked: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface BalanceInfo {
|
|
46
|
+
name: string;
|
|
47
|
+
ticker: string;
|
|
48
|
+
id: string;
|
|
49
|
+
amount: string;
|
|
50
|
+
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
export const ZANO_ASSET_ID = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
export const ZANO_ASSET_ID = "d6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a";
|
|
2
|
+
|
|
3
|
+
export class ZanoError extends Error {
|
|
4
|
+
|
|
5
|
+
public code: string;
|
|
6
|
+
public name: string;
|
|
7
|
+
|
|
8
|
+
constructor(message: string, code: string) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "ZanoError";
|
|
11
|
+
this.code = code;
|
|
12
|
+
}
|
|
13
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"strict": true,
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"moduleResolution": "node",
|
|
8
|
+
"resolveJsonModule": true,
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"lib": [
|
|
11
|
+
"ESNext",
|
|
12
|
+
"DOM"
|
|
13
|
+
],
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"allowSyntheticDefaultImports": true,
|
|
16
|
+
"baseUrl": ".",
|
|
17
|
+
"paths": {
|
|
18
|
+
"@common/*": ["common/*"]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
package/web/src/hooks.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import ZanoWallet, { ZanoWalletParams } from './zanoWallet';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
function useZanoWallet(params: ZanoWalletParams) {
|
|
5
|
+
const [zanoWallet, setZanoWallet] = useState<ZanoWallet | null>(null);
|
|
6
|
+
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (typeof window === 'undefined') {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
setZanoWallet(new ZanoWallet(params));
|
|
13
|
+
}, []);
|
|
14
|
+
|
|
15
|
+
return zanoWallet;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { useZanoWallet };
|
package/web/src/index.ts
ADDED
|
@@ -1,32 +1,35 @@
|
|
|
1
|
-
export interface Asset {
|
|
2
|
-
name: string;
|
|
3
|
-
ticker: string;
|
|
4
|
-
assetId: string;
|
|
5
|
-
decimalPoint: number;
|
|
6
|
-
balance: string;
|
|
7
|
-
unlockedBalance: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
export interface Asset {
|
|
2
|
+
name: string;
|
|
3
|
+
ticker: string;
|
|
4
|
+
assetId: string;
|
|
5
|
+
decimalPoint: number;
|
|
6
|
+
balance: string;
|
|
7
|
+
unlockedBalance: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface Transfer {
|
|
11
|
+
amount: string;
|
|
12
|
+
assetId: string;
|
|
13
|
+
incoming: boolean;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface Transaction {
|
|
17
|
+
isConfirmed: boolean;
|
|
18
|
+
txHash: string;
|
|
19
|
+
blobSize: number;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
height: number;
|
|
22
|
+
paymentId: string;
|
|
23
|
+
comment: string;
|
|
24
|
+
fee: string;
|
|
25
|
+
isInitiator: boolean;
|
|
26
|
+
transfers: Transfer[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface Wallet {
|
|
30
|
+
address: string;
|
|
31
|
+
alias: string;
|
|
32
|
+
balance: string;
|
|
33
|
+
assets: Asset[];
|
|
34
|
+
transactions: Transaction[];
|
|
35
|
+
}
|
|
@@ -1,143 +1,217 @@
|
|
|
1
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { Wallet } from './types';
|
|
3
|
+
|
|
4
|
+
export interface ZanoWalletParams {
|
|
5
|
+
authPath: string;
|
|
6
|
+
useLocalStorage?: boolean; // default: true
|
|
7
|
+
aliasRequired?: boolean;
|
|
8
|
+
customLocalStorageKey?: string;
|
|
9
|
+
customNonce?: string;
|
|
10
|
+
customServerPath?: string;
|
|
11
|
+
disableServerRequest?: boolean;
|
|
12
|
+
|
|
13
|
+
onConnectStart?: (...params: any) => any;
|
|
14
|
+
onConnectEnd?: (...params: any) => any;
|
|
15
|
+
onConnectError?: (...params: any) => any;
|
|
16
|
+
|
|
17
|
+
beforeConnect?: (...params: any) => any;
|
|
18
|
+
onLocalConnectEnd?: (...params: any) => any;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type GlobalWindow = Window & typeof globalThis;
|
|
22
|
+
|
|
23
|
+
interface ZanoWindowParams {
|
|
24
|
+
request: (str: string, params?: any, timeoutMs?: number | null) => Promise<any>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type ZanoWindow = Omit<GlobalWindow, 'Infinity'> & {
|
|
28
|
+
zano: ZanoWindowParams
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface WalletCredentials {
|
|
32
|
+
nonce: string;
|
|
33
|
+
signature: string;
|
|
34
|
+
publicKey: string;
|
|
35
|
+
address: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
class ZanoWallet {
|
|
39
|
+
|
|
40
|
+
private DEFAULT_LOCAL_STORAGE_KEY = "wallet";
|
|
41
|
+
private localStorageKey: string;
|
|
42
|
+
|
|
43
|
+
private params: ZanoWalletParams;
|
|
44
|
+
private zanoWallet: ZanoWindowParams;
|
|
45
|
+
|
|
46
|
+
constructor(params: ZanoWalletParams) {
|
|
47
|
+
|
|
48
|
+
if (typeof window === 'undefined') {
|
|
49
|
+
throw new Error('ZanoWallet can only be used in the browser');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!((window as unknown) as ZanoWindow).zano) {
|
|
53
|
+
console.error('ZanoWallet requires the ZanoWallet extension to be installed');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this.params = params;
|
|
57
|
+
this.zanoWallet = ((window as unknown) as ZanoWindow).zano;
|
|
58
|
+
this.localStorageKey = params.customLocalStorageKey || this.DEFAULT_LOCAL_STORAGE_KEY;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
private handleError({ message } : { message: string }) {
|
|
63
|
+
if (this.params.onConnectError) {
|
|
64
|
+
this.params.onConnectError(message);
|
|
65
|
+
} else {
|
|
66
|
+
console.error(message);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
getSavedWalletCredentials() {
|
|
71
|
+
const savedWallet = localStorage.getItem(this.localStorageKey);
|
|
72
|
+
if (!savedWallet) return undefined;
|
|
73
|
+
try {
|
|
74
|
+
return JSON.parse(savedWallet) as WalletCredentials;
|
|
75
|
+
} catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
setWalletCredentials(credentials: WalletCredentials | undefined) {
|
|
81
|
+
if (credentials) {
|
|
82
|
+
localStorage.setItem(this.localStorageKey, JSON.stringify(credentials));
|
|
83
|
+
} else {
|
|
84
|
+
localStorage.removeItem(this.localStorageKey);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
cleanWalletCredentials() {
|
|
89
|
+
this.setWalletCredentials(undefined);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async connect() {
|
|
93
|
+
|
|
94
|
+
if (this.params.beforeConnect) {
|
|
95
|
+
await this.params.beforeConnect();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (this.params.onConnectStart) {
|
|
99
|
+
this.params.onConnectStart();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const walletData = (await ((window as unknown) as ZanoWindow).zano.request('GET_WALLET_DATA')).data;
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
if (!walletData?.address) {
|
|
106
|
+
return this.handleError({ message: 'Companion is offline' });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (!walletData?.alias && this.params.aliasRequired) {
|
|
110
|
+
return this.handleError({ message: 'Alias not found' });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let nonce = "";
|
|
114
|
+
let signature = "";
|
|
115
|
+
let publicKey = "";
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
const existingWallet = this.params.useLocalStorage ? this.getSavedWalletCredentials() : undefined;
|
|
119
|
+
|
|
120
|
+
const existingWalletValid = existingWallet && existingWallet.address === walletData.address;
|
|
121
|
+
|
|
122
|
+
console.log('existingWalletValid', existingWalletValid);
|
|
123
|
+
console.log('existingWallet', existingWallet);
|
|
124
|
+
console.log('walletData', walletData);
|
|
125
|
+
|
|
126
|
+
if (existingWalletValid) {
|
|
127
|
+
nonce = existingWallet.nonce;
|
|
128
|
+
signature = existingWallet.signature;
|
|
129
|
+
publicKey = existingWallet.publicKey;
|
|
130
|
+
} else {
|
|
131
|
+
const generatedNonce = this.params.customNonce || uuidv4();
|
|
132
|
+
|
|
133
|
+
const signResult = await this.zanoWallet.request(
|
|
134
|
+
'REQUEST_MESSAGE_SIGN',
|
|
135
|
+
{
|
|
136
|
+
message: generatedNonce
|
|
137
|
+
},
|
|
138
|
+
null
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
if (!signResult?.data?.result) {
|
|
142
|
+
return this.handleError({ message: 'Failed to sign message' });
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
nonce = generatedNonce;
|
|
146
|
+
signature = signResult.data.result.sig;
|
|
147
|
+
publicKey = signResult.data.result.pkey;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
const serverData = {
|
|
152
|
+
alias: walletData.alias,
|
|
153
|
+
address: walletData.address,
|
|
154
|
+
signature,
|
|
155
|
+
pkey: publicKey,
|
|
156
|
+
message: nonce,
|
|
157
|
+
isSavedData: existingWalletValid
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (this.params.onLocalConnectEnd) {
|
|
161
|
+
this.params.onLocalConnectEnd(serverData);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (!this.params.disableServerRequest) {
|
|
165
|
+
const result = await fetch( this.params.customServerPath || "/api/auth", {
|
|
166
|
+
method: "POST",
|
|
167
|
+
headers: {
|
|
168
|
+
"Content-Type": "application/json",
|
|
169
|
+
},
|
|
170
|
+
body: JSON.stringify(
|
|
171
|
+
{
|
|
172
|
+
data: serverData
|
|
173
|
+
}
|
|
174
|
+
)
|
|
175
|
+
})
|
|
176
|
+
.then(res => res.json())
|
|
177
|
+
.catch((e) => ({
|
|
178
|
+
success: false,
|
|
179
|
+
error: e.message
|
|
180
|
+
}));
|
|
181
|
+
|
|
182
|
+
if (!result?.success || !result?.data) {
|
|
183
|
+
return this.handleError({ message: result.error });
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (!existingWalletValid && this.params.useLocalStorage) {
|
|
187
|
+
this.setWalletCredentials({
|
|
188
|
+
publicKey,
|
|
189
|
+
signature,
|
|
190
|
+
nonce,
|
|
191
|
+
address: walletData.address
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (this.params.onConnectEnd) {
|
|
196
|
+
this.params.onConnectEnd({
|
|
197
|
+
...serverData,
|
|
198
|
+
token: result.data.token
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async getWallet() {
|
|
205
|
+
return (await this.zanoWallet.request('GET_WALLET_DATA'))?.data as Wallet;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async getAddressByAlias(alias: string) {
|
|
209
|
+
return ((await this.zanoWallet.request('GET_ALIAS_DETAILS', { alias })) || undefined) as string | undefined;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async createAlias(alias: string) {
|
|
213
|
+
return ((await this.zanoWallet.request('CREATE_ALIAS', { alias })) || undefined).data;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export default ZanoWallet;
|
package/server/dist/index.js
DELETED
package/server/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,UAAU,CAAC;AACpC,OAAO,EAAC,YAAY,EAAC,CAAC"}
|
package/server/dist/server.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { AuthData, BalanceInfo } from './types';
|
|
2
|
-
import { APIAsset } from './types';
|
|
3
|
-
interface ConstructorParams {
|
|
4
|
-
walletUrl: string;
|
|
5
|
-
daemonUrl: string;
|
|
6
|
-
}
|
|
7
|
-
declare class ServerWallet {
|
|
8
|
-
private walletUrl;
|
|
9
|
-
private daemonUrl;
|
|
10
|
-
constructor(params: ConstructorParams);
|
|
11
|
-
private fetchDaemon;
|
|
12
|
-
private fetchWallet;
|
|
13
|
-
updateWalletRpcUrl(rpcUrl: string): Promise<void>;
|
|
14
|
-
updateDaemonRpcUrl(rpcUrl: string): Promise<void>;
|
|
15
|
-
getAssetsList(): Promise<APIAsset[]>;
|
|
16
|
-
getAssetDetails(assetId: string): Promise<APIAsset>;
|
|
17
|
-
getAssetInfo(assetId: string): Promise<any>;
|
|
18
|
-
sendTransfer(assetId: string, address: string, amount: string): Promise<any>;
|
|
19
|
-
getBalances(): Promise<BalanceInfo[]>;
|
|
20
|
-
validateWallet(authData: AuthData): Promise<boolean>;
|
|
21
|
-
}
|
|
22
|
-
export default ServerWallet;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/server/dist/types.js
DELETED
package/server/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/server/dist/utils.d.ts
DELETED
package/server/dist/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,kEAAkE,CAAC;AAEhG,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEzB,IAAI,CAAS;IACb,IAAI,CAAS;IAEpB,YAAY,OAAe,EAAE,IAAY;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ"}
|
package/web/dist/hooks.d.ts
DELETED
package/web/dist/hooks.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import ZanoWallet from './zanoWallet';
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
3
|
-
function useZanoWallet(params) {
|
|
4
|
-
const [zanoWallet, setZanoWallet] = useState(null);
|
|
5
|
-
useEffect(() => {
|
|
6
|
-
if (typeof window === 'undefined') {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
setZanoWallet(new ZanoWallet(params));
|
|
10
|
-
}, []);
|
|
11
|
-
return zanoWallet;
|
|
12
|
-
}
|
|
13
|
-
export { useZanoWallet };
|
|
14
|
-
//# sourceMappingURL=hooks.js.map
|
package/web/dist/hooks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,UAAgC,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,SAAS,aAAa,CAAC,MAAwB;IAC3C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IAEtE,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO;QACX,CAAC;QAED,aAAa,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/web/dist/index.d.ts
DELETED
package/web/dist/index.js
DELETED
package/web/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AACtC,OAAO,EAAC,aAAa,EAAC,CAAC;AAEvB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAC,UAAU,EAAC,CAAC"}
|
package/web/dist/types.js
DELETED
package/web/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/web/dist/zanoWallet.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Wallet } from './types';
|
|
2
|
-
export interface ZanoWalletParams {
|
|
3
|
-
authPath: string;
|
|
4
|
-
useLocalStorage?: boolean;
|
|
5
|
-
aliasRequired?: boolean;
|
|
6
|
-
customLocalStorageKey?: string;
|
|
7
|
-
customNonce?: string;
|
|
8
|
-
customServerPath?: string;
|
|
9
|
-
disableServerRequest?: boolean;
|
|
10
|
-
onConnectStart?: (...params: any) => any;
|
|
11
|
-
onConnectEnd?: (...params: any) => any;
|
|
12
|
-
onConnectError?: (...params: any) => any;
|
|
13
|
-
beforeConnect?: (...params: any) => any;
|
|
14
|
-
onLocalConnectEnd?: (...params: any) => any;
|
|
15
|
-
}
|
|
16
|
-
interface WalletCredentials {
|
|
17
|
-
nonce: string;
|
|
18
|
-
signature: string;
|
|
19
|
-
publicKey: string;
|
|
20
|
-
address: string;
|
|
21
|
-
}
|
|
22
|
-
declare class ZanoWallet {
|
|
23
|
-
private DEFAULT_LOCAL_STORAGE_KEY;
|
|
24
|
-
private localStorageKey;
|
|
25
|
-
private params;
|
|
26
|
-
private zanoWallet;
|
|
27
|
-
constructor(params: ZanoWalletParams);
|
|
28
|
-
private handleError;
|
|
29
|
-
getSavedWalletCredentials(): WalletCredentials | undefined;
|
|
30
|
-
setWalletCredentials(credentials: WalletCredentials | undefined): void;
|
|
31
|
-
cleanWalletCredentials(): void;
|
|
32
|
-
connect(): Promise<void>;
|
|
33
|
-
getWallet(): Promise<Wallet>;
|
|
34
|
-
getAddressByAlias(alias: string): Promise<string | undefined>;
|
|
35
|
-
createAlias(alias: string): Promise<any>;
|
|
36
|
-
}
|
|
37
|
-
export default ZanoWallet;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zanoWallet.js","sourceRoot":"","sources":["../src/zanoWallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAqCpC,MAAM,UAAU;IAEJ,yBAAyB,GAAG,QAAQ,CAAC;IACrC,eAAe,CAAS;IAExB,MAAM,CAAmB;IACzB,UAAU,CAAmB;IAErC,YAAY,MAAwB;QAEhC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAG,MAAiC,CAAC,IAAI,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAK,MAAiC,CAAC,IAAI,CAAC;QAC3D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,qBAAqB,IAAI,IAAI,CAAC,yBAAyB,CAAC;IAC1F,CAAC;IAGO,WAAW,CAAC,EAAE,OAAO,EAAwB;QACjD,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,yBAAyB;QACrB,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QACnC,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAsB,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IAED,oBAAoB,CAAC,WAA0C;QAC3D,IAAI,WAAW,EAAE,CAAC;YACd,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACJ,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,CAAC;IACL,CAAC;IAED,sBAAsB;QAClB,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO;QAET,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,MAAQ,MAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;QAGpG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,SAAS,GAAG,EAAE,CAAC;QAGnB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAElG,MAAM,mBAAmB,GAAG,cAAc,IAAI,cAAc,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC;QAE5F,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAEtC,IAAI,mBAAmB,EAAE,CAAC;YACtB,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;YAC7B,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;YACrC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;QACzC,CAAC;aAAM,CAAC;YACJ,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC;YAE3D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAC5C,sBAAsB,EACtB;gBACI,OAAO,EAAE,cAAc;aAC1B,EACD,IAAI,CACP,CAAC;YAEF,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,KAAK,GAAG,cAAc,CAAC;YACvB,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACvC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5C,CAAC;QAGD,MAAM,UAAU,GAAG;YACf,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS;YACT,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,mBAAmB;SACnC,CAAA;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,WAAW,EAAE;gBACrE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACL,cAAc,EAAE,kBAAkB;iBACrC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAChB;oBACI,IAAI,EAAE,UAAU;iBACnB,CACJ;aACJ,CAAC;iBACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;iBACvB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC,CAAC;YAEJ,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;gBACtD,IAAI,CAAC,oBAAoB,CAAC;oBACtB,SAAS;oBACT,SAAS;oBACT,KAAK;oBACL,OAAO,EAAE,UAAU,CAAC,OAAO;iBAC9B,CAAC,CAAC;YACP,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;oBACrB,GAAG,UAAU;oBACb,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;iBAC3B,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS;QACX,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAc,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAa;QACjC,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,SAAS,CAAuB,CAAC;IAChH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC3B,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC;IAC1F,CAAC;CACJ;AAED,eAAe,UAAU,CAAC"}
|