@pyxisjs/client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.d.mts +124 -0
- package/dist/index.d.ts +124 -0
- package/dist/index.js +445 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +427 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +47 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Pyxis Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { QuoteDepositArgs, QuoteWithdrawArgs, GetDepositRateInQuoteSafeArgs, GetWithdrawRateInQuoteSafeArgs, BuildDepositTxArgs, TransactionPayload, BuildWithdrawTxArgs, BuildReclaimWithdrawalRequestTxArgs, BuildCancelWithdrawalRequestTxArgs, GetMinimumRequestAgeArgs, GetWithdrawalRequestsOfUserArgs, PyxisWithdrawalRequest, BaseChainAdapter, GetActivitiesArgs, VaultActivity, VaultTvlArgs, HistoricalApyArgs, ExchangeRateEvent, ApyDataPoint, BaseAnalyticsClient, ChainType } from '@pyxisjs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Chain-agnostic Vault API implementation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
interface MultiChainVaultAPI {
|
|
8
|
+
quoteDeposit(args: QuoteDepositArgs): Promise<string>;
|
|
9
|
+
quoteWithdraw(args: QuoteWithdrawArgs): Promise<string>;
|
|
10
|
+
getDepositRateInQuoteSafe(args: GetDepositRateInQuoteSafeArgs): Promise<string>;
|
|
11
|
+
getWithdrawRateInQuoteSafe(args: GetWithdrawRateInQuoteSafeArgs): Promise<string>;
|
|
12
|
+
buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload>;
|
|
13
|
+
buildWithdrawTx(args: BuildWithdrawTxArgs): Promise<TransactionPayload>;
|
|
14
|
+
buildReclaimWithdrawalRequestTx(args: BuildReclaimWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
15
|
+
buildCancelWithdrawalRequestTx(args: BuildCancelWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
16
|
+
getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number>;
|
|
17
|
+
getUserWithdrawalRequests(args: GetWithdrawalRequestsOfUserArgs): Promise<PyxisWithdrawalRequest[]>;
|
|
18
|
+
}
|
|
19
|
+
declare class MultiChainVaultClient implements MultiChainVaultAPI {
|
|
20
|
+
private adapter;
|
|
21
|
+
constructor(adapter: BaseChainAdapter<any>);
|
|
22
|
+
/**
|
|
23
|
+
* Get function signature using the new configuration system
|
|
24
|
+
*/
|
|
25
|
+
private getFunctionSignature;
|
|
26
|
+
getWithdrawRateInQuoteSafe(args: GetWithdrawRateInQuoteSafeArgs): Promise<string>;
|
|
27
|
+
getDepositRateInQuoteSafe(args: GetDepositRateInQuoteSafeArgs): Promise<string>;
|
|
28
|
+
quoteDeposit({ vault, asset, amount, }: QuoteDepositArgs): Promise<string>;
|
|
29
|
+
quoteWithdraw({ vault, amount, wantAsset, }: QuoteWithdrawArgs): Promise<string>;
|
|
30
|
+
buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload>;
|
|
31
|
+
buildWithdrawTx(args: BuildWithdrawTxArgs): Promise<TransactionPayload>;
|
|
32
|
+
buildReclaimWithdrawalRequestTx(args: BuildReclaimWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
33
|
+
buildCancelWithdrawalRequestTx(args: BuildCancelWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
34
|
+
getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number>;
|
|
35
|
+
getUserWithdrawalRequests({ flag, userAddress, vault, matchAll, }: GetWithdrawalRequestsOfUserArgs): Promise<PyxisWithdrawalRequest[]>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* PyxisAnalyticsAPI - Public interface for analytics operations
|
|
40
|
+
*/
|
|
41
|
+
interface PyxisAnalyticsAPI {
|
|
42
|
+
getActivities(args: GetActivitiesArgs): Promise<{
|
|
43
|
+
activities: VaultActivity[];
|
|
44
|
+
total: number;
|
|
45
|
+
}>;
|
|
46
|
+
getTvlInBaseAsset(args: VaultTvlArgs): Promise<string>;
|
|
47
|
+
getUpdateExchangeRateEvents(args: HistoricalApyArgs): Promise<ExchangeRateEvent[]>;
|
|
48
|
+
get30DayApy(vault: string): Promise<string>;
|
|
49
|
+
getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* PyxisAnalyticsClient - Multi-chain analytics client
|
|
53
|
+
*
|
|
54
|
+
* This client aggregates data from multiple chain-specific analytics clients.
|
|
55
|
+
* Each method fetches data from all clients and combines the results.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const aptosClient = new AptosAnalyticsClient(baseAdapter, analyticsAdapter);
|
|
60
|
+
* const evmClient = new EVMAnalyticsClient(evmAdapter); // future
|
|
61
|
+
* const client = new PyxisAnalyticsClient([aptosClient, evmClient]);
|
|
62
|
+
*
|
|
63
|
+
* const activities = await client.getActivities({ vault: '0x...', page: 1 });
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
declare class PyxisAnalyticsClient implements PyxisAnalyticsAPI {
|
|
67
|
+
private clients;
|
|
68
|
+
constructor(clients: BaseAnalyticsClient[]);
|
|
69
|
+
/**
|
|
70
|
+
* Get vault activities with pagination from all clients
|
|
71
|
+
* Aggregates activities from all clients
|
|
72
|
+
*/
|
|
73
|
+
getActivities(args: GetActivitiesArgs): Promise<{
|
|
74
|
+
activities: VaultActivity[];
|
|
75
|
+
total: number;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Get total value locked in base asset from all clients
|
|
79
|
+
* Returns the sum of TVL from all clients
|
|
80
|
+
*/
|
|
81
|
+
getTvlInBaseAsset(args: VaultTvlArgs): Promise<string>;
|
|
82
|
+
/**
|
|
83
|
+
* Get exchange rate update events from all clients
|
|
84
|
+
* Aggregates and sorts events by timestamp
|
|
85
|
+
*/
|
|
86
|
+
getUpdateExchangeRateEvents(args: HistoricalApyArgs): Promise<ExchangeRateEvent[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Get 30-day APY for a vault
|
|
89
|
+
* Returns the average APY across all clients
|
|
90
|
+
*/
|
|
91
|
+
get30DayApy(vault: string): Promise<string>;
|
|
92
|
+
/**
|
|
93
|
+
* Get historical APY data points from all clients
|
|
94
|
+
* Aggregates data points and averages values for matching timestamps
|
|
95
|
+
*/
|
|
96
|
+
getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]>;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
interface ContractConfig {
|
|
100
|
+
name: string;
|
|
101
|
+
abi: Record<ChainType, any>;
|
|
102
|
+
functionSignatures: Partial<Record<ChainType, Partial<Record<string, string>>>>;
|
|
103
|
+
}
|
|
104
|
+
interface ContractsConfig {
|
|
105
|
+
[key: string]: ContractConfig;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Contract configurations with real addresses and ABIs
|
|
109
|
+
*/
|
|
110
|
+
declare const CONTRACTS: Record<string, ContractConfig>;
|
|
111
|
+
/**
|
|
112
|
+
* Get function signature for a contract on a specific chain
|
|
113
|
+
* @param type - The chain type (EVM or MoveVM)
|
|
114
|
+
* @param contractName - The name of the contract
|
|
115
|
+
* @param functionName - The name of the function
|
|
116
|
+
* @param contractAddress - The address of the contract (required for MoveVM)
|
|
117
|
+
*/
|
|
118
|
+
declare function getFunctionSignature(type: ChainType, contractName: string, functionName: string, contractAddress: string): string;
|
|
119
|
+
/**
|
|
120
|
+
* Get contract ABI for a specific chain type
|
|
121
|
+
*/
|
|
122
|
+
declare function getContractABI(type: ChainType, contractName: string): any;
|
|
123
|
+
|
|
124
|
+
export { CONTRACTS, type ContractConfig, type ContractsConfig, type MultiChainVaultAPI, MultiChainVaultClient, type PyxisAnalyticsAPI, PyxisAnalyticsClient, getContractABI, getFunctionSignature };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { QuoteDepositArgs, QuoteWithdrawArgs, GetDepositRateInQuoteSafeArgs, GetWithdrawRateInQuoteSafeArgs, BuildDepositTxArgs, TransactionPayload, BuildWithdrawTxArgs, BuildReclaimWithdrawalRequestTxArgs, BuildCancelWithdrawalRequestTxArgs, GetMinimumRequestAgeArgs, GetWithdrawalRequestsOfUserArgs, PyxisWithdrawalRequest, BaseChainAdapter, GetActivitiesArgs, VaultActivity, VaultTvlArgs, HistoricalApyArgs, ExchangeRateEvent, ApyDataPoint, BaseAnalyticsClient, ChainType } from '@pyxisjs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Chain-agnostic Vault API implementation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
interface MultiChainVaultAPI {
|
|
8
|
+
quoteDeposit(args: QuoteDepositArgs): Promise<string>;
|
|
9
|
+
quoteWithdraw(args: QuoteWithdrawArgs): Promise<string>;
|
|
10
|
+
getDepositRateInQuoteSafe(args: GetDepositRateInQuoteSafeArgs): Promise<string>;
|
|
11
|
+
getWithdrawRateInQuoteSafe(args: GetWithdrawRateInQuoteSafeArgs): Promise<string>;
|
|
12
|
+
buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload>;
|
|
13
|
+
buildWithdrawTx(args: BuildWithdrawTxArgs): Promise<TransactionPayload>;
|
|
14
|
+
buildReclaimWithdrawalRequestTx(args: BuildReclaimWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
15
|
+
buildCancelWithdrawalRequestTx(args: BuildCancelWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
16
|
+
getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number>;
|
|
17
|
+
getUserWithdrawalRequests(args: GetWithdrawalRequestsOfUserArgs): Promise<PyxisWithdrawalRequest[]>;
|
|
18
|
+
}
|
|
19
|
+
declare class MultiChainVaultClient implements MultiChainVaultAPI {
|
|
20
|
+
private adapter;
|
|
21
|
+
constructor(adapter: BaseChainAdapter<any>);
|
|
22
|
+
/**
|
|
23
|
+
* Get function signature using the new configuration system
|
|
24
|
+
*/
|
|
25
|
+
private getFunctionSignature;
|
|
26
|
+
getWithdrawRateInQuoteSafe(args: GetWithdrawRateInQuoteSafeArgs): Promise<string>;
|
|
27
|
+
getDepositRateInQuoteSafe(args: GetDepositRateInQuoteSafeArgs): Promise<string>;
|
|
28
|
+
quoteDeposit({ vault, asset, amount, }: QuoteDepositArgs): Promise<string>;
|
|
29
|
+
quoteWithdraw({ vault, amount, wantAsset, }: QuoteWithdrawArgs): Promise<string>;
|
|
30
|
+
buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload>;
|
|
31
|
+
buildWithdrawTx(args: BuildWithdrawTxArgs): Promise<TransactionPayload>;
|
|
32
|
+
buildReclaimWithdrawalRequestTx(args: BuildReclaimWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
33
|
+
buildCancelWithdrawalRequestTx(args: BuildCancelWithdrawalRequestTxArgs): Promise<TransactionPayload>;
|
|
34
|
+
getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number>;
|
|
35
|
+
getUserWithdrawalRequests({ flag, userAddress, vault, matchAll, }: GetWithdrawalRequestsOfUserArgs): Promise<PyxisWithdrawalRequest[]>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* PyxisAnalyticsAPI - Public interface for analytics operations
|
|
40
|
+
*/
|
|
41
|
+
interface PyxisAnalyticsAPI {
|
|
42
|
+
getActivities(args: GetActivitiesArgs): Promise<{
|
|
43
|
+
activities: VaultActivity[];
|
|
44
|
+
total: number;
|
|
45
|
+
}>;
|
|
46
|
+
getTvlInBaseAsset(args: VaultTvlArgs): Promise<string>;
|
|
47
|
+
getUpdateExchangeRateEvents(args: HistoricalApyArgs): Promise<ExchangeRateEvent[]>;
|
|
48
|
+
get30DayApy(vault: string): Promise<string>;
|
|
49
|
+
getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* PyxisAnalyticsClient - Multi-chain analytics client
|
|
53
|
+
*
|
|
54
|
+
* This client aggregates data from multiple chain-specific analytics clients.
|
|
55
|
+
* Each method fetches data from all clients and combines the results.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const aptosClient = new AptosAnalyticsClient(baseAdapter, analyticsAdapter);
|
|
60
|
+
* const evmClient = new EVMAnalyticsClient(evmAdapter); // future
|
|
61
|
+
* const client = new PyxisAnalyticsClient([aptosClient, evmClient]);
|
|
62
|
+
*
|
|
63
|
+
* const activities = await client.getActivities({ vault: '0x...', page: 1 });
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
declare class PyxisAnalyticsClient implements PyxisAnalyticsAPI {
|
|
67
|
+
private clients;
|
|
68
|
+
constructor(clients: BaseAnalyticsClient[]);
|
|
69
|
+
/**
|
|
70
|
+
* Get vault activities with pagination from all clients
|
|
71
|
+
* Aggregates activities from all clients
|
|
72
|
+
*/
|
|
73
|
+
getActivities(args: GetActivitiesArgs): Promise<{
|
|
74
|
+
activities: VaultActivity[];
|
|
75
|
+
total: number;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Get total value locked in base asset from all clients
|
|
79
|
+
* Returns the sum of TVL from all clients
|
|
80
|
+
*/
|
|
81
|
+
getTvlInBaseAsset(args: VaultTvlArgs): Promise<string>;
|
|
82
|
+
/**
|
|
83
|
+
* Get exchange rate update events from all clients
|
|
84
|
+
* Aggregates and sorts events by timestamp
|
|
85
|
+
*/
|
|
86
|
+
getUpdateExchangeRateEvents(args: HistoricalApyArgs): Promise<ExchangeRateEvent[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Get 30-day APY for a vault
|
|
89
|
+
* Returns the average APY across all clients
|
|
90
|
+
*/
|
|
91
|
+
get30DayApy(vault: string): Promise<string>;
|
|
92
|
+
/**
|
|
93
|
+
* Get historical APY data points from all clients
|
|
94
|
+
* Aggregates data points and averages values for matching timestamps
|
|
95
|
+
*/
|
|
96
|
+
getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]>;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
interface ContractConfig {
|
|
100
|
+
name: string;
|
|
101
|
+
abi: Record<ChainType, any>;
|
|
102
|
+
functionSignatures: Partial<Record<ChainType, Partial<Record<string, string>>>>;
|
|
103
|
+
}
|
|
104
|
+
interface ContractsConfig {
|
|
105
|
+
[key: string]: ContractConfig;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Contract configurations with real addresses and ABIs
|
|
109
|
+
*/
|
|
110
|
+
declare const CONTRACTS: Record<string, ContractConfig>;
|
|
111
|
+
/**
|
|
112
|
+
* Get function signature for a contract on a specific chain
|
|
113
|
+
* @param type - The chain type (EVM or MoveVM)
|
|
114
|
+
* @param contractName - The name of the contract
|
|
115
|
+
* @param functionName - The name of the function
|
|
116
|
+
* @param contractAddress - The address of the contract (required for MoveVM)
|
|
117
|
+
*/
|
|
118
|
+
declare function getFunctionSignature(type: ChainType, contractName: string, functionName: string, contractAddress: string): string;
|
|
119
|
+
/**
|
|
120
|
+
* Get contract ABI for a specific chain type
|
|
121
|
+
*/
|
|
122
|
+
declare function getContractABI(type: ChainType, contractName: string): any;
|
|
123
|
+
|
|
124
|
+
export { CONTRACTS, type ContractConfig, type ContractsConfig, type MultiChainVaultAPI, MultiChainVaultClient, type PyxisAnalyticsAPI, PyxisAnalyticsClient, getContractABI, getFunctionSignature };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
CONTRACTS: () => CONTRACTS,
|
|
24
|
+
MultiChainVaultClient: () => MultiChainVaultClient,
|
|
25
|
+
PyxisAnalyticsClient: () => PyxisAnalyticsClient,
|
|
26
|
+
getContractABI: () => getContractABI,
|
|
27
|
+
getFunctionSignature: () => getFunctionSignature
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(index_exports);
|
|
30
|
+
|
|
31
|
+
// src/vault-client.ts
|
|
32
|
+
var import_core2 = require("@pyxisjs/core");
|
|
33
|
+
var import_core3 = require("@pyxisjs/core");
|
|
34
|
+
|
|
35
|
+
// src/constants.ts
|
|
36
|
+
var import_chains = require("@pyxisjs/chains");
|
|
37
|
+
var import_core = require("@pyxisjs/core");
|
|
38
|
+
var CONTRACTS = {
|
|
39
|
+
accountant: {
|
|
40
|
+
name: "Accountant",
|
|
41
|
+
abi: {
|
|
42
|
+
[import_core.ChainType.MoveVM]: import_chains.AccountantAptosABI,
|
|
43
|
+
[import_core.ChainType.EVM]: import_chains.AccountantABI
|
|
44
|
+
},
|
|
45
|
+
functionSignatures: {
|
|
46
|
+
[import_core.ChainType.MoveVM]: {
|
|
47
|
+
calculate_shares_from_assets_safe: "{address}::accountant::calculate_shares_from_assets_safe",
|
|
48
|
+
calculate_assets_from_shares_safe: "{address}::accountant::calculate_assets_from_shares_safe",
|
|
49
|
+
get_withdraw_rate_in_quote_safe: "{address}::accountant::get_withdraw_rate_in_quote_safe",
|
|
50
|
+
get_deposit_rate_in_quote_safe: "{address}::accountant::get_deposit_rate_in_quote_safe"
|
|
51
|
+
},
|
|
52
|
+
[import_core.ChainType.EVM]: {
|
|
53
|
+
calculate_shares_from_assets_safe: "calculateSharesFromAssetsSafe",
|
|
54
|
+
calculate_assets_from_shares_safe: "calculateAssetsFromSharesSafe",
|
|
55
|
+
get_withdraw_rate_in_quote_safe: "getWithdrawRateInQuoteSafe",
|
|
56
|
+
get_deposit_rate_in_quote_safe: "getDepositRateInQuoteSafe"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
teller: {
|
|
61
|
+
name: "Teller",
|
|
62
|
+
abi: {
|
|
63
|
+
[import_core.ChainType.MoveVM]: import_chains.TellerAptosABI,
|
|
64
|
+
[import_core.ChainType.EVM]: import_chains.TellerWithMultiAssetSupportABI
|
|
65
|
+
},
|
|
66
|
+
functionSignatures: {
|
|
67
|
+
[import_core.ChainType.MoveVM]: {
|
|
68
|
+
deposit: "{address}::teller::deposit",
|
|
69
|
+
deposit_with_referral: "{address}::teller::deposit_with_referral",
|
|
70
|
+
deposit_for: "{address}::teller::deposit_for",
|
|
71
|
+
mint_shares: "{address}::teller::mint_shares",
|
|
72
|
+
create_withdrawal_request: "{address}::teller::create_withdrawal_request"
|
|
73
|
+
},
|
|
74
|
+
[import_core.ChainType.EVM]: {
|
|
75
|
+
deposit: "deposit",
|
|
76
|
+
deposit_with_referral: "depositWithReferral",
|
|
77
|
+
deposit_for: "depositFor",
|
|
78
|
+
mint_shares: "mintShares",
|
|
79
|
+
create_withdrawal_request: "createWithdrawalRequest"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
atomicQueue: {
|
|
84
|
+
name: "AtomicQueue",
|
|
85
|
+
abi: {
|
|
86
|
+
[import_core.ChainType.MoveVM]: import_chains.AtomicQueueAptosABI,
|
|
87
|
+
[import_core.ChainType.EVM]: import_chains.AtomicQueueABI
|
|
88
|
+
},
|
|
89
|
+
functionSignatures: {
|
|
90
|
+
[import_core.ChainType.MoveVM]: {
|
|
91
|
+
get_minimum_request_age: "{address}::atomic_queue::get_minimum_request_age",
|
|
92
|
+
get_all_atomic_requests: "{address}::atomic_queue::get_all_atomic_requests",
|
|
93
|
+
get_request_update_cooldown: "{address}::atomic_queue::get_request_update_cooldown",
|
|
94
|
+
get_request_updated_at: "{address}::atomic_queue::get_request_updated_at",
|
|
95
|
+
get_user_atomic_request: "{address}::atomic_queue::get_user_atomic_request",
|
|
96
|
+
get_user_atomic_requests: "{address}::atomic_queue::get_user_atomic_requests",
|
|
97
|
+
is_atomic_request_valid: "{address}::atomic_queue::is_atomic_request_valid",
|
|
98
|
+
is_paused: "{address}::atomic_queue::is_paused",
|
|
99
|
+
update_atomic_request: "{address}::atomic_queue::update_atomic_request",
|
|
100
|
+
cancel_atomic_request: "{address}::atomic_queue::cancel_atomic_request",
|
|
101
|
+
cancel_withdrawal_request: "{address}::atomic_queue::cancel_atomic_request"
|
|
102
|
+
},
|
|
103
|
+
[import_core.ChainType.EVM]: {
|
|
104
|
+
get_minimum_request_age: "getMinimumRequestAge",
|
|
105
|
+
cancel_withdrawal_request: "cancelWithdrawalRequest",
|
|
106
|
+
reclaim_withdrawal_request: "reclaimWithdrawalRequest"
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
vault: {
|
|
111
|
+
name: "Vault",
|
|
112
|
+
abi: {
|
|
113
|
+
[import_core.ChainType.MoveVM]: import_chains.VaultAptosABI,
|
|
114
|
+
[import_core.ChainType.EVM]: import_chains.BoringVaultABI
|
|
115
|
+
},
|
|
116
|
+
functionSignatures: {
|
|
117
|
+
[import_core.ChainType.MoveVM]: {
|
|
118
|
+
get_vault_config: "{address}::vault::get_vault_config",
|
|
119
|
+
get_total_assets: "{address}::vault::get_total_assets",
|
|
120
|
+
get_total_shares: "{address}::vault::get_total_shares"
|
|
121
|
+
},
|
|
122
|
+
[import_core.ChainType.EVM]: {
|
|
123
|
+
get_vault_config: "getVaultConfig",
|
|
124
|
+
get_total_assets: "totalAssets",
|
|
125
|
+
get_total_shares: "totalShares"
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
function getFunctionSignature(type, contractName, functionName, contractAddress) {
|
|
131
|
+
const contract = CONTRACTS[contractName];
|
|
132
|
+
if (!contract) {
|
|
133
|
+
throw new Error(`Contract ${contractName} not found`);
|
|
134
|
+
}
|
|
135
|
+
const chainSignatures = contract.functionSignatures[type];
|
|
136
|
+
if (!chainSignatures) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`Chain type ${type} not supported for contract ${contractName}`
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
const signature = chainSignatures[functionName];
|
|
142
|
+
if (!signature) {
|
|
143
|
+
throw new Error(
|
|
144
|
+
`Function ${functionName} not found in contract ${contractName}`
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return signature.replace("{address}", contractAddress);
|
|
148
|
+
}
|
|
149
|
+
function getContractABI(type, contractName) {
|
|
150
|
+
const contract = CONTRACTS[contractName];
|
|
151
|
+
if (!contract) {
|
|
152
|
+
throw new Error(`Contract ${contractName} not found`);
|
|
153
|
+
}
|
|
154
|
+
const abi = contract.abi[type];
|
|
155
|
+
if (!abi) {
|
|
156
|
+
console.warn(`ABI for ${contractName} on ${type} is missing`);
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
return abi;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// src/vault-client.ts
|
|
163
|
+
var MultiChainVaultClient = class {
|
|
164
|
+
constructor(adapter) {
|
|
165
|
+
this.adapter = adapter;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get function signature using the new configuration system
|
|
169
|
+
*/
|
|
170
|
+
getFunctionSignature(contractName, functionName) {
|
|
171
|
+
const config = (0, import_core2.getChainConfig)(this.adapter.chain.id);
|
|
172
|
+
const contractAddress = this.adapter.getContractAddress(contractName);
|
|
173
|
+
return getFunctionSignature(
|
|
174
|
+
config.type,
|
|
175
|
+
contractName,
|
|
176
|
+
functionName,
|
|
177
|
+
contractAddress
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
async getWithdrawRateInQuoteSafe(args) {
|
|
181
|
+
const functionSignature = this.getFunctionSignature(
|
|
182
|
+
"accountant",
|
|
183
|
+
"get_withdraw_rate_in_quote_safe"
|
|
184
|
+
);
|
|
185
|
+
const result = await this.adapter.viewContract({
|
|
186
|
+
function: functionSignature,
|
|
187
|
+
arguments: [args.vault, args.quoteAsset]
|
|
188
|
+
});
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
async getDepositRateInQuoteSafe(args) {
|
|
192
|
+
const functionSignature = this.getFunctionSignature(
|
|
193
|
+
"accountant",
|
|
194
|
+
"get_deposit_rate_in_quote_safe"
|
|
195
|
+
);
|
|
196
|
+
const result = await this.adapter.viewContract({
|
|
197
|
+
function: functionSignature,
|
|
198
|
+
arguments: [args.vault, args.quoteAsset]
|
|
199
|
+
});
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
async quoteDeposit({
|
|
203
|
+
vault,
|
|
204
|
+
asset,
|
|
205
|
+
amount
|
|
206
|
+
}) {
|
|
207
|
+
const functionSignature = this.getFunctionSignature(
|
|
208
|
+
"accountant",
|
|
209
|
+
"calculate_shares_from_assets_safe"
|
|
210
|
+
);
|
|
211
|
+
const result = await this.adapter.viewContract({
|
|
212
|
+
function: functionSignature,
|
|
213
|
+
arguments: [vault, asset, amount]
|
|
214
|
+
});
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
async quoteWithdraw({
|
|
218
|
+
vault,
|
|
219
|
+
amount,
|
|
220
|
+
wantAsset
|
|
221
|
+
}) {
|
|
222
|
+
const functionSignature = this.getFunctionSignature(
|
|
223
|
+
"accountant",
|
|
224
|
+
"calculate_assets_from_shares_safe"
|
|
225
|
+
);
|
|
226
|
+
const result = await this.adapter.viewContract({
|
|
227
|
+
function: functionSignature,
|
|
228
|
+
arguments: [vault, wantAsset, amount]
|
|
229
|
+
});
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
async buildDepositTx(args) {
|
|
233
|
+
const functionSignature = this.getFunctionSignature("teller", "deposit");
|
|
234
|
+
return await this.adapter.buildPayload({
|
|
235
|
+
function: functionSignature,
|
|
236
|
+
arguments: [args.vault, args.asset, args.amount, args.minimumMint]
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
async buildWithdrawTx(args) {
|
|
240
|
+
const functionSignature = this.getFunctionSignature(
|
|
241
|
+
"atomicQueue",
|
|
242
|
+
"update_atomic_request"
|
|
243
|
+
);
|
|
244
|
+
return await this.adapter.buildPayload({
|
|
245
|
+
function: functionSignature,
|
|
246
|
+
arguments: [
|
|
247
|
+
args.vault,
|
|
248
|
+
args.offerAsset,
|
|
249
|
+
args.wantAsset,
|
|
250
|
+
args.offerAmount,
|
|
251
|
+
args.price,
|
|
252
|
+
args.deadline
|
|
253
|
+
]
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
async buildReclaimWithdrawalRequestTx(args) {
|
|
257
|
+
const functionSignature = this.getFunctionSignature(
|
|
258
|
+
"atomicQueue",
|
|
259
|
+
"cancel_atomic_request"
|
|
260
|
+
);
|
|
261
|
+
return await this.adapter.buildPayload({
|
|
262
|
+
function: functionSignature,
|
|
263
|
+
arguments: [args.vault, args.offerAsset, args.wantAsset]
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
async buildCancelWithdrawalRequestTx(args) {
|
|
267
|
+
const functionSignature = this.getFunctionSignature(
|
|
268
|
+
"atomicQueue",
|
|
269
|
+
"cancel_withdrawal_request"
|
|
270
|
+
);
|
|
271
|
+
return await this.adapter.buildPayload({
|
|
272
|
+
function: functionSignature,
|
|
273
|
+
arguments: [args.vault, args.offerAsset, args.wantAsset]
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
async getMinimumRequestAge(args) {
|
|
277
|
+
const functionSignature = this.getFunctionSignature(
|
|
278
|
+
"atomicQueue",
|
|
279
|
+
"get_minimum_request_age"
|
|
280
|
+
);
|
|
281
|
+
const result = await this.adapter.viewContract({
|
|
282
|
+
function: functionSignature,
|
|
283
|
+
arguments: [args.vault]
|
|
284
|
+
});
|
|
285
|
+
return Number(result);
|
|
286
|
+
}
|
|
287
|
+
async getUserWithdrawalRequests({
|
|
288
|
+
flag,
|
|
289
|
+
userAddress,
|
|
290
|
+
vault,
|
|
291
|
+
matchAll = true
|
|
292
|
+
}) {
|
|
293
|
+
const requestFlag = import_core3.PyxisUtils.buildRequestFlags(flag);
|
|
294
|
+
const getUserRequestsFn = this.getFunctionSignature(
|
|
295
|
+
"atomicQueue",
|
|
296
|
+
"get_user_atomic_requests"
|
|
297
|
+
);
|
|
298
|
+
const withdrawalRequests = await this.adapter.viewContract({
|
|
299
|
+
function: getUserRequestsFn,
|
|
300
|
+
arguments: [vault, userAddress, requestFlag, matchAll]
|
|
301
|
+
});
|
|
302
|
+
const getUpdatedAtFn = this.getFunctionSignature(
|
|
303
|
+
"atomicQueue",
|
|
304
|
+
"get_request_updated_at"
|
|
305
|
+
);
|
|
306
|
+
const updatedAtResults = await Promise.allSettled(
|
|
307
|
+
withdrawalRequests.map(
|
|
308
|
+
(request) => this.adapter.viewContract({
|
|
309
|
+
function: getUpdatedAtFn,
|
|
310
|
+
arguments: [
|
|
311
|
+
vault,
|
|
312
|
+
userAddress,
|
|
313
|
+
request.offer_token.inner,
|
|
314
|
+
request.want_token.inner
|
|
315
|
+
]
|
|
316
|
+
})
|
|
317
|
+
)
|
|
318
|
+
);
|
|
319
|
+
return withdrawalRequests.map(
|
|
320
|
+
(request, index) => {
|
|
321
|
+
const result = updatedAtResults[index];
|
|
322
|
+
let updatedAt;
|
|
323
|
+
if (result.status === "fulfilled") {
|
|
324
|
+
updatedAt = result.value;
|
|
325
|
+
}
|
|
326
|
+
return import_core3.PyxisUtils.mapOnchainToWithdrawalRequest(request, updatedAt);
|
|
327
|
+
}
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// ../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js
|
|
333
|
+
var isProduction = process.env.NODE_ENV === "production";
|
|
334
|
+
var prefix = "Invariant failed";
|
|
335
|
+
function invariant(condition, message) {
|
|
336
|
+
if (condition) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
if (isProduction) {
|
|
340
|
+
throw new Error(prefix);
|
|
341
|
+
}
|
|
342
|
+
var provided = typeof message === "function" ? message() : message;
|
|
343
|
+
var value = provided ? "".concat(prefix, ": ").concat(provided) : prefix;
|
|
344
|
+
throw new Error(value);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// src/analytics-client.ts
|
|
348
|
+
var PyxisAnalyticsClient = class {
|
|
349
|
+
constructor(clients) {
|
|
350
|
+
invariant(clients.length > 0, "At least one analytics client is required");
|
|
351
|
+
this.clients = clients;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get vault activities with pagination from all clients
|
|
355
|
+
* Aggregates activities from all clients
|
|
356
|
+
*/
|
|
357
|
+
async getActivities(args) {
|
|
358
|
+
const results = await Promise.all(
|
|
359
|
+
this.clients.map((client) => client.getActivities(args))
|
|
360
|
+
);
|
|
361
|
+
const allActivities = results.flatMap((r) => r.activities);
|
|
362
|
+
const totalCount = results.reduce((sum, r) => sum + r.total, 0);
|
|
363
|
+
const pageSize = args.pageSize ?? 10;
|
|
364
|
+
const page = args.page ?? 1;
|
|
365
|
+
const start = (page - 1) * pageSize;
|
|
366
|
+
const paginatedActivities = allActivities.slice(start, start + pageSize);
|
|
367
|
+
return {
|
|
368
|
+
activities: paginatedActivities,
|
|
369
|
+
total: totalCount
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Get total value locked in base asset from all clients
|
|
374
|
+
* Returns the sum of TVL from all clients
|
|
375
|
+
*/
|
|
376
|
+
async getTvlInBaseAsset(args) {
|
|
377
|
+
const results = await Promise.all(
|
|
378
|
+
this.clients.map((client) => client.getTvlInBaseAsset(args))
|
|
379
|
+
);
|
|
380
|
+
const totalTvl = results.reduce((sum, tvl) => sum + BigInt(tvl), BigInt(0));
|
|
381
|
+
return totalTvl.toString();
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Get exchange rate update events from all clients
|
|
385
|
+
* Aggregates and sorts events by timestamp
|
|
386
|
+
*/
|
|
387
|
+
async getUpdateExchangeRateEvents(args) {
|
|
388
|
+
const results = await Promise.all(
|
|
389
|
+
this.clients.map((client) => client.getUpdateExchangeRateEvents(args))
|
|
390
|
+
);
|
|
391
|
+
const allEvents = results.flat();
|
|
392
|
+
allEvents.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));
|
|
393
|
+
return allEvents;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Get 30-day APY for a vault
|
|
397
|
+
* Returns the average APY across all clients
|
|
398
|
+
*/
|
|
399
|
+
async get30DayApy(vault) {
|
|
400
|
+
const results = await Promise.all(
|
|
401
|
+
this.clients.map((client) => client.get30DayApy(vault))
|
|
402
|
+
);
|
|
403
|
+
const validApys = results.filter((apy) => apy !== "0");
|
|
404
|
+
if (validApys.length === 0) {
|
|
405
|
+
return "0";
|
|
406
|
+
}
|
|
407
|
+
const totalApy = validApys.reduce((sum, apy) => sum + parseFloat(apy), 0);
|
|
408
|
+
return (totalApy / validApys.length).toString();
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Get historical APY data points from all clients
|
|
412
|
+
* Aggregates data points and averages values for matching timestamps
|
|
413
|
+
*/
|
|
414
|
+
async getHistoricalApy(args) {
|
|
415
|
+
const results = await Promise.all(
|
|
416
|
+
this.clients.map((client) => client.getHistoricalApy(args))
|
|
417
|
+
);
|
|
418
|
+
const allDataPoints = results.flat();
|
|
419
|
+
const timestampMap = /* @__PURE__ */ new Map();
|
|
420
|
+
for (const point of allDataPoints) {
|
|
421
|
+
const values = timestampMap.get(point.timestamp) || [];
|
|
422
|
+
values.push(parseFloat(point.value));
|
|
423
|
+
timestampMap.set(point.timestamp, values);
|
|
424
|
+
}
|
|
425
|
+
const aggregatedData = [];
|
|
426
|
+
for (const [timestamp, values] of timestampMap) {
|
|
427
|
+
const avgValue = values.reduce((a, b) => a + b, 0) / values.length;
|
|
428
|
+
aggregatedData.push({
|
|
429
|
+
timestamp,
|
|
430
|
+
value: avgValue.toString()
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
aggregatedData.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));
|
|
434
|
+
return aggregatedData;
|
|
435
|
+
}
|
|
436
|
+
};
|
|
437
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
438
|
+
0 && (module.exports = {
|
|
439
|
+
CONTRACTS,
|
|
440
|
+
MultiChainVaultClient,
|
|
441
|
+
PyxisAnalyticsClient,
|
|
442
|
+
getContractABI,
|
|
443
|
+
getFunctionSignature
|
|
444
|
+
});
|
|
445
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/vault-client.ts","../src/constants.ts","../../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../src/analytics-client.ts"],"sourcesContent":["export * from './vault-client';\nexport * from './analytics-client';\nexport * from './constants';\n","/**\n * Chain-agnostic Vault API implementation\n */\n\nimport {\n BaseChainAdapter,\n getChainConfig,\n TransactionPayload,\n} from '@pyxisjs/core';\nimport {\n BuildCancelWithdrawalRequestTxArgs,\n BuildDepositTxArgs,\n BuildReclaimWithdrawalRequestTxArgs,\n BuildWithdrawTxArgs,\n GetDepositRateInQuoteSafeArgs,\n GetMinimumRequestAgeArgs,\n GetWithdrawalRequestsOfUserArgs,\n GetWithdrawRateInQuoteSafeArgs,\n PyxisOnchainWithdrawalRequest,\n PyxisWithdrawalRequest,\n PyxisUtils,\n QuoteDepositArgs,\n QuoteWithdrawArgs,\n} from '@pyxisjs/core';\n\nimport { getFunctionSignature } from './constants';\n\nexport interface MultiChainVaultAPI {\n quoteDeposit(args: QuoteDepositArgs): Promise<string>;\n quoteWithdraw(args: QuoteWithdrawArgs): Promise<string>;\n getDepositRateInQuoteSafe(\n args: GetDepositRateInQuoteSafeArgs\n ): Promise<string>;\n getWithdrawRateInQuoteSafe(\n args: GetWithdrawRateInQuoteSafeArgs\n ): Promise<string>;\n buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload>;\n buildWithdrawTx(args: BuildWithdrawTxArgs): Promise<TransactionPayload>;\n buildReclaimWithdrawalRequestTx(\n args: BuildReclaimWithdrawalRequestTxArgs\n ): Promise<TransactionPayload>;\n buildCancelWithdrawalRequestTx(\n args: BuildCancelWithdrawalRequestTxArgs\n ): Promise<TransactionPayload>;\n getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number>;\n getUserWithdrawalRequests(\n args: GetWithdrawalRequestsOfUserArgs\n ): Promise<PyxisWithdrawalRequest[]>;\n}\n\nexport class MultiChainVaultClient implements MultiChainVaultAPI {\n constructor(private adapter: BaseChainAdapter<any>) {}\n\n /**\n * Get function signature using the new configuration system\n */\n private getFunctionSignature(\n contractName: 'accountant' | 'teller' | 'atomicQueue',\n functionName: string\n ): string {\n const config = getChainConfig(this.adapter.chain.id);\n const contractAddress = this.adapter.getContractAddress(contractName);\n return getFunctionSignature(\n config.type,\n contractName,\n functionName,\n contractAddress\n );\n }\n\n async getWithdrawRateInQuoteSafe(\n args: GetWithdrawRateInQuoteSafeArgs\n ): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'get_withdraw_rate_in_quote_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [args.vault, args.quoteAsset],\n });\n\n return result;\n }\n\n async getDepositRateInQuoteSafe(\n args: GetDepositRateInQuoteSafeArgs\n ): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'get_deposit_rate_in_quote_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [args.vault, args.quoteAsset],\n });\n\n return result;\n }\n\n async quoteDeposit({\n vault,\n asset,\n amount,\n }: QuoteDepositArgs): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'calculate_shares_from_assets_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [vault, asset, amount],\n });\n\n return result;\n }\n\n async quoteWithdraw({\n vault,\n amount,\n wantAsset,\n }: QuoteWithdrawArgs): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'calculate_assets_from_shares_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [vault, wantAsset, amount],\n });\n\n return result;\n }\n\n async buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload> {\n const functionSignature = this.getFunctionSignature('teller', 'deposit');\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [args.vault, args.asset, args.amount, args.minimumMint],\n });\n }\n\n async buildWithdrawTx(\n args: BuildWithdrawTxArgs\n ): Promise<TransactionPayload> {\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'update_atomic_request'\n );\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [\n args.vault,\n args.offerAsset,\n args.wantAsset,\n args.offerAmount,\n args.price,\n args.deadline,\n ],\n });\n }\n\n async buildReclaimWithdrawalRequestTx(\n args: BuildReclaimWithdrawalRequestTxArgs\n ): Promise<TransactionPayload> {\n // Call cancel_atomic_request to reclaim the request\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'cancel_atomic_request'\n );\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [args.vault, args.offerAsset, args.wantAsset],\n });\n }\n\n async buildCancelWithdrawalRequestTx(\n args: BuildCancelWithdrawalRequestTxArgs\n ): Promise<TransactionPayload> {\n // Update amount to 0 to cancel the request\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'cancel_withdrawal_request'\n );\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [args.vault, args.offerAsset, args.wantAsset],\n });\n }\n\n async getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number> {\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'get_minimum_request_age'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [args.vault],\n });\n\n return Number(result);\n }\n\n async getUserWithdrawalRequests({\n flag,\n userAddress,\n vault,\n matchAll = true,\n }: GetWithdrawalRequestsOfUserArgs): Promise<PyxisWithdrawalRequest[]> {\n const requestFlag = PyxisUtils.buildRequestFlags(flag);\n\n // Get user atomic requests\n const getUserRequestsFn = this.getFunctionSignature(\n 'atomicQueue',\n 'get_user_atomic_requests'\n );\n\n const withdrawalRequests: PyxisOnchainWithdrawalRequest[] =\n await this.adapter.viewContract<PyxisOnchainWithdrawalRequest[]>({\n function: getUserRequestsFn,\n arguments: [vault, userAddress, requestFlag, matchAll],\n });\n\n // Fetch updatedAt for each withdrawal request in parallel\n const getUpdatedAtFn = this.getFunctionSignature(\n 'atomicQueue',\n 'get_request_updated_at'\n );\n\n const updatedAtResults = await Promise.allSettled(\n withdrawalRequests.map((request: PyxisOnchainWithdrawalRequest) =>\n this.adapter.viewContract<string>({\n function: getUpdatedAtFn,\n arguments: [\n vault,\n userAddress,\n request.offer_token.inner,\n request.want_token.inner,\n ],\n })\n )\n );\n\n // Map withdrawal requests with enriched updatedAt data\n return withdrawalRequests.map(\n (request: PyxisOnchainWithdrawalRequest, index: number) => {\n const result = updatedAtResults[index];\n let updatedAt: string | undefined;\n\n if (result.status === 'fulfilled') {\n updatedAt = result.value as string;\n }\n\n return PyxisUtils.mapOnchainToWithdrawalRequest(request, updatedAt);\n }\n );\n }\n}\n","import {\n AccountantAptosABI,\n AtomicQueueAptosABI,\n TellerAptosABI,\n VaultAptosABI,\n AccountantABI,\n AtomicQueueABI,\n BoringVaultABI,\n TellerWithMultiAssetSupportABI,\n} from '@pyxisjs/chains';\nimport { ChainType } from '@pyxisjs/core';\n\nexport interface ContractConfig {\n name: string;\n abi: Record<ChainType, any>;\n functionSignatures: Partial<\n Record<ChainType, Partial<Record<string, string>>>\n >;\n}\n\nexport interface ContractsConfig {\n [key: string]: ContractConfig;\n}\n\n/**\n * Contract configurations with real addresses and ABIs\n */\nexport const CONTRACTS: Record<string, ContractConfig> = {\n accountant: {\n name: 'Accountant',\n abi: {\n [ChainType.MoveVM]: AccountantAptosABI,\n [ChainType.EVM]: AccountantABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n calculate_shares_from_assets_safe:\n '{address}::accountant::calculate_shares_from_assets_safe',\n calculate_assets_from_shares_safe:\n '{address}::accountant::calculate_assets_from_shares_safe',\n get_withdraw_rate_in_quote_safe:\n '{address}::accountant::get_withdraw_rate_in_quote_safe',\n get_deposit_rate_in_quote_safe:\n '{address}::accountant::get_deposit_rate_in_quote_safe',\n },\n [ChainType.EVM]: {\n calculate_shares_from_assets_safe: 'calculateSharesFromAssetsSafe',\n calculate_assets_from_shares_safe: 'calculateAssetsFromSharesSafe',\n get_withdraw_rate_in_quote_safe: 'getWithdrawRateInQuoteSafe',\n get_deposit_rate_in_quote_safe: 'getDepositRateInQuoteSafe',\n },\n },\n },\n teller: {\n name: 'Teller',\n abi: {\n [ChainType.MoveVM]: TellerAptosABI,\n [ChainType.EVM]: TellerWithMultiAssetSupportABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n deposit: '{address}::teller::deposit',\n deposit_with_referral: '{address}::teller::deposit_with_referral',\n deposit_for: '{address}::teller::deposit_for',\n mint_shares: '{address}::teller::mint_shares',\n create_withdrawal_request:\n '{address}::teller::create_withdrawal_request',\n },\n [ChainType.EVM]: {\n deposit: 'deposit',\n deposit_with_referral: 'depositWithReferral',\n deposit_for: 'depositFor',\n mint_shares: 'mintShares',\n create_withdrawal_request: 'createWithdrawalRequest',\n },\n },\n },\n atomicQueue: {\n name: 'AtomicQueue',\n abi: {\n [ChainType.MoveVM]: AtomicQueueAptosABI,\n [ChainType.EVM]: AtomicQueueABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n get_minimum_request_age:\n '{address}::atomic_queue::get_minimum_request_age',\n get_all_atomic_requests:\n '{address}::atomic_queue::get_all_atomic_requests',\n get_request_update_cooldown:\n '{address}::atomic_queue::get_request_update_cooldown',\n get_request_updated_at:\n '{address}::atomic_queue::get_request_updated_at',\n get_user_atomic_request:\n '{address}::atomic_queue::get_user_atomic_request',\n get_user_atomic_requests:\n '{address}::atomic_queue::get_user_atomic_requests',\n is_atomic_request_valid:\n '{address}::atomic_queue::is_atomic_request_valid',\n is_paused: '{address}::atomic_queue::is_paused',\n update_atomic_request: '{address}::atomic_queue::update_atomic_request',\n cancel_atomic_request: '{address}::atomic_queue::cancel_atomic_request',\n cancel_withdrawal_request:\n '{address}::atomic_queue::cancel_atomic_request',\n },\n [ChainType.EVM]: {\n get_minimum_request_age: 'getMinimumRequestAge',\n cancel_withdrawal_request: 'cancelWithdrawalRequest',\n reclaim_withdrawal_request: 'reclaimWithdrawalRequest',\n },\n },\n },\n vault: {\n name: 'Vault',\n abi: {\n [ChainType.MoveVM]: VaultAptosABI,\n [ChainType.EVM]: BoringVaultABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n get_vault_config: '{address}::vault::get_vault_config',\n get_total_assets: '{address}::vault::get_total_assets',\n get_total_shares: '{address}::vault::get_total_shares',\n },\n [ChainType.EVM]: {\n get_vault_config: 'getVaultConfig',\n get_total_assets: 'totalAssets',\n get_total_shares: 'totalShares',\n },\n },\n },\n};\n\n/**\n * Get function signature for a contract on a specific chain\n * @param type - The chain type (EVM or MoveVM)\n * @param contractName - The name of the contract\n * @param functionName - The name of the function\n * @param contractAddress - The address of the contract (required for MoveVM)\n */\nexport function getFunctionSignature(\n type: ChainType,\n contractName: string,\n functionName: string,\n contractAddress: string\n): string {\n const contract = CONTRACTS[contractName];\n if (!contract) {\n throw new Error(`Contract ${contractName} not found`);\n }\n\n const chainSignatures = contract.functionSignatures[type];\n if (!chainSignatures) {\n throw new Error(\n `Chain type ${type} not supported for contract ${contractName}`\n );\n }\n\n const signature = chainSignatures[functionName];\n if (!signature) {\n throw new Error(\n `Function ${functionName} not found in contract ${contractName}`\n );\n }\n\n return signature.replace('{address}', contractAddress);\n}\n\n/**\n * Get contract ABI for a specific chain type\n */\nexport function getContractABI(type: ChainType, contractName: string): any {\n const contract = CONTRACTS[contractName];\n if (!contract) {\n throw new Error(`Contract ${contractName} not found`);\n }\n\n const abi = contract.abi[type];\n if (!abi) {\n // Return empty array/null instead of error if ABI is missing,\n // as it might be acceptable for some chains/contracts initially.\n // However, adapter expects ABI to be present for encoding.\n console.warn(`ABI for ${contractName} on ${type} is missing`);\n return [];\n }\n return abi;\n}\n","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import {\n ApyDataPoint,\n BaseAnalyticsClient,\n ExchangeRateEvent,\n GetActivitiesArgs,\n HistoricalApyArgs,\n VaultActivity,\n VaultTvlArgs,\n} from '@pyxisjs/core';\nimport invariant from 'tiny-invariant';\n\n/**\n * PyxisAnalyticsAPI - Public interface for analytics operations\n */\nexport interface PyxisAnalyticsAPI {\n getActivities(\n args: GetActivitiesArgs\n ): Promise<{ activities: VaultActivity[]; total: number }>;\n getTvlInBaseAsset(args: VaultTvlArgs): Promise<string>;\n getUpdateExchangeRateEvents(\n args: HistoricalApyArgs\n ): Promise<ExchangeRateEvent[]>;\n get30DayApy(vault: string): Promise<string>;\n getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]>;\n}\n\n/**\n * PyxisAnalyticsClient - Multi-chain analytics client\n *\n * This client aggregates data from multiple chain-specific analytics clients.\n * Each method fetches data from all clients and combines the results.\n *\n * @example\n * ```typescript\n * const aptosClient = new AptosAnalyticsClient(baseAdapter, analyticsAdapter);\n * const evmClient = new EVMAnalyticsClient(evmAdapter); // future\n * const client = new PyxisAnalyticsClient([aptosClient, evmClient]);\n *\n * const activities = await client.getActivities({ vault: '0x...', page: 1 });\n * ```\n */\nexport class PyxisAnalyticsClient implements PyxisAnalyticsAPI {\n private clients: BaseAnalyticsClient[];\n\n constructor(clients: BaseAnalyticsClient[]) {\n invariant(clients.length > 0, 'At least one analytics client is required');\n this.clients = clients;\n }\n\n /**\n * Get vault activities with pagination from all clients\n * Aggregates activities from all clients\n */\n async getActivities(\n args: GetActivitiesArgs\n ): Promise<{ activities: VaultActivity[]; total: number }> {\n const results = await Promise.all(\n this.clients.map(client => client.getActivities(args))\n );\n\n // Aggregate all activities\n const allActivities = results.flatMap(r => r.activities);\n const totalCount = results.reduce((sum, r) => sum + r.total, 0);\n\n // Apply pagination to aggregated results\n const pageSize = args.pageSize ?? 10;\n const page = args.page ?? 1;\n const start = (page - 1) * pageSize;\n const paginatedActivities = allActivities.slice(start, start + pageSize);\n\n return {\n activities: paginatedActivities,\n total: totalCount,\n };\n }\n\n /**\n * Get total value locked in base asset from all clients\n * Returns the sum of TVL from all clients\n */\n async getTvlInBaseAsset(args: VaultTvlArgs): Promise<string> {\n const results = await Promise.all(\n this.clients.map(client => client.getTvlInBaseAsset(args))\n );\n\n // Sum all TVL values\n const totalTvl = results.reduce((sum, tvl) => sum + BigInt(tvl), BigInt(0));\n\n return totalTvl.toString();\n }\n\n /**\n * Get exchange rate update events from all clients\n * Aggregates and sorts events by timestamp\n */\n async getUpdateExchangeRateEvents(\n args: HistoricalApyArgs\n ): Promise<ExchangeRateEvent[]> {\n const results = await Promise.all(\n this.clients.map(client => client.getUpdateExchangeRateEvents(args))\n );\n\n // Aggregate all events\n const allEvents = results.flat();\n\n // Sort by timestamp ascending\n allEvents.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));\n\n return allEvents;\n }\n\n /**\n * Get 30-day APY for a vault\n * Returns the average APY across all clients\n */\n async get30DayApy(vault: string): Promise<string> {\n const results = await Promise.all(\n this.clients.map(client => client.get30DayApy(vault))\n );\n\n // Filter out zero APY values\n const validApys = results.filter(apy => apy !== '0');\n\n if (validApys.length === 0) {\n return '0';\n }\n\n // Calculate average APY\n const totalApy = validApys.reduce((sum, apy) => sum + parseFloat(apy), 0);\n\n return (totalApy / validApys.length).toString();\n }\n\n /**\n * Get historical APY data points from all clients\n * Aggregates data points and averages values for matching timestamps\n */\n async getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]> {\n const results = await Promise.all(\n this.clients.map(client => client.getHistoricalApy(args))\n );\n\n // Aggregate all data points\n const allDataPoints = results.flat();\n\n // Group by timestamp and calculate average\n const timestampMap = new Map<string, number[]>();\n for (const point of allDataPoints) {\n const values = timestampMap.get(point.timestamp) || [];\n values.push(parseFloat(point.value));\n timestampMap.set(point.timestamp, values);\n }\n\n // Calculate average for each timestamp\n const aggregatedData: ApyDataPoint[] = [];\n for (const [timestamp, values] of timestampMap) {\n const avgValue = values.reduce((a, b) => a + b, 0) / values.length;\n aggregatedData.push({\n timestamp,\n value: avgValue.toString(),\n });\n }\n\n // Sort by timestamp ascending\n aggregatedData.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));\n\n return aggregatedData;\n }\n}\n"],"mappings":"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","names":["import_core"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
// src/vault-client.ts
|
|
2
|
+
import {
|
|
3
|
+
getChainConfig
|
|
4
|
+
} from "@pyxisjs/core";
|
|
5
|
+
import {
|
|
6
|
+
PyxisUtils
|
|
7
|
+
} from "@pyxisjs/core";
|
|
8
|
+
|
|
9
|
+
// src/constants.ts
|
|
10
|
+
import {
|
|
11
|
+
AccountantAptosABI,
|
|
12
|
+
AtomicQueueAptosABI,
|
|
13
|
+
TellerAptosABI,
|
|
14
|
+
VaultAptosABI,
|
|
15
|
+
AccountantABI,
|
|
16
|
+
AtomicQueueABI,
|
|
17
|
+
BoringVaultABI,
|
|
18
|
+
TellerWithMultiAssetSupportABI
|
|
19
|
+
} from "@pyxisjs/chains";
|
|
20
|
+
import { ChainType } from "@pyxisjs/core";
|
|
21
|
+
var CONTRACTS = {
|
|
22
|
+
accountant: {
|
|
23
|
+
name: "Accountant",
|
|
24
|
+
abi: {
|
|
25
|
+
[ChainType.MoveVM]: AccountantAptosABI,
|
|
26
|
+
[ChainType.EVM]: AccountantABI
|
|
27
|
+
},
|
|
28
|
+
functionSignatures: {
|
|
29
|
+
[ChainType.MoveVM]: {
|
|
30
|
+
calculate_shares_from_assets_safe: "{address}::accountant::calculate_shares_from_assets_safe",
|
|
31
|
+
calculate_assets_from_shares_safe: "{address}::accountant::calculate_assets_from_shares_safe",
|
|
32
|
+
get_withdraw_rate_in_quote_safe: "{address}::accountant::get_withdraw_rate_in_quote_safe",
|
|
33
|
+
get_deposit_rate_in_quote_safe: "{address}::accountant::get_deposit_rate_in_quote_safe"
|
|
34
|
+
},
|
|
35
|
+
[ChainType.EVM]: {
|
|
36
|
+
calculate_shares_from_assets_safe: "calculateSharesFromAssetsSafe",
|
|
37
|
+
calculate_assets_from_shares_safe: "calculateAssetsFromSharesSafe",
|
|
38
|
+
get_withdraw_rate_in_quote_safe: "getWithdrawRateInQuoteSafe",
|
|
39
|
+
get_deposit_rate_in_quote_safe: "getDepositRateInQuoteSafe"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
teller: {
|
|
44
|
+
name: "Teller",
|
|
45
|
+
abi: {
|
|
46
|
+
[ChainType.MoveVM]: TellerAptosABI,
|
|
47
|
+
[ChainType.EVM]: TellerWithMultiAssetSupportABI
|
|
48
|
+
},
|
|
49
|
+
functionSignatures: {
|
|
50
|
+
[ChainType.MoveVM]: {
|
|
51
|
+
deposit: "{address}::teller::deposit",
|
|
52
|
+
deposit_with_referral: "{address}::teller::deposit_with_referral",
|
|
53
|
+
deposit_for: "{address}::teller::deposit_for",
|
|
54
|
+
mint_shares: "{address}::teller::mint_shares",
|
|
55
|
+
create_withdrawal_request: "{address}::teller::create_withdrawal_request"
|
|
56
|
+
},
|
|
57
|
+
[ChainType.EVM]: {
|
|
58
|
+
deposit: "deposit",
|
|
59
|
+
deposit_with_referral: "depositWithReferral",
|
|
60
|
+
deposit_for: "depositFor",
|
|
61
|
+
mint_shares: "mintShares",
|
|
62
|
+
create_withdrawal_request: "createWithdrawalRequest"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
atomicQueue: {
|
|
67
|
+
name: "AtomicQueue",
|
|
68
|
+
abi: {
|
|
69
|
+
[ChainType.MoveVM]: AtomicQueueAptosABI,
|
|
70
|
+
[ChainType.EVM]: AtomicQueueABI
|
|
71
|
+
},
|
|
72
|
+
functionSignatures: {
|
|
73
|
+
[ChainType.MoveVM]: {
|
|
74
|
+
get_minimum_request_age: "{address}::atomic_queue::get_minimum_request_age",
|
|
75
|
+
get_all_atomic_requests: "{address}::atomic_queue::get_all_atomic_requests",
|
|
76
|
+
get_request_update_cooldown: "{address}::atomic_queue::get_request_update_cooldown",
|
|
77
|
+
get_request_updated_at: "{address}::atomic_queue::get_request_updated_at",
|
|
78
|
+
get_user_atomic_request: "{address}::atomic_queue::get_user_atomic_request",
|
|
79
|
+
get_user_atomic_requests: "{address}::atomic_queue::get_user_atomic_requests",
|
|
80
|
+
is_atomic_request_valid: "{address}::atomic_queue::is_atomic_request_valid",
|
|
81
|
+
is_paused: "{address}::atomic_queue::is_paused",
|
|
82
|
+
update_atomic_request: "{address}::atomic_queue::update_atomic_request",
|
|
83
|
+
cancel_atomic_request: "{address}::atomic_queue::cancel_atomic_request",
|
|
84
|
+
cancel_withdrawal_request: "{address}::atomic_queue::cancel_atomic_request"
|
|
85
|
+
},
|
|
86
|
+
[ChainType.EVM]: {
|
|
87
|
+
get_minimum_request_age: "getMinimumRequestAge",
|
|
88
|
+
cancel_withdrawal_request: "cancelWithdrawalRequest",
|
|
89
|
+
reclaim_withdrawal_request: "reclaimWithdrawalRequest"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
vault: {
|
|
94
|
+
name: "Vault",
|
|
95
|
+
abi: {
|
|
96
|
+
[ChainType.MoveVM]: VaultAptosABI,
|
|
97
|
+
[ChainType.EVM]: BoringVaultABI
|
|
98
|
+
},
|
|
99
|
+
functionSignatures: {
|
|
100
|
+
[ChainType.MoveVM]: {
|
|
101
|
+
get_vault_config: "{address}::vault::get_vault_config",
|
|
102
|
+
get_total_assets: "{address}::vault::get_total_assets",
|
|
103
|
+
get_total_shares: "{address}::vault::get_total_shares"
|
|
104
|
+
},
|
|
105
|
+
[ChainType.EVM]: {
|
|
106
|
+
get_vault_config: "getVaultConfig",
|
|
107
|
+
get_total_assets: "totalAssets",
|
|
108
|
+
get_total_shares: "totalShares"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
function getFunctionSignature(type, contractName, functionName, contractAddress) {
|
|
114
|
+
const contract = CONTRACTS[contractName];
|
|
115
|
+
if (!contract) {
|
|
116
|
+
throw new Error(`Contract ${contractName} not found`);
|
|
117
|
+
}
|
|
118
|
+
const chainSignatures = contract.functionSignatures[type];
|
|
119
|
+
if (!chainSignatures) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
`Chain type ${type} not supported for contract ${contractName}`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
const signature = chainSignatures[functionName];
|
|
125
|
+
if (!signature) {
|
|
126
|
+
throw new Error(
|
|
127
|
+
`Function ${functionName} not found in contract ${contractName}`
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
return signature.replace("{address}", contractAddress);
|
|
131
|
+
}
|
|
132
|
+
function getContractABI(type, contractName) {
|
|
133
|
+
const contract = CONTRACTS[contractName];
|
|
134
|
+
if (!contract) {
|
|
135
|
+
throw new Error(`Contract ${contractName} not found`);
|
|
136
|
+
}
|
|
137
|
+
const abi = contract.abi[type];
|
|
138
|
+
if (!abi) {
|
|
139
|
+
console.warn(`ABI for ${contractName} on ${type} is missing`);
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
return abi;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// src/vault-client.ts
|
|
146
|
+
var MultiChainVaultClient = class {
|
|
147
|
+
constructor(adapter) {
|
|
148
|
+
this.adapter = adapter;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get function signature using the new configuration system
|
|
152
|
+
*/
|
|
153
|
+
getFunctionSignature(contractName, functionName) {
|
|
154
|
+
const config = getChainConfig(this.adapter.chain.id);
|
|
155
|
+
const contractAddress = this.adapter.getContractAddress(contractName);
|
|
156
|
+
return getFunctionSignature(
|
|
157
|
+
config.type,
|
|
158
|
+
contractName,
|
|
159
|
+
functionName,
|
|
160
|
+
contractAddress
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
async getWithdrawRateInQuoteSafe(args) {
|
|
164
|
+
const functionSignature = this.getFunctionSignature(
|
|
165
|
+
"accountant",
|
|
166
|
+
"get_withdraw_rate_in_quote_safe"
|
|
167
|
+
);
|
|
168
|
+
const result = await this.adapter.viewContract({
|
|
169
|
+
function: functionSignature,
|
|
170
|
+
arguments: [args.vault, args.quoteAsset]
|
|
171
|
+
});
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
async getDepositRateInQuoteSafe(args) {
|
|
175
|
+
const functionSignature = this.getFunctionSignature(
|
|
176
|
+
"accountant",
|
|
177
|
+
"get_deposit_rate_in_quote_safe"
|
|
178
|
+
);
|
|
179
|
+
const result = await this.adapter.viewContract({
|
|
180
|
+
function: functionSignature,
|
|
181
|
+
arguments: [args.vault, args.quoteAsset]
|
|
182
|
+
});
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
async quoteDeposit({
|
|
186
|
+
vault,
|
|
187
|
+
asset,
|
|
188
|
+
amount
|
|
189
|
+
}) {
|
|
190
|
+
const functionSignature = this.getFunctionSignature(
|
|
191
|
+
"accountant",
|
|
192
|
+
"calculate_shares_from_assets_safe"
|
|
193
|
+
);
|
|
194
|
+
const result = await this.adapter.viewContract({
|
|
195
|
+
function: functionSignature,
|
|
196
|
+
arguments: [vault, asset, amount]
|
|
197
|
+
});
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
async quoteWithdraw({
|
|
201
|
+
vault,
|
|
202
|
+
amount,
|
|
203
|
+
wantAsset
|
|
204
|
+
}) {
|
|
205
|
+
const functionSignature = this.getFunctionSignature(
|
|
206
|
+
"accountant",
|
|
207
|
+
"calculate_assets_from_shares_safe"
|
|
208
|
+
);
|
|
209
|
+
const result = await this.adapter.viewContract({
|
|
210
|
+
function: functionSignature,
|
|
211
|
+
arguments: [vault, wantAsset, amount]
|
|
212
|
+
});
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
async buildDepositTx(args) {
|
|
216
|
+
const functionSignature = this.getFunctionSignature("teller", "deposit");
|
|
217
|
+
return await this.adapter.buildPayload({
|
|
218
|
+
function: functionSignature,
|
|
219
|
+
arguments: [args.vault, args.asset, args.amount, args.minimumMint]
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
async buildWithdrawTx(args) {
|
|
223
|
+
const functionSignature = this.getFunctionSignature(
|
|
224
|
+
"atomicQueue",
|
|
225
|
+
"update_atomic_request"
|
|
226
|
+
);
|
|
227
|
+
return await this.adapter.buildPayload({
|
|
228
|
+
function: functionSignature,
|
|
229
|
+
arguments: [
|
|
230
|
+
args.vault,
|
|
231
|
+
args.offerAsset,
|
|
232
|
+
args.wantAsset,
|
|
233
|
+
args.offerAmount,
|
|
234
|
+
args.price,
|
|
235
|
+
args.deadline
|
|
236
|
+
]
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
async buildReclaimWithdrawalRequestTx(args) {
|
|
240
|
+
const functionSignature = this.getFunctionSignature(
|
|
241
|
+
"atomicQueue",
|
|
242
|
+
"cancel_atomic_request"
|
|
243
|
+
);
|
|
244
|
+
return await this.adapter.buildPayload({
|
|
245
|
+
function: functionSignature,
|
|
246
|
+
arguments: [args.vault, args.offerAsset, args.wantAsset]
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
async buildCancelWithdrawalRequestTx(args) {
|
|
250
|
+
const functionSignature = this.getFunctionSignature(
|
|
251
|
+
"atomicQueue",
|
|
252
|
+
"cancel_withdrawal_request"
|
|
253
|
+
);
|
|
254
|
+
return await this.adapter.buildPayload({
|
|
255
|
+
function: functionSignature,
|
|
256
|
+
arguments: [args.vault, args.offerAsset, args.wantAsset]
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
async getMinimumRequestAge(args) {
|
|
260
|
+
const functionSignature = this.getFunctionSignature(
|
|
261
|
+
"atomicQueue",
|
|
262
|
+
"get_minimum_request_age"
|
|
263
|
+
);
|
|
264
|
+
const result = await this.adapter.viewContract({
|
|
265
|
+
function: functionSignature,
|
|
266
|
+
arguments: [args.vault]
|
|
267
|
+
});
|
|
268
|
+
return Number(result);
|
|
269
|
+
}
|
|
270
|
+
async getUserWithdrawalRequests({
|
|
271
|
+
flag,
|
|
272
|
+
userAddress,
|
|
273
|
+
vault,
|
|
274
|
+
matchAll = true
|
|
275
|
+
}) {
|
|
276
|
+
const requestFlag = PyxisUtils.buildRequestFlags(flag);
|
|
277
|
+
const getUserRequestsFn = this.getFunctionSignature(
|
|
278
|
+
"atomicQueue",
|
|
279
|
+
"get_user_atomic_requests"
|
|
280
|
+
);
|
|
281
|
+
const withdrawalRequests = await this.adapter.viewContract({
|
|
282
|
+
function: getUserRequestsFn,
|
|
283
|
+
arguments: [vault, userAddress, requestFlag, matchAll]
|
|
284
|
+
});
|
|
285
|
+
const getUpdatedAtFn = this.getFunctionSignature(
|
|
286
|
+
"atomicQueue",
|
|
287
|
+
"get_request_updated_at"
|
|
288
|
+
);
|
|
289
|
+
const updatedAtResults = await Promise.allSettled(
|
|
290
|
+
withdrawalRequests.map(
|
|
291
|
+
(request) => this.adapter.viewContract({
|
|
292
|
+
function: getUpdatedAtFn,
|
|
293
|
+
arguments: [
|
|
294
|
+
vault,
|
|
295
|
+
userAddress,
|
|
296
|
+
request.offer_token.inner,
|
|
297
|
+
request.want_token.inner
|
|
298
|
+
]
|
|
299
|
+
})
|
|
300
|
+
)
|
|
301
|
+
);
|
|
302
|
+
return withdrawalRequests.map(
|
|
303
|
+
(request, index) => {
|
|
304
|
+
const result = updatedAtResults[index];
|
|
305
|
+
let updatedAt;
|
|
306
|
+
if (result.status === "fulfilled") {
|
|
307
|
+
updatedAt = result.value;
|
|
308
|
+
}
|
|
309
|
+
return PyxisUtils.mapOnchainToWithdrawalRequest(request, updatedAt);
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
// ../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js
|
|
316
|
+
var isProduction = process.env.NODE_ENV === "production";
|
|
317
|
+
var prefix = "Invariant failed";
|
|
318
|
+
function invariant(condition, message) {
|
|
319
|
+
if (condition) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (isProduction) {
|
|
323
|
+
throw new Error(prefix);
|
|
324
|
+
}
|
|
325
|
+
var provided = typeof message === "function" ? message() : message;
|
|
326
|
+
var value = provided ? "".concat(prefix, ": ").concat(provided) : prefix;
|
|
327
|
+
throw new Error(value);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// src/analytics-client.ts
|
|
331
|
+
var PyxisAnalyticsClient = class {
|
|
332
|
+
constructor(clients) {
|
|
333
|
+
invariant(clients.length > 0, "At least one analytics client is required");
|
|
334
|
+
this.clients = clients;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get vault activities with pagination from all clients
|
|
338
|
+
* Aggregates activities from all clients
|
|
339
|
+
*/
|
|
340
|
+
async getActivities(args) {
|
|
341
|
+
const results = await Promise.all(
|
|
342
|
+
this.clients.map((client) => client.getActivities(args))
|
|
343
|
+
);
|
|
344
|
+
const allActivities = results.flatMap((r) => r.activities);
|
|
345
|
+
const totalCount = results.reduce((sum, r) => sum + r.total, 0);
|
|
346
|
+
const pageSize = args.pageSize ?? 10;
|
|
347
|
+
const page = args.page ?? 1;
|
|
348
|
+
const start = (page - 1) * pageSize;
|
|
349
|
+
const paginatedActivities = allActivities.slice(start, start + pageSize);
|
|
350
|
+
return {
|
|
351
|
+
activities: paginatedActivities,
|
|
352
|
+
total: totalCount
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Get total value locked in base asset from all clients
|
|
357
|
+
* Returns the sum of TVL from all clients
|
|
358
|
+
*/
|
|
359
|
+
async getTvlInBaseAsset(args) {
|
|
360
|
+
const results = await Promise.all(
|
|
361
|
+
this.clients.map((client) => client.getTvlInBaseAsset(args))
|
|
362
|
+
);
|
|
363
|
+
const totalTvl = results.reduce((sum, tvl) => sum + BigInt(tvl), BigInt(0));
|
|
364
|
+
return totalTvl.toString();
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get exchange rate update events from all clients
|
|
368
|
+
* Aggregates and sorts events by timestamp
|
|
369
|
+
*/
|
|
370
|
+
async getUpdateExchangeRateEvents(args) {
|
|
371
|
+
const results = await Promise.all(
|
|
372
|
+
this.clients.map((client) => client.getUpdateExchangeRateEvents(args))
|
|
373
|
+
);
|
|
374
|
+
const allEvents = results.flat();
|
|
375
|
+
allEvents.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));
|
|
376
|
+
return allEvents;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Get 30-day APY for a vault
|
|
380
|
+
* Returns the average APY across all clients
|
|
381
|
+
*/
|
|
382
|
+
async get30DayApy(vault) {
|
|
383
|
+
const results = await Promise.all(
|
|
384
|
+
this.clients.map((client) => client.get30DayApy(vault))
|
|
385
|
+
);
|
|
386
|
+
const validApys = results.filter((apy) => apy !== "0");
|
|
387
|
+
if (validApys.length === 0) {
|
|
388
|
+
return "0";
|
|
389
|
+
}
|
|
390
|
+
const totalApy = validApys.reduce((sum, apy) => sum + parseFloat(apy), 0);
|
|
391
|
+
return (totalApy / validApys.length).toString();
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Get historical APY data points from all clients
|
|
395
|
+
* Aggregates data points and averages values for matching timestamps
|
|
396
|
+
*/
|
|
397
|
+
async getHistoricalApy(args) {
|
|
398
|
+
const results = await Promise.all(
|
|
399
|
+
this.clients.map((client) => client.getHistoricalApy(args))
|
|
400
|
+
);
|
|
401
|
+
const allDataPoints = results.flat();
|
|
402
|
+
const timestampMap = /* @__PURE__ */ new Map();
|
|
403
|
+
for (const point of allDataPoints) {
|
|
404
|
+
const values = timestampMap.get(point.timestamp) || [];
|
|
405
|
+
values.push(parseFloat(point.value));
|
|
406
|
+
timestampMap.set(point.timestamp, values);
|
|
407
|
+
}
|
|
408
|
+
const aggregatedData = [];
|
|
409
|
+
for (const [timestamp, values] of timestampMap) {
|
|
410
|
+
const avgValue = values.reduce((a, b) => a + b, 0) / values.length;
|
|
411
|
+
aggregatedData.push({
|
|
412
|
+
timestamp,
|
|
413
|
+
value: avgValue.toString()
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
aggregatedData.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));
|
|
417
|
+
return aggregatedData;
|
|
418
|
+
}
|
|
419
|
+
};
|
|
420
|
+
export {
|
|
421
|
+
CONTRACTS,
|
|
422
|
+
MultiChainVaultClient,
|
|
423
|
+
PyxisAnalyticsClient,
|
|
424
|
+
getContractABI,
|
|
425
|
+
getFunctionSignature
|
|
426
|
+
};
|
|
427
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vault-client.ts","../src/constants.ts","../../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../src/analytics-client.ts"],"sourcesContent":["/**\n * Chain-agnostic Vault API implementation\n */\n\nimport {\n BaseChainAdapter,\n getChainConfig,\n TransactionPayload,\n} from '@pyxisjs/core';\nimport {\n BuildCancelWithdrawalRequestTxArgs,\n BuildDepositTxArgs,\n BuildReclaimWithdrawalRequestTxArgs,\n BuildWithdrawTxArgs,\n GetDepositRateInQuoteSafeArgs,\n GetMinimumRequestAgeArgs,\n GetWithdrawalRequestsOfUserArgs,\n GetWithdrawRateInQuoteSafeArgs,\n PyxisOnchainWithdrawalRequest,\n PyxisWithdrawalRequest,\n PyxisUtils,\n QuoteDepositArgs,\n QuoteWithdrawArgs,\n} from '@pyxisjs/core';\n\nimport { getFunctionSignature } from './constants';\n\nexport interface MultiChainVaultAPI {\n quoteDeposit(args: QuoteDepositArgs): Promise<string>;\n quoteWithdraw(args: QuoteWithdrawArgs): Promise<string>;\n getDepositRateInQuoteSafe(\n args: GetDepositRateInQuoteSafeArgs\n ): Promise<string>;\n getWithdrawRateInQuoteSafe(\n args: GetWithdrawRateInQuoteSafeArgs\n ): Promise<string>;\n buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload>;\n buildWithdrawTx(args: BuildWithdrawTxArgs): Promise<TransactionPayload>;\n buildReclaimWithdrawalRequestTx(\n args: BuildReclaimWithdrawalRequestTxArgs\n ): Promise<TransactionPayload>;\n buildCancelWithdrawalRequestTx(\n args: BuildCancelWithdrawalRequestTxArgs\n ): Promise<TransactionPayload>;\n getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number>;\n getUserWithdrawalRequests(\n args: GetWithdrawalRequestsOfUserArgs\n ): Promise<PyxisWithdrawalRequest[]>;\n}\n\nexport class MultiChainVaultClient implements MultiChainVaultAPI {\n constructor(private adapter: BaseChainAdapter<any>) {}\n\n /**\n * Get function signature using the new configuration system\n */\n private getFunctionSignature(\n contractName: 'accountant' | 'teller' | 'atomicQueue',\n functionName: string\n ): string {\n const config = getChainConfig(this.adapter.chain.id);\n const contractAddress = this.adapter.getContractAddress(contractName);\n return getFunctionSignature(\n config.type,\n contractName,\n functionName,\n contractAddress\n );\n }\n\n async getWithdrawRateInQuoteSafe(\n args: GetWithdrawRateInQuoteSafeArgs\n ): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'get_withdraw_rate_in_quote_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [args.vault, args.quoteAsset],\n });\n\n return result;\n }\n\n async getDepositRateInQuoteSafe(\n args: GetDepositRateInQuoteSafeArgs\n ): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'get_deposit_rate_in_quote_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [args.vault, args.quoteAsset],\n });\n\n return result;\n }\n\n async quoteDeposit({\n vault,\n asset,\n amount,\n }: QuoteDepositArgs): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'calculate_shares_from_assets_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [vault, asset, amount],\n });\n\n return result;\n }\n\n async quoteWithdraw({\n vault,\n amount,\n wantAsset,\n }: QuoteWithdrawArgs): Promise<string> {\n const functionSignature = this.getFunctionSignature(\n 'accountant',\n 'calculate_assets_from_shares_safe'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [vault, wantAsset, amount],\n });\n\n return result;\n }\n\n async buildDepositTx(args: BuildDepositTxArgs): Promise<TransactionPayload> {\n const functionSignature = this.getFunctionSignature('teller', 'deposit');\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [args.vault, args.asset, args.amount, args.minimumMint],\n });\n }\n\n async buildWithdrawTx(\n args: BuildWithdrawTxArgs\n ): Promise<TransactionPayload> {\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'update_atomic_request'\n );\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [\n args.vault,\n args.offerAsset,\n args.wantAsset,\n args.offerAmount,\n args.price,\n args.deadline,\n ],\n });\n }\n\n async buildReclaimWithdrawalRequestTx(\n args: BuildReclaimWithdrawalRequestTxArgs\n ): Promise<TransactionPayload> {\n // Call cancel_atomic_request to reclaim the request\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'cancel_atomic_request'\n );\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [args.vault, args.offerAsset, args.wantAsset],\n });\n }\n\n async buildCancelWithdrawalRequestTx(\n args: BuildCancelWithdrawalRequestTxArgs\n ): Promise<TransactionPayload> {\n // Update amount to 0 to cancel the request\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'cancel_withdrawal_request'\n );\n\n return await this.adapter.buildPayload({\n function: functionSignature,\n arguments: [args.vault, args.offerAsset, args.wantAsset],\n });\n }\n\n async getMinimumRequestAge(args: GetMinimumRequestAgeArgs): Promise<number> {\n const functionSignature = this.getFunctionSignature(\n 'atomicQueue',\n 'get_minimum_request_age'\n );\n\n const result = await this.adapter.viewContract<string>({\n function: functionSignature,\n arguments: [args.vault],\n });\n\n return Number(result);\n }\n\n async getUserWithdrawalRequests({\n flag,\n userAddress,\n vault,\n matchAll = true,\n }: GetWithdrawalRequestsOfUserArgs): Promise<PyxisWithdrawalRequest[]> {\n const requestFlag = PyxisUtils.buildRequestFlags(flag);\n\n // Get user atomic requests\n const getUserRequestsFn = this.getFunctionSignature(\n 'atomicQueue',\n 'get_user_atomic_requests'\n );\n\n const withdrawalRequests: PyxisOnchainWithdrawalRequest[] =\n await this.adapter.viewContract<PyxisOnchainWithdrawalRequest[]>({\n function: getUserRequestsFn,\n arguments: [vault, userAddress, requestFlag, matchAll],\n });\n\n // Fetch updatedAt for each withdrawal request in parallel\n const getUpdatedAtFn = this.getFunctionSignature(\n 'atomicQueue',\n 'get_request_updated_at'\n );\n\n const updatedAtResults = await Promise.allSettled(\n withdrawalRequests.map((request: PyxisOnchainWithdrawalRequest) =>\n this.adapter.viewContract<string>({\n function: getUpdatedAtFn,\n arguments: [\n vault,\n userAddress,\n request.offer_token.inner,\n request.want_token.inner,\n ],\n })\n )\n );\n\n // Map withdrawal requests with enriched updatedAt data\n return withdrawalRequests.map(\n (request: PyxisOnchainWithdrawalRequest, index: number) => {\n const result = updatedAtResults[index];\n let updatedAt: string | undefined;\n\n if (result.status === 'fulfilled') {\n updatedAt = result.value as string;\n }\n\n return PyxisUtils.mapOnchainToWithdrawalRequest(request, updatedAt);\n }\n );\n }\n}\n","import {\n AccountantAptosABI,\n AtomicQueueAptosABI,\n TellerAptosABI,\n VaultAptosABI,\n AccountantABI,\n AtomicQueueABI,\n BoringVaultABI,\n TellerWithMultiAssetSupportABI,\n} from '@pyxisjs/chains';\nimport { ChainType } from '@pyxisjs/core';\n\nexport interface ContractConfig {\n name: string;\n abi: Record<ChainType, any>;\n functionSignatures: Partial<\n Record<ChainType, Partial<Record<string, string>>>\n >;\n}\n\nexport interface ContractsConfig {\n [key: string]: ContractConfig;\n}\n\n/**\n * Contract configurations with real addresses and ABIs\n */\nexport const CONTRACTS: Record<string, ContractConfig> = {\n accountant: {\n name: 'Accountant',\n abi: {\n [ChainType.MoveVM]: AccountantAptosABI,\n [ChainType.EVM]: AccountantABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n calculate_shares_from_assets_safe:\n '{address}::accountant::calculate_shares_from_assets_safe',\n calculate_assets_from_shares_safe:\n '{address}::accountant::calculate_assets_from_shares_safe',\n get_withdraw_rate_in_quote_safe:\n '{address}::accountant::get_withdraw_rate_in_quote_safe',\n get_deposit_rate_in_quote_safe:\n '{address}::accountant::get_deposit_rate_in_quote_safe',\n },\n [ChainType.EVM]: {\n calculate_shares_from_assets_safe: 'calculateSharesFromAssetsSafe',\n calculate_assets_from_shares_safe: 'calculateAssetsFromSharesSafe',\n get_withdraw_rate_in_quote_safe: 'getWithdrawRateInQuoteSafe',\n get_deposit_rate_in_quote_safe: 'getDepositRateInQuoteSafe',\n },\n },\n },\n teller: {\n name: 'Teller',\n abi: {\n [ChainType.MoveVM]: TellerAptosABI,\n [ChainType.EVM]: TellerWithMultiAssetSupportABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n deposit: '{address}::teller::deposit',\n deposit_with_referral: '{address}::teller::deposit_with_referral',\n deposit_for: '{address}::teller::deposit_for',\n mint_shares: '{address}::teller::mint_shares',\n create_withdrawal_request:\n '{address}::teller::create_withdrawal_request',\n },\n [ChainType.EVM]: {\n deposit: 'deposit',\n deposit_with_referral: 'depositWithReferral',\n deposit_for: 'depositFor',\n mint_shares: 'mintShares',\n create_withdrawal_request: 'createWithdrawalRequest',\n },\n },\n },\n atomicQueue: {\n name: 'AtomicQueue',\n abi: {\n [ChainType.MoveVM]: AtomicQueueAptosABI,\n [ChainType.EVM]: AtomicQueueABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n get_minimum_request_age:\n '{address}::atomic_queue::get_minimum_request_age',\n get_all_atomic_requests:\n '{address}::atomic_queue::get_all_atomic_requests',\n get_request_update_cooldown:\n '{address}::atomic_queue::get_request_update_cooldown',\n get_request_updated_at:\n '{address}::atomic_queue::get_request_updated_at',\n get_user_atomic_request:\n '{address}::atomic_queue::get_user_atomic_request',\n get_user_atomic_requests:\n '{address}::atomic_queue::get_user_atomic_requests',\n is_atomic_request_valid:\n '{address}::atomic_queue::is_atomic_request_valid',\n is_paused: '{address}::atomic_queue::is_paused',\n update_atomic_request: '{address}::atomic_queue::update_atomic_request',\n cancel_atomic_request: '{address}::atomic_queue::cancel_atomic_request',\n cancel_withdrawal_request:\n '{address}::atomic_queue::cancel_atomic_request',\n },\n [ChainType.EVM]: {\n get_minimum_request_age: 'getMinimumRequestAge',\n cancel_withdrawal_request: 'cancelWithdrawalRequest',\n reclaim_withdrawal_request: 'reclaimWithdrawalRequest',\n },\n },\n },\n vault: {\n name: 'Vault',\n abi: {\n [ChainType.MoveVM]: VaultAptosABI,\n [ChainType.EVM]: BoringVaultABI,\n },\n functionSignatures: {\n [ChainType.MoveVM]: {\n get_vault_config: '{address}::vault::get_vault_config',\n get_total_assets: '{address}::vault::get_total_assets',\n get_total_shares: '{address}::vault::get_total_shares',\n },\n [ChainType.EVM]: {\n get_vault_config: 'getVaultConfig',\n get_total_assets: 'totalAssets',\n get_total_shares: 'totalShares',\n },\n },\n },\n};\n\n/**\n * Get function signature for a contract on a specific chain\n * @param type - The chain type (EVM or MoveVM)\n * @param contractName - The name of the contract\n * @param functionName - The name of the function\n * @param contractAddress - The address of the contract (required for MoveVM)\n */\nexport function getFunctionSignature(\n type: ChainType,\n contractName: string,\n functionName: string,\n contractAddress: string\n): string {\n const contract = CONTRACTS[contractName];\n if (!contract) {\n throw new Error(`Contract ${contractName} not found`);\n }\n\n const chainSignatures = contract.functionSignatures[type];\n if (!chainSignatures) {\n throw new Error(\n `Chain type ${type} not supported for contract ${contractName}`\n );\n }\n\n const signature = chainSignatures[functionName];\n if (!signature) {\n throw new Error(\n `Function ${functionName} not found in contract ${contractName}`\n );\n }\n\n return signature.replace('{address}', contractAddress);\n}\n\n/**\n * Get contract ABI for a specific chain type\n */\nexport function getContractABI(type: ChainType, contractName: string): any {\n const contract = CONTRACTS[contractName];\n if (!contract) {\n throw new Error(`Contract ${contractName} not found`);\n }\n\n const abi = contract.abi[type];\n if (!abi) {\n // Return empty array/null instead of error if ABI is missing,\n // as it might be acceptable for some chains/contracts initially.\n // However, adapter expects ABI to be present for encoding.\n console.warn(`ABI for ${contractName} on ${type} is missing`);\n return [];\n }\n return abi;\n}\n","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import {\n ApyDataPoint,\n BaseAnalyticsClient,\n ExchangeRateEvent,\n GetActivitiesArgs,\n HistoricalApyArgs,\n VaultActivity,\n VaultTvlArgs,\n} from '@pyxisjs/core';\nimport invariant from 'tiny-invariant';\n\n/**\n * PyxisAnalyticsAPI - Public interface for analytics operations\n */\nexport interface PyxisAnalyticsAPI {\n getActivities(\n args: GetActivitiesArgs\n ): Promise<{ activities: VaultActivity[]; total: number }>;\n getTvlInBaseAsset(args: VaultTvlArgs): Promise<string>;\n getUpdateExchangeRateEvents(\n args: HistoricalApyArgs\n ): Promise<ExchangeRateEvent[]>;\n get30DayApy(vault: string): Promise<string>;\n getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]>;\n}\n\n/**\n * PyxisAnalyticsClient - Multi-chain analytics client\n *\n * This client aggregates data from multiple chain-specific analytics clients.\n * Each method fetches data from all clients and combines the results.\n *\n * @example\n * ```typescript\n * const aptosClient = new AptosAnalyticsClient(baseAdapter, analyticsAdapter);\n * const evmClient = new EVMAnalyticsClient(evmAdapter); // future\n * const client = new PyxisAnalyticsClient([aptosClient, evmClient]);\n *\n * const activities = await client.getActivities({ vault: '0x...', page: 1 });\n * ```\n */\nexport class PyxisAnalyticsClient implements PyxisAnalyticsAPI {\n private clients: BaseAnalyticsClient[];\n\n constructor(clients: BaseAnalyticsClient[]) {\n invariant(clients.length > 0, 'At least one analytics client is required');\n this.clients = clients;\n }\n\n /**\n * Get vault activities with pagination from all clients\n * Aggregates activities from all clients\n */\n async getActivities(\n args: GetActivitiesArgs\n ): Promise<{ activities: VaultActivity[]; total: number }> {\n const results = await Promise.all(\n this.clients.map(client => client.getActivities(args))\n );\n\n // Aggregate all activities\n const allActivities = results.flatMap(r => r.activities);\n const totalCount = results.reduce((sum, r) => sum + r.total, 0);\n\n // Apply pagination to aggregated results\n const pageSize = args.pageSize ?? 10;\n const page = args.page ?? 1;\n const start = (page - 1) * pageSize;\n const paginatedActivities = allActivities.slice(start, start + pageSize);\n\n return {\n activities: paginatedActivities,\n total: totalCount,\n };\n }\n\n /**\n * Get total value locked in base asset from all clients\n * Returns the sum of TVL from all clients\n */\n async getTvlInBaseAsset(args: VaultTvlArgs): Promise<string> {\n const results = await Promise.all(\n this.clients.map(client => client.getTvlInBaseAsset(args))\n );\n\n // Sum all TVL values\n const totalTvl = results.reduce((sum, tvl) => sum + BigInt(tvl), BigInt(0));\n\n return totalTvl.toString();\n }\n\n /**\n * Get exchange rate update events from all clients\n * Aggregates and sorts events by timestamp\n */\n async getUpdateExchangeRateEvents(\n args: HistoricalApyArgs\n ): Promise<ExchangeRateEvent[]> {\n const results = await Promise.all(\n this.clients.map(client => client.getUpdateExchangeRateEvents(args))\n );\n\n // Aggregate all events\n const allEvents = results.flat();\n\n // Sort by timestamp ascending\n allEvents.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));\n\n return allEvents;\n }\n\n /**\n * Get 30-day APY for a vault\n * Returns the average APY across all clients\n */\n async get30DayApy(vault: string): Promise<string> {\n const results = await Promise.all(\n this.clients.map(client => client.get30DayApy(vault))\n );\n\n // Filter out zero APY values\n const validApys = results.filter(apy => apy !== '0');\n\n if (validApys.length === 0) {\n return '0';\n }\n\n // Calculate average APY\n const totalApy = validApys.reduce((sum, apy) => sum + parseFloat(apy), 0);\n\n return (totalApy / validApys.length).toString();\n }\n\n /**\n * Get historical APY data points from all clients\n * Aggregates data points and averages values for matching timestamps\n */\n async getHistoricalApy(args: HistoricalApyArgs): Promise<ApyDataPoint[]> {\n const results = await Promise.all(\n this.clients.map(client => client.getHistoricalApy(args))\n );\n\n // Aggregate all data points\n const allDataPoints = results.flat();\n\n // Group by timestamp and calculate average\n const timestampMap = new Map<string, number[]>();\n for (const point of allDataPoints) {\n const values = timestampMap.get(point.timestamp) || [];\n values.push(parseFloat(point.value));\n timestampMap.set(point.timestamp, values);\n }\n\n // Calculate average for each timestamp\n const aggregatedData: ApyDataPoint[] = [];\n for (const [timestamp, values] of timestampMap) {\n const avgValue = values.reduce((a, b) => a + b, 0) / values.length;\n aggregatedData.push({\n timestamp,\n value: avgValue.toString(),\n });\n }\n\n // Sort by timestamp ascending\n aggregatedData.sort((a, b) => Number(a.timestamp) - Number(b.timestamp));\n\n return aggregatedData;\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pyxisjs/client",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Pyxis SDK Client",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public",
|
|
8
|
+
"registry": "https://registry.npmjs.org/"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/pyxis/pyxis-sdk.git",
|
|
13
|
+
"directory": "packages/client"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/pyxis/pyxis-sdk/tree/main/packages/client#readme",
|
|
16
|
+
"bugs": {
|
|
17
|
+
"url": "https://github.com/pyxis/pyxis-sdk/issues"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"main": "dist/index.js",
|
|
23
|
+
"module": "dist/index.mjs",
|
|
24
|
+
"types": "dist/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"import": "./dist/index.mjs",
|
|
28
|
+
"require": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"dayjs": "^1.11.19",
|
|
34
|
+
"@pyxisjs/chains": "0.1.0",
|
|
35
|
+
"@pyxisjs/core": "0.1.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"tsup": "^8.0.0",
|
|
39
|
+
"typescript": "^5.0.0"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsup",
|
|
43
|
+
"dev": "tsup --watch",
|
|
44
|
+
"test": "jest",
|
|
45
|
+
"clean": "rm -rf dist"
|
|
46
|
+
}
|
|
47
|
+
}
|