@augustdigital/sdk 4.0.5-alpha → 4.0.5-beta
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/README.md +169 -11
- package/lib/abis/AddressResolver.d.ts +28 -0
- package/lib/abis/AddressResolver.js +23 -0
- package/lib/abis/AddressResolver.js.map +1 -0
- package/lib/abis/ChainlinkV3.d.ts +87 -0
- package/lib/abis/ChainlinkV3.js +117 -0
- package/lib/abis/ChainlinkV3.js.map +1 -0
- package/lib/abis/ERC20.d.ts +168 -0
- package/lib/abis/ERC20.js +226 -0
- package/lib/abis/ERC20.js.map +1 -0
- package/lib/abis/ERC20_Bytes32.d.ts +135 -0
- package/lib/abis/ERC20_Bytes32.js +192 -0
- package/lib/abis/ERC20_Bytes32.js.map +1 -0
- package/lib/abis/ERC4626.d.ts +363 -0
- package/lib/abis/ERC4626.js +506 -0
- package/lib/abis/ERC4626.js.map +1 -0
- package/lib/abis/ERC721.d.ts +230 -0
- package/lib/abis/ERC721.js +320 -0
- package/lib/abis/ERC721.js.map +1 -0
- package/lib/abis/FeeOracle.d.ts +120 -0
- package/lib/abis/FeeOracle.js +161 -0
- package/lib/abis/FeeOracle.js.map +1 -0
- package/lib/abis/LendingPool.d.ts +1393 -0
- package/lib/abis/LendingPool.js +1806 -0
- package/lib/abis/LendingPool.js.map +1 -0
- package/lib/abis/LendingPoolV2.d.ts +55 -0
- package/lib/abis/LendingPoolV2.js +1832 -0
- package/lib/abis/LendingPoolV2.js.map +1 -0
- package/lib/abis/LendingPoolV3.d.ts +35 -0
- package/lib/abis/LendingPoolV3.js +1160 -0
- package/lib/abis/LendingPoolV3.js.map +1 -0
- package/lib/abis/Loan.d.ts +837 -0
- package/lib/abis/Loan.js +1080 -0
- package/lib/abis/Loan.js.map +1 -0
- package/lib/abis/Multicall3.d.ts +30 -0
- package/lib/abis/Multicall3.js +94 -0
- package/lib/abis/Multicall3.js.map +1 -0
- package/lib/abis/PoolAdapter.d.ts +76 -0
- package/lib/abis/PoolAdapter.js +412 -0
- package/lib/abis/PoolAdapter.js.map +1 -0
- package/lib/abis/RewardDistributor.d.ts +46 -0
- package/lib/abis/RewardDistributor.js +352 -0
- package/lib/abis/RewardDistributor.js.map +1 -0
- package/lib/abis/SmartAccount.d.ts +16 -0
- package/lib/abis/SmartAccount.js +16 -0
- package/lib/abis/SmartAccount.js.map +1 -0
- package/lib/abis/TextResolver.d.ts +16 -0
- package/lib/abis/TextResolver.js +16 -0
- package/lib/abis/TextResolver.js.map +1 -0
- package/lib/abis/TokenizedVaultV2.d.ts +1354 -0
- package/lib/abis/TokenizedVaultV2.js +1028 -0
- package/lib/abis/TokenizedVaultV2.js.map +1 -0
- package/lib/abis/TokenizedVaultV2Receipt.d.ts +1568 -0
- package/lib/abis/TokenizedVaultV2Receipt.js +1061 -0
- package/lib/abis/TokenizedVaultV2Receipt.js.map +1 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAssets.d.ts +274 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAssets.js +167 -0
- package/lib/abis/TokenizedVaultV2WhitelistedAssets.js.map +1 -0
- package/lib/abis/UniversalResolverResolve.d.ts +69 -0
- package/lib/abis/UniversalResolverResolve.js +35 -0
- package/lib/abis/UniversalResolverResolve.js.map +1 -0
- package/lib/abis/UniversalSignatureValidator.d.ts +17 -0
- package/lib/abis/UniversalSignatureValidator.js +27 -0
- package/lib/abis/UniversalSignatureValidator.js.map +1 -0
- package/lib/abis/WrapperAdapter.d.ts +60 -0
- package/lib/abis/WrapperAdapter.js +150 -0
- package/lib/abis/WrapperAdapter.js.map +1 -0
- package/lib/abis/index.d.ts +22 -0
- package/lib/abis/index.js +39 -0
- package/lib/abis/index.js.map +1 -0
- package/lib/adapters/evm/getters.d.ts +4 -0
- package/lib/adapters/evm/getters.js +152 -0
- package/lib/adapters/evm/getters.js.map +1 -0
- package/lib/adapters/evm/index.d.ts +19 -0
- package/lib/adapters/evm/index.js +54 -0
- package/lib/adapters/evm/index.js.map +1 -0
- package/lib/adapters/evm/utils.d.ts +2 -0
- package/lib/adapters/evm/utils.js +43 -0
- package/lib/adapters/evm/utils.js.map +1 -0
- package/lib/adapters/solana/constants.d.ts +25 -0
- package/lib/adapters/solana/constants.js +32 -0
- package/lib/adapters/solana/constants.js.map +1 -0
- package/lib/adapters/solana/getters.d.ts +3 -0
- package/lib/adapters/solana/getters.js +135 -0
- package/lib/adapters/solana/getters.js.map +1 -0
- package/lib/adapters/solana/idl/vault-idl.d.ts +338 -0
- package/lib/adapters/solana/idl/vault-idl.js +1075 -0
- package/lib/adapters/solana/idl/vault-idl.js.map +1 -0
- package/lib/adapters/solana/index.d.ts +136 -0
- package/lib/adapters/solana/index.js +174 -0
- package/lib/adapters/solana/index.js.map +1 -0
- package/lib/adapters/solana/types.d.ts +58 -0
- package/lib/adapters/solana/types.js +3 -0
- package/lib/adapters/solana/types.js.map +1 -0
- package/lib/adapters/solana/utils.d.ts +104 -0
- package/lib/adapters/solana/utils.js +380 -0
- package/lib/adapters/solana/utils.js.map +1 -0
- package/lib/adapters/solana/vault.actions.d.ts +18 -0
- package/lib/adapters/solana/vault.actions.js +235 -0
- package/lib/adapters/solana/vault.actions.js.map +1 -0
- package/lib/adapters/sui/index.d.ts +0 -0
- package/lib/adapters/sui/index.js +1 -0
- package/lib/adapters/sui/index.js.map +1 -0
- package/lib/core/auth/index.d.ts +1 -0
- package/lib/core/auth/index.js +18 -0
- package/lib/core/auth/index.js.map +1 -0
- package/lib/{verify.js → core/auth/verify.js} +3 -2
- package/lib/core/auth/verify.js.map +1 -0
- package/lib/core/base.class.d.ts +33 -0
- package/lib/core/base.class.js +66 -0
- package/lib/core/base.class.js.map +1 -0
- package/lib/core/constants.core.d.ts +59 -0
- package/lib/core/constants.core.js +63 -0
- package/lib/core/constants.core.js.map +1 -0
- package/lib/core/constants.d.ts +88 -0
- package/lib/core/constants.js +148 -0
- package/lib/core/constants.js.map +1 -0
- package/lib/core/constants.vaults.d.ts +19 -0
- package/lib/core/constants.vaults.js +130 -0
- package/lib/core/constants.vaults.js.map +1 -0
- package/lib/core/constants.web3.d.ts +30 -0
- package/lib/core/constants.web3.js +89 -0
- package/lib/core/constants.web3.js.map +1 -0
- package/lib/core/core.helpers.d.ts +23 -0
- package/lib/core/core.helpers.js +210 -0
- package/lib/core/core.helpers.js.map +1 -0
- package/lib/core/fetcher.d.ts +22 -0
- package/lib/core/fetcher.js +321 -0
- package/lib/core/fetcher.js.map +1 -0
- package/lib/core/helpers.core.d.ts +23 -0
- package/lib/core/helpers.core.js +210 -0
- package/lib/core/helpers.core.js.map +1 -0
- package/lib/core/helpers.vaults.d.ts +15 -0
- package/lib/core/helpers.vaults.js +118 -0
- package/lib/core/helpers.vaults.js.map +1 -0
- package/lib/core/helpers.web3.d.ts +29 -0
- package/lib/core/helpers.web3.js +365 -0
- package/lib/core/helpers.web3.js.map +1 -0
- package/lib/core/index.d.ts +10 -0
- package/lib/core/index.js +27 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/logger/index.d.ts +21 -0
- package/lib/core/logger/index.js +80 -0
- package/lib/core/logger/index.js.map +1 -0
- package/lib/core/logger/slack.d.ts +12 -0
- package/lib/core/logger/slack.js +49 -0
- package/lib/core/logger/slack.js.map +1 -0
- package/lib/core/read.actions.d.ts +3 -0
- package/lib/core/read.actions.js +39 -0
- package/lib/core/read.actions.js.map +1 -0
- package/lib/core/vault.utils.d.ts +4 -0
- package/lib/core/vault.utils.js +35 -0
- package/lib/core/vault.utils.js.map +1 -0
- package/lib/core/web3.helpers.d.ts +29 -0
- package/lib/core/web3.helpers.js +365 -0
- package/lib/core/web3.helpers.js.map +1 -0
- package/lib/core/write.actions.d.ts +9 -0
- package/lib/core/write.actions.js +51 -0
- package/lib/core/write.actions.js.map +1 -0
- package/lib/index.d.ts +5 -5
- package/lib/index.js +13 -6
- package/lib/index.js.map +1 -1
- package/lib/main.d.ts +90 -14
- package/lib/main.js +60 -13
- package/lib/main.js.map +1 -1
- package/lib/modules/vaults/constants.d.ts +63 -0
- package/lib/modules/vaults/constants.js +186 -0
- package/lib/modules/vaults/constants.js.map +1 -0
- package/lib/modules/vaults/fetcher.d.ts +101 -0
- package/lib/modules/vaults/fetcher.js +257 -0
- package/lib/modules/vaults/fetcher.js.map +1 -0
- package/lib/modules/vaults/getters.d.ts +67 -0
- package/lib/modules/vaults/getters.js +900 -0
- package/lib/modules/vaults/getters.js.map +1 -0
- package/lib/modules/vaults/index.d.ts +3 -0
- package/lib/modules/vaults/index.js +20 -0
- package/lib/modules/vaults/index.js.map +1 -0
- package/lib/modules/vaults/main.d.ts +98 -0
- package/lib/modules/vaults/main.js +519 -0
- package/lib/modules/vaults/main.js.map +1 -0
- package/lib/modules/vaults/read.actions.d.ts +3 -0
- package/lib/modules/vaults/read.actions.js +39 -0
- package/lib/modules/vaults/read.actions.js.map +1 -0
- package/lib/modules/vaults/utils.d.ts +12 -0
- package/lib/modules/vaults/utils.js +170 -0
- package/lib/modules/vaults/utils.js.map +1 -0
- package/lib/modules/vaults/vault.actions.d.ts +10 -0
- package/lib/modules/vaults/vault.actions.js +95 -0
- package/lib/modules/vaults/vault.actions.js.map +1 -0
- package/lib/modules/vaults/write.actions.d.ts +17 -0
- package/lib/modules/vaults/write.actions.js +143 -0
- package/lib/modules/vaults/write.actions.js.map +1 -0
- package/lib/services/coingecko/fetcher.d.ts +1 -0
- package/lib/services/coingecko/fetcher.js +36 -0
- package/lib/services/coingecko/fetcher.js.map +1 -0
- package/lib/services/coingecko/index.d.ts +2 -0
- package/lib/services/coingecko/index.js +19 -0
- package/lib/services/coingecko/index.js.map +1 -0
- package/lib/services/coingecko/utils.d.ts +1 -0
- package/lib/services/coingecko/utils.js +24 -0
- package/lib/services/coingecko/utils.js.map +1 -0
- package/lib/services/debank/fetcher.d.ts +2 -0
- package/lib/services/debank/fetcher.js +16 -0
- package/lib/services/debank/fetcher.js.map +1 -0
- package/lib/services/debank/index.d.ts +2 -0
- package/lib/services/debank/index.js +19 -0
- package/lib/services/debank/index.js.map +1 -0
- package/lib/services/debank/utils.d.ts +32 -0
- package/lib/services/debank/utils.js +229 -0
- package/lib/services/debank/utils.js.map +1 -0
- package/lib/services/subgraph/fetcher.d.ts +2 -0
- package/lib/services/subgraph/fetcher.js +59 -0
- package/lib/services/subgraph/fetcher.js.map +1 -0
- package/lib/services/subgraph/index.d.ts +2 -0
- package/lib/services/subgraph/index.js +19 -0
- package/lib/services/subgraph/index.js.map +1 -0
- package/lib/services/subgraph/vaults.d.ts +10 -0
- package/lib/services/subgraph/vaults.js +471 -0
- package/lib/services/subgraph/vaults.js.map +1 -0
- package/lib/types/index.d.ts +8 -0
- package/lib/types/index.js +24 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/pools.d.ts +141 -0
- package/lib/types/pools.js +3 -0
- package/lib/types/pools.js.map +1 -0
- package/lib/types/staking.d.ts +28 -0
- package/lib/types/staking.js +3 -0
- package/lib/types/staking.js.map +1 -0
- package/lib/types/subgraph.d.ts +45 -0
- package/lib/types/subgraph.js +3 -0
- package/lib/types/subgraph.js.map +1 -0
- package/lib/types/user.d.ts +1 -0
- package/lib/types/user.js +3 -0
- package/lib/types/user.js.map +1 -0
- package/lib/types/vaults.d.ts +170 -0
- package/lib/types/vaults.js +3 -0
- package/lib/types/vaults.js.map +1 -0
- package/lib/types/web3.d.ts +24 -0
- package/lib/types/web3.js +3 -0
- package/lib/types/web3.js.map +1 -0
- package/lib/types/webserver.d.ts +489 -0
- package/lib/types/webserver.js +3 -0
- package/lib/types/webserver.js.map +1 -0
- package/package.json +16 -10
- package/lib/verify.js.map +0 -1
- /package/lib/{verify.d.ts → core/auth/verify.d.ts} +0 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SolanaUtils = void 0;
|
|
4
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
|
5
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
6
|
+
const ethers_1 = require("ethers");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
function getExplorerLink({ signature, type = 'tx', network = constants_1.fallbackNetwork, }) {
|
|
9
|
+
const baseUrl = 'https://solscan.io';
|
|
10
|
+
return `${baseUrl}/${type}/${signature}?cluster=${network}`;
|
|
11
|
+
}
|
|
12
|
+
function isSolanaAddress(address) {
|
|
13
|
+
if (!address)
|
|
14
|
+
return false;
|
|
15
|
+
if ((0, ethers_1.isAddress)(address))
|
|
16
|
+
return false;
|
|
17
|
+
return web3_js_1.PublicKey.isOnCurve(new web3_js_1.PublicKey(address).toBytes());
|
|
18
|
+
}
|
|
19
|
+
function isSolana(signature) {
|
|
20
|
+
if (!signature || typeof signature !== 'string')
|
|
21
|
+
return false;
|
|
22
|
+
if ((0, ethers_1.isAddress)(signature))
|
|
23
|
+
return false;
|
|
24
|
+
try {
|
|
25
|
+
const testKey = new web3_js_1.PublicKey(signature);
|
|
26
|
+
if (web3_js_1.PublicKey.isOnCurve(testKey.toBytes())) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
}
|
|
32
|
+
const base58Chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
|
|
33
|
+
const isValidBase58 = signature
|
|
34
|
+
.split('')
|
|
35
|
+
.every((char) => base58Chars.includes(char));
|
|
36
|
+
if (!isValidBase58)
|
|
37
|
+
return false;
|
|
38
|
+
return (signature.length >= 80 && signature.length <= 100);
|
|
39
|
+
}
|
|
40
|
+
function getProgram({ provider, idl, network, }) {
|
|
41
|
+
if (!idl) {
|
|
42
|
+
return new anchor_1.Program(constants_1.vaultIdl, provider);
|
|
43
|
+
}
|
|
44
|
+
return new anchor_1.Program(idl, provider);
|
|
45
|
+
}
|
|
46
|
+
async function testRpcEndpoint({ connection }) {
|
|
47
|
+
try {
|
|
48
|
+
const blockHeight = await connection.getBlockHeight();
|
|
49
|
+
return { success: true, blockHeight };
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return { success: false, error };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function getBestRpcEndpoint({ endpoint, network = constants_1.fallbackNetwork, connection, }) {
|
|
56
|
+
const primaryEndpoint = endpoint;
|
|
57
|
+
const fallbackEndpoint = constants_1.fallbackRpcEndpoints[network];
|
|
58
|
+
const primaryTest = await testRpcEndpoint({ connection });
|
|
59
|
+
if (primaryTest.success) {
|
|
60
|
+
return primaryEndpoint;
|
|
61
|
+
}
|
|
62
|
+
console.warn('⚠️ Primary RPC endpoint failed, using fallback:', fallbackEndpoint);
|
|
63
|
+
return fallbackEndpoint;
|
|
64
|
+
}
|
|
65
|
+
function getProvider({ connection, publicKey, signTransaction, }) {
|
|
66
|
+
if (!publicKey || !signTransaction) {
|
|
67
|
+
throw new Error('Wallet not connected');
|
|
68
|
+
}
|
|
69
|
+
return new anchor_1.AnchorProvider(connection, {
|
|
70
|
+
publicKey,
|
|
71
|
+
signTransaction,
|
|
72
|
+
signAllTransactions: async (txs) => {
|
|
73
|
+
const signedTransactions = await Promise.all(txs.map(async (tx) => signTransaction(tx)));
|
|
74
|
+
return signedTransactions;
|
|
75
|
+
},
|
|
76
|
+
}, { commitment: 'confirmed' });
|
|
77
|
+
}
|
|
78
|
+
function getReadOnlyProvider({ connection }) {
|
|
79
|
+
const dummyWallet = {
|
|
80
|
+
publicKey: web3_js_1.PublicKey.default,
|
|
81
|
+
signTransaction: async (_tx) => {
|
|
82
|
+
throw new Error('Cannot sign transactions with read-only provider');
|
|
83
|
+
},
|
|
84
|
+
signAllTransactions: async (_txs) => {
|
|
85
|
+
throw new Error('Cannot sign transactions with read-only provider');
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
return new anchor_1.AnchorProvider(connection, dummyWallet, {
|
|
89
|
+
commitment: 'confirmed',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function deriveVaultStatePda(vaultProgramId) {
|
|
93
|
+
if (!vaultProgramId)
|
|
94
|
+
throw new Error('Vault program ID missing');
|
|
95
|
+
const _vaultProgramId = new web3_js_1.PublicKey(vaultProgramId);
|
|
96
|
+
const [pda] = web3_js_1.PublicKey.findProgramAddressSync([new TextEncoder().encode('VAULT_STATE')], _vaultProgramId);
|
|
97
|
+
return pda;
|
|
98
|
+
}
|
|
99
|
+
function deriveShareMintPda(vaultProgramId) {
|
|
100
|
+
if (!vaultProgramId)
|
|
101
|
+
throw new Error('Vault program ID missing');
|
|
102
|
+
const _vaultProgramId = new web3_js_1.PublicKey(vaultProgramId);
|
|
103
|
+
const [pda] = web3_js_1.PublicKey.findProgramAddressSync([new TextEncoder().encode('mint')], _vaultProgramId);
|
|
104
|
+
return pda;
|
|
105
|
+
}
|
|
106
|
+
function deriveVaultTokenAtaPda(vaultProgramId, depositMint) {
|
|
107
|
+
if (!(vaultProgramId && depositMint))
|
|
108
|
+
throw new Error('Vault program ID or deposit mint missing');
|
|
109
|
+
const _vaultProgramId = new web3_js_1.PublicKey(vaultProgramId);
|
|
110
|
+
const [pda] = web3_js_1.PublicKey.findProgramAddressSync([new TextEncoder().encode('token_vault'), depositMint.toBuffer()], _vaultProgramId);
|
|
111
|
+
return pda;
|
|
112
|
+
}
|
|
113
|
+
async function getVaultState({ provider, connection, vaultProgramId, idl, }) {
|
|
114
|
+
const returnObj = {
|
|
115
|
+
vaultState: null,
|
|
116
|
+
depositMintDecimals: null,
|
|
117
|
+
vaultToken: {
|
|
118
|
+
balance: 0,
|
|
119
|
+
decimals: 0,
|
|
120
|
+
rawAmount: '0',
|
|
121
|
+
symbol: '',
|
|
122
|
+
name: '',
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
try {
|
|
126
|
+
if (!vaultProgramId) {
|
|
127
|
+
throw new Error('Please enter a vault program ID');
|
|
128
|
+
}
|
|
129
|
+
const vaultStatePda = deriveVaultStatePda(vaultProgramId);
|
|
130
|
+
const program = getProgram({ provider, idl });
|
|
131
|
+
const state = await program.account.vaultState.fetch(vaultStatePda);
|
|
132
|
+
returnObj.vaultState = state;
|
|
133
|
+
if (state.depositMint) {
|
|
134
|
+
try {
|
|
135
|
+
const mintInfo = await connection.getParsedAccountInfo(state.depositMint);
|
|
136
|
+
if (mintInfo.value) {
|
|
137
|
+
const parsedData = mintInfo.value.data;
|
|
138
|
+
const { decimals } = parsedData.parsed.info;
|
|
139
|
+
returnObj.depositMintDecimals = decimals;
|
|
140
|
+
}
|
|
141
|
+
const vaultTokenAtaPda = deriveVaultTokenAtaPda(vaultProgramId, state.depositMint);
|
|
142
|
+
const tokenAccountInfo = await connection.getTokenAccountBalance(vaultTokenAtaPda);
|
|
143
|
+
if (tokenAccountInfo.value) {
|
|
144
|
+
returnObj.vaultToken = {
|
|
145
|
+
balance: Number(tokenAccountInfo.value.uiAmount),
|
|
146
|
+
decimals: Number(tokenAccountInfo.value.decimals),
|
|
147
|
+
rawAmount: tokenAccountInfo.value.amount.toString(),
|
|
148
|
+
symbol: '',
|
|
149
|
+
name: '',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (balanceError) {
|
|
154
|
+
console.error('Error fetching vault token balance:', balanceError);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return returnObj;
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
const error = e;
|
|
161
|
+
console.error('Error reading vault state:', error);
|
|
162
|
+
return returnObj;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function getVaultStateReadOnly({ vaultProgramId, connection, idl, }) {
|
|
166
|
+
const returnObj = {
|
|
167
|
+
vaultState: null,
|
|
168
|
+
depositMintDecimals: null,
|
|
169
|
+
vaultToken: {
|
|
170
|
+
balance: 0,
|
|
171
|
+
decimals: 0,
|
|
172
|
+
rawAmount: '0',
|
|
173
|
+
symbol: '',
|
|
174
|
+
name: '',
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
try {
|
|
178
|
+
if (!vaultProgramId) {
|
|
179
|
+
throw new Error('Please enter a vault program ID');
|
|
180
|
+
}
|
|
181
|
+
const _vaultProgramId = new web3_js_1.PublicKey(vaultProgramId);
|
|
182
|
+
const vaultStatePda = deriveVaultStatePda(_vaultProgramId);
|
|
183
|
+
const accountInfo = await connection.getAccountInfo(vaultStatePda);
|
|
184
|
+
if (!accountInfo) {
|
|
185
|
+
console.warn('Vault state account not found');
|
|
186
|
+
return returnObj;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const readOnlyProvider = getReadOnlyProvider({ connection });
|
|
190
|
+
const program = getProgram({ provider: readOnlyProvider, idl });
|
|
191
|
+
const state = await program.account.vaultState.fetch(vaultStatePda);
|
|
192
|
+
returnObj.vaultState = state;
|
|
193
|
+
if (state.depositMint) {
|
|
194
|
+
try {
|
|
195
|
+
const mintInfo = await connection.getParsedAccountInfo(state.depositMint);
|
|
196
|
+
if (mintInfo.value) {
|
|
197
|
+
const parsedData = mintInfo.value.data;
|
|
198
|
+
const { decimals } = parsedData.parsed.info;
|
|
199
|
+
returnObj.depositMintDecimals = decimals;
|
|
200
|
+
}
|
|
201
|
+
const vaultTokenAtaPda = deriveVaultTokenAtaPda(_vaultProgramId, state.depositMint);
|
|
202
|
+
const tokenAccountInfo = await connection.getTokenAccountBalance(vaultTokenAtaPda);
|
|
203
|
+
if (tokenAccountInfo.value) {
|
|
204
|
+
returnObj.vaultToken = {
|
|
205
|
+
balance: Number(tokenAccountInfo.value.uiAmount),
|
|
206
|
+
decimals: Number(tokenAccountInfo.value.decimals),
|
|
207
|
+
rawAmount: tokenAccountInfo.value.amount.toString(),
|
|
208
|
+
symbol: '',
|
|
209
|
+
name: '',
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (balanceError) {
|
|
214
|
+
console.error('Error fetching vault token balance:', balanceError);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (programError) {
|
|
219
|
+
console.error('Error creating program with read-only provider:', programError);
|
|
220
|
+
returnObj.vaultState = {
|
|
221
|
+
address: vaultStatePda.toBase58(),
|
|
222
|
+
data: accountInfo.data,
|
|
223
|
+
owner: accountInfo.owner.toBase58(),
|
|
224
|
+
lamports: accountInfo.lamports,
|
|
225
|
+
executable: accountInfo.executable,
|
|
226
|
+
rentEpoch: accountInfo.rentEpoch,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return returnObj;
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
const error = e;
|
|
233
|
+
console.error('Error reading vault state:', error);
|
|
234
|
+
return returnObj;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async function getVaultMints({ vaultProgramId, connection, idl, }) {
|
|
238
|
+
try {
|
|
239
|
+
if (!vaultProgramId) {
|
|
240
|
+
throw new Error('Please enter a vault program ID');
|
|
241
|
+
}
|
|
242
|
+
const _vaultProgramId = new web3_js_1.PublicKey(vaultProgramId);
|
|
243
|
+
const vaultStatePda = deriveVaultStatePda(_vaultProgramId);
|
|
244
|
+
const readOnlyProvider = getReadOnlyProvider({ connection });
|
|
245
|
+
const program = getProgram({ provider: readOnlyProvider, idl });
|
|
246
|
+
const state = await program.account.vaultState.fetch(vaultStatePda);
|
|
247
|
+
return {
|
|
248
|
+
depositMint: state.depositMint.toString(),
|
|
249
|
+
shareMint: state.shareMint.toString(),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
const error = e;
|
|
254
|
+
console.error('Error reading vault state:', error);
|
|
255
|
+
return {
|
|
256
|
+
depositMint: '',
|
|
257
|
+
shareMint: '',
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async function getToken({ mintAddress, endpoint, }) {
|
|
262
|
+
try {
|
|
263
|
+
const response = await fetch(endpoint, {
|
|
264
|
+
method: 'POST',
|
|
265
|
+
headers: {
|
|
266
|
+
'Content-Type': 'application/json',
|
|
267
|
+
},
|
|
268
|
+
body: JSON.stringify({
|
|
269
|
+
jsonrpc: '2.0',
|
|
270
|
+
id: 'text',
|
|
271
|
+
method: 'getAsset',
|
|
272
|
+
params: { id: mintAddress.toString() },
|
|
273
|
+
}),
|
|
274
|
+
});
|
|
275
|
+
const data = (await response.json());
|
|
276
|
+
return {
|
|
277
|
+
address: data?.result?.id,
|
|
278
|
+
symbol: data.result?.content?.metadata?.symbol || 'N/A',
|
|
279
|
+
decimals: data.result?.token_info?.decimals,
|
|
280
|
+
name: data.result?.content?.metadata?.name || 'Unknown',
|
|
281
|
+
image: data.result?.content.metadata?.image,
|
|
282
|
+
program: data.result?.token_info?.token_program,
|
|
283
|
+
mintAuthority: data.result?.token_info?.mint_authority,
|
|
284
|
+
freezeAuthority: data.result?.token_info?.freeze_authority,
|
|
285
|
+
supply: data.result?.token_info?.supply,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
console.error('Error fetching token symbol:', error);
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
async function getTokenSymbol({ endpoint, mintAddress, }) {
|
|
294
|
+
try {
|
|
295
|
+
const tokenMetadata = await getToken({ endpoint, mintAddress });
|
|
296
|
+
if (tokenMetadata) {
|
|
297
|
+
return tokenMetadata.symbol;
|
|
298
|
+
}
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
console.error('Error fetching token symbol:', error);
|
|
303
|
+
return null;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async function fetchUserTokenBalance({ connection, publicKey, depositMint, }) {
|
|
307
|
+
if (!publicKey || !depositMint)
|
|
308
|
+
return '0';
|
|
309
|
+
try {
|
|
310
|
+
const _publicKey = new web3_js_1.PublicKey(publicKey);
|
|
311
|
+
const _depositMint = new web3_js_1.PublicKey(depositMint);
|
|
312
|
+
const tokenAccounts = await connection.getParsedTokenAccountsByOwner(_publicKey, {
|
|
313
|
+
mint: _depositMint,
|
|
314
|
+
});
|
|
315
|
+
if (tokenAccounts.value.length > 0) {
|
|
316
|
+
const balance = tokenAccounts?.value?.[0]?.account.data.parsed.info.tokenAmount
|
|
317
|
+
.uiAmount;
|
|
318
|
+
return balance?.toString() || '0';
|
|
319
|
+
}
|
|
320
|
+
return '0';
|
|
321
|
+
}
|
|
322
|
+
catch (e) {
|
|
323
|
+
const error = e;
|
|
324
|
+
console.error('Error fetching user token balance:', error);
|
|
325
|
+
return '0';
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
async function fetchUserShareBalance({ connection, publicKey, shareMint, network, }) {
|
|
329
|
+
if (!publicKey || !shareMint)
|
|
330
|
+
return 0;
|
|
331
|
+
try {
|
|
332
|
+
const _publicKey = new web3_js_1.PublicKey(publicKey);
|
|
333
|
+
const _shareMint = new web3_js_1.PublicKey(shareMint);
|
|
334
|
+
const shareMintPda = deriveShareMintPda(new web3_js_1.PublicKey(constants_1.programIds[network].vault));
|
|
335
|
+
const shareMintInfo = await connection.getParsedAccountInfo(shareMintPda);
|
|
336
|
+
if (!shareMintInfo.value) {
|
|
337
|
+
console.error('#fetchUserShareBalance:Could not fetch share mint info');
|
|
338
|
+
return 0;
|
|
339
|
+
}
|
|
340
|
+
const parsedData = shareMintInfo.value.data;
|
|
341
|
+
const shareDecimals = parsedData.parsed.info.decimals || constants_1.fallbackDecimals + 2;
|
|
342
|
+
const shareAccounts = await connection.getParsedTokenAccountsByOwner(_publicKey, {
|
|
343
|
+
mint: _shareMint,
|
|
344
|
+
});
|
|
345
|
+
if (shareAccounts.value.length > 0) {
|
|
346
|
+
const rawBalance = shareAccounts?.value?.[0]?.account.data.parsed.info.tokenAmount.amount;
|
|
347
|
+
const balance = Number(rawBalance) / 10 ** shareDecimals;
|
|
348
|
+
return balance;
|
|
349
|
+
}
|
|
350
|
+
return 0;
|
|
351
|
+
}
|
|
352
|
+
catch (e) {
|
|
353
|
+
const error = e;
|
|
354
|
+
console.error('Error fetching user share balance:', error);
|
|
355
|
+
return 0;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
exports.SolanaUtils = {
|
|
359
|
+
getExplorerLink,
|
|
360
|
+
isSolanaAddress,
|
|
361
|
+
isSolana,
|
|
362
|
+
getProgram,
|
|
363
|
+
getProvider,
|
|
364
|
+
getReadOnlyProvider,
|
|
365
|
+
deriveShareMintPda,
|
|
366
|
+
deriveVaultStatePda,
|
|
367
|
+
deriveVaultTokenAtaPda,
|
|
368
|
+
getVaultState,
|
|
369
|
+
getVaultStateReadOnly,
|
|
370
|
+
getToken,
|
|
371
|
+
getTokenSymbol,
|
|
372
|
+
fetchUserTokenBalance,
|
|
373
|
+
fetchUserShareBalance,
|
|
374
|
+
getBestRpcEndpoint,
|
|
375
|
+
fallbackDecimals: constants_1.fallbackDecimals,
|
|
376
|
+
fallbackNetwork: constants_1.fallbackNetwork,
|
|
377
|
+
programIds: constants_1.programIds,
|
|
378
|
+
getVaultMints,
|
|
379
|
+
};
|
|
380
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src.ts/adapters/solana/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { web3 } from '@coral-xyz/anchor';
|
|
2
|
+
import { Connection, PublicKey, Transaction } from '@solana/web3.js';
|
|
3
|
+
import { ISolanaConnectionOptions } from './types';
|
|
4
|
+
import { SendTransactionOptions } from '@solana/wallet-adapter-base';
|
|
5
|
+
export declare function handleSolanaDeposit({ provider, connection, network, vaultProgramId, depositAmount, publicKey, sendTransaction, idl, }: {
|
|
6
|
+
vaultProgramId: PublicKey | string;
|
|
7
|
+
idl: any;
|
|
8
|
+
publicKey: PublicKey | string;
|
|
9
|
+
depositAmount: number;
|
|
10
|
+
sendTransaction: (transaction: Transaction | web3.VersionedTransaction, connection: Connection, options?: SendTransactionOptions) => Promise<web3.TransactionSignature>;
|
|
11
|
+
} & ISolanaConnectionOptions): Promise<any>;
|
|
12
|
+
export declare function handleSolanaRedeem({ provider, connection, vaultProgramId, publicKey, redeemShares, sendTransaction, idl, }: {
|
|
13
|
+
idl: any;
|
|
14
|
+
vaultProgramId: PublicKey | string;
|
|
15
|
+
publicKey: PublicKey | string;
|
|
16
|
+
redeemShares: number;
|
|
17
|
+
sendTransaction: (transaction: Transaction | web3.VersionedTransaction, connection: Connection, options?: SendTransactionOptions) => Promise<web3.TransactionSignature>;
|
|
18
|
+
} & ISolanaConnectionOptions): Promise<any>;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleSolanaDeposit = handleSolanaDeposit;
|
|
4
|
+
exports.handleSolanaRedeem = handleSolanaRedeem;
|
|
5
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
|
6
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
7
|
+
const spl_token_1 = require("@solana/spl-token");
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
async function handleSolanaDeposit({ provider, connection, network = constants_1.fallbackNetwork, vaultProgramId, depositAmount, publicKey, sendTransaction, idl, }) {
|
|
11
|
+
try {
|
|
12
|
+
if (!publicKey)
|
|
13
|
+
throw new Error('Wallet not connected');
|
|
14
|
+
if (!depositAmount)
|
|
15
|
+
throw new Error('Please enter an amount to deposit');
|
|
16
|
+
if (!vaultProgramId)
|
|
17
|
+
throw new Error('Please enter a vault program ID');
|
|
18
|
+
const { depositMint } = await utils_1.SolanaUtils.getVaultMints({
|
|
19
|
+
network,
|
|
20
|
+
connection,
|
|
21
|
+
vaultProgramId,
|
|
22
|
+
idl,
|
|
23
|
+
});
|
|
24
|
+
const _vaultProgramId = new web3_js_1.PublicKey(vaultProgramId);
|
|
25
|
+
const _publicKey = new web3_js_1.PublicKey(publicKey);
|
|
26
|
+
const _depositMint = new web3_js_1.PublicKey(depositMint);
|
|
27
|
+
const program = utils_1.SolanaUtils.getProgram({ provider, idl });
|
|
28
|
+
console.log('Program', program);
|
|
29
|
+
const vaultStatePda = utils_1.SolanaUtils.deriveVaultStatePda(_vaultProgramId);
|
|
30
|
+
console.log('Vault state PDA', vaultStatePda.toBase58());
|
|
31
|
+
const vaultTokenAtaPda = utils_1.SolanaUtils.deriveVaultTokenAtaPda(_vaultProgramId, _depositMint);
|
|
32
|
+
console.log('Vault token ATA PDA', vaultTokenAtaPda.toBase58());
|
|
33
|
+
const shareMintPda = utils_1.SolanaUtils.deriveShareMintPda(_vaultProgramId);
|
|
34
|
+
console.log('Share mint PDA', shareMintPda.toBase58());
|
|
35
|
+
const mintInfo = await connection.getParsedAccountInfo(_depositMint);
|
|
36
|
+
if (!mintInfo.value) {
|
|
37
|
+
throw new Error('Could not fetch mint info');
|
|
38
|
+
}
|
|
39
|
+
const { decimals } = mintInfo.value.data.parsed.info;
|
|
40
|
+
0;
|
|
41
|
+
const depositAmountStr = depositAmount.toString();
|
|
42
|
+
const [whole, fraction = ''] = depositAmountStr.split('.');
|
|
43
|
+
const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);
|
|
44
|
+
const rawAmountStr = whole + paddedFraction;
|
|
45
|
+
const depositAmountRaw = new anchor_1.BN(rawAmountStr.replace(/^0+/, '') || '0');
|
|
46
|
+
if (isNaN(depositAmount)) {
|
|
47
|
+
throw new Error('Please enter a valid number for the deposit amount');
|
|
48
|
+
}
|
|
49
|
+
if (depositAmount <= 0) {
|
|
50
|
+
throw new Error('Deposit amount must be greater than 0');
|
|
51
|
+
}
|
|
52
|
+
const userTokenAccounts = await connection.getParsedTokenAccountsByOwner(_publicKey, {
|
|
53
|
+
mint: _depositMint,
|
|
54
|
+
});
|
|
55
|
+
console.log('User token accounts', userTokenAccounts);
|
|
56
|
+
const userShareAccounts = await connection.getParsedTokenAccountsByOwner(_publicKey, {
|
|
57
|
+
mint: shareMintPda,
|
|
58
|
+
});
|
|
59
|
+
console.log('User share accounts', userShareAccounts);
|
|
60
|
+
if (userTokenAccounts.value.length === 0) {
|
|
61
|
+
throw new Error('No token account found for deposit mint. Please create a token account first.');
|
|
62
|
+
}
|
|
63
|
+
let senderShareAccount;
|
|
64
|
+
if (userShareAccounts.value.length === 0) {
|
|
65
|
+
console.log('Creating share account');
|
|
66
|
+
senderShareAccount = await (0, spl_token_1.getAssociatedTokenAddress)(shareMintPda, _publicKey);
|
|
67
|
+
console.log('Sender share account', senderShareAccount.toBase58());
|
|
68
|
+
const createAtaIx = (0, spl_token_1.createAssociatedTokenAccountInstruction)(_publicKey, senderShareAccount, _publicKey, shareMintPda);
|
|
69
|
+
console.log('Create ATA Ix', createAtaIx.programId.toBase58());
|
|
70
|
+
const transaction = new web3_js_1.Transaction().add(createAtaIx);
|
|
71
|
+
const signature = await sendTransaction(transaction, connection);
|
|
72
|
+
console.log('Created share account:', signature.toString());
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
senderShareAccount = userShareAccounts.value[0]?.pubkey;
|
|
76
|
+
}
|
|
77
|
+
const senderTokenAccount = userTokenAccounts.value[0]?.pubkey;
|
|
78
|
+
console.log('Sender token account', senderTokenAccount);
|
|
79
|
+
console.log('\n\nDeposit TX Params:\n');
|
|
80
|
+
console.log('Program', depositAmountRaw);
|
|
81
|
+
console.log('Vault state PDA', vaultStatePda.toBase58());
|
|
82
|
+
console.log('Vault token ATA PDA', vaultTokenAtaPda.toBase58());
|
|
83
|
+
console.log('Sender token account', senderTokenAccount?.toBase58());
|
|
84
|
+
console.log('Sender share account', senderShareAccount?.toBase58());
|
|
85
|
+
console.log('Share mint PDA', shareMintPda.toBase58());
|
|
86
|
+
console.log('Deposit mint', _depositMint?.toBase58());
|
|
87
|
+
console.log('Signer', _publicKey.toBase58());
|
|
88
|
+
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('confirmed');
|
|
89
|
+
const tx = await program.methods
|
|
90
|
+
.deposit(new anchor_1.BN(depositAmountRaw))
|
|
91
|
+
.accounts({
|
|
92
|
+
vaultState: vaultStatePda,
|
|
93
|
+
vaultTokenAta: vaultTokenAtaPda,
|
|
94
|
+
senderTokenAccount,
|
|
95
|
+
senderShareAccount,
|
|
96
|
+
shareMint: shareMintPda,
|
|
97
|
+
depositMint: depositMint,
|
|
98
|
+
signer: publicKey,
|
|
99
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
100
|
+
})
|
|
101
|
+
.rpc({
|
|
102
|
+
skipPreflight: false,
|
|
103
|
+
preflightCommitment: 'confirmed',
|
|
104
|
+
});
|
|
105
|
+
console.log('Deposit successful:', tx);
|
|
106
|
+
await connection.confirmTransaction({
|
|
107
|
+
signature: tx,
|
|
108
|
+
blockhash,
|
|
109
|
+
lastValidBlockHeight,
|
|
110
|
+
}, 'confirmed');
|
|
111
|
+
return tx;
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
console.error('Deposit failed:', e);
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function handleSolanaRedeem({ provider, connection, vaultProgramId, publicKey, redeemShares, sendTransaction, idl, }) {
|
|
119
|
+
try {
|
|
120
|
+
if (!publicKey)
|
|
121
|
+
throw new Error('Wallet not connected');
|
|
122
|
+
if (!redeemShares)
|
|
123
|
+
throw new Error('Please enter shares to redeem');
|
|
124
|
+
if (!vaultProgramId)
|
|
125
|
+
throw new Error('Please enter a vault program ID');
|
|
126
|
+
const { depositMint } = await utils_1.SolanaUtils.getVaultMints({
|
|
127
|
+
network: provider.connection.rpcEndpoint.includes('devnet')
|
|
128
|
+
? 'devnet'
|
|
129
|
+
: 'mainnet-beta',
|
|
130
|
+
connection,
|
|
131
|
+
vaultProgramId,
|
|
132
|
+
idl,
|
|
133
|
+
});
|
|
134
|
+
const _vaultProgramId = new web3_js_1.PublicKey(vaultProgramId);
|
|
135
|
+
const _depositMint = new web3_js_1.PublicKey(depositMint);
|
|
136
|
+
const _publicKey = new web3_js_1.PublicKey(publicKey);
|
|
137
|
+
const program = utils_1.SolanaUtils.getProgram({ provider, idl });
|
|
138
|
+
const vaultStatePda = utils_1.SolanaUtils.deriveVaultStatePda(_vaultProgramId);
|
|
139
|
+
const vaultTokenAtaPda = utils_1.SolanaUtils.deriveVaultTokenAtaPda(_vaultProgramId, _depositMint);
|
|
140
|
+
const shareMintPda = utils_1.SolanaUtils.deriveShareMintPda(_vaultProgramId);
|
|
141
|
+
const shareMintInfo = await connection.getParsedAccountInfo(shareMintPda);
|
|
142
|
+
if (!shareMintInfo.value) {
|
|
143
|
+
throw new Error('Could not fetch share mint info');
|
|
144
|
+
}
|
|
145
|
+
const shareDecimals = shareMintInfo.value.data.parsed.info
|
|
146
|
+
.decimals;
|
|
147
|
+
const redeemSharesStr = redeemShares.toString();
|
|
148
|
+
const [whole, fraction = ''] = redeemSharesStr.split('.');
|
|
149
|
+
const paddedFraction = fraction
|
|
150
|
+
.padEnd(shareDecimals, '0')
|
|
151
|
+
.slice(0, shareDecimals);
|
|
152
|
+
const rawAmountStr = whole + paddedFraction;
|
|
153
|
+
const redeemSharesRaw = parseInt(rawAmountStr.replace(/^0+/, '') || '0', 10);
|
|
154
|
+
if (isNaN(redeemShares)) {
|
|
155
|
+
throw new Error('Please enter a valid number for the shares to redeem');
|
|
156
|
+
}
|
|
157
|
+
if (redeemShares <= 0) {
|
|
158
|
+
throw new Error('Shares to redeem must be greater than 0');
|
|
159
|
+
}
|
|
160
|
+
const userTokenAccounts = await connection.getParsedTokenAccountsByOwner(_publicKey, {
|
|
161
|
+
mint: _depositMint,
|
|
162
|
+
});
|
|
163
|
+
const userShareAccounts = await connection.getParsedTokenAccountsByOwner(_publicKey, {
|
|
164
|
+
mint: shareMintPda,
|
|
165
|
+
});
|
|
166
|
+
if (userTokenAccounts.value.length === 0) {
|
|
167
|
+
throw new Error('No token account found for deposit mint. Please create a token account first.');
|
|
168
|
+
}
|
|
169
|
+
if (userShareAccounts.value.length === 0) {
|
|
170
|
+
throw new Error('No share account found. You need to deposit first to get shares before you can redeem.');
|
|
171
|
+
}
|
|
172
|
+
const senderTokenAccount = userTokenAccounts?.value[0]?.pubkey;
|
|
173
|
+
const senderShareAccount = userShareAccounts?.value[0]?.pubkey;
|
|
174
|
+
const readOnlyProvider = utils_1.SolanaUtils.getReadOnlyProvider({ connection });
|
|
175
|
+
const readOnlyProgram = utils_1.SolanaUtils.getProgram({
|
|
176
|
+
provider: readOnlyProvider,
|
|
177
|
+
idl,
|
|
178
|
+
});
|
|
179
|
+
const vaultStateData = await readOnlyProgram.account.vaultState.fetch(vaultStatePda);
|
|
180
|
+
const feeRecipientTokenAccount = await (0, spl_token_1.getAssociatedTokenAddress)(_depositMint, vaultStateData.feeRecipient);
|
|
181
|
+
const feeRecipientAccountInfo = await connection.getAccountInfo(feeRecipientTokenAccount);
|
|
182
|
+
if (!feeRecipientAccountInfo) {
|
|
183
|
+
const createFeeRecipientAtaIx = (0, spl_token_1.createAssociatedTokenAccountInstruction)(_publicKey, feeRecipientTokenAccount, vaultStateData.feeRecipient, _depositMint);
|
|
184
|
+
const createAccountTx = new web3_js_1.Transaction().add(createFeeRecipientAtaIx);
|
|
185
|
+
const createAccountSignature = await sendTransaction(createAccountTx, connection);
|
|
186
|
+
console.log('Fee recipient token account created:', createAccountSignature);
|
|
187
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.log('Fee recipient token account already exists');
|
|
191
|
+
}
|
|
192
|
+
console.log('\n\nRedeem TX Params:\n');
|
|
193
|
+
console.log('Redeem shares (UI):', redeemShares);
|
|
194
|
+
console.log('Redeem shares (raw):', redeemSharesRaw);
|
|
195
|
+
console.log('Share decimals:', shareDecimals);
|
|
196
|
+
console.log('Vault state PDA:', vaultStatePda.toBase58());
|
|
197
|
+
console.log('Vault token ATA PDA:', vaultTokenAtaPda.toBase58());
|
|
198
|
+
console.log('Sender token account:', senderTokenAccount?.toBase58());
|
|
199
|
+
console.log('Sender share account:', senderShareAccount?.toBase58());
|
|
200
|
+
console.log('Fee recipient account:', feeRecipientTokenAccount.toBase58());
|
|
201
|
+
console.log('Share mint PDA:', shareMintPda.toBase58());
|
|
202
|
+
console.log('Deposit mint:', _depositMint?.toBase58());
|
|
203
|
+
console.log('Signer:', _publicKey.toBase58());
|
|
204
|
+
const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('confirmed');
|
|
205
|
+
const tx = await program.methods
|
|
206
|
+
.redeem(new anchor_1.BN(redeemSharesRaw))
|
|
207
|
+
.accounts({
|
|
208
|
+
vaultState: vaultStatePda,
|
|
209
|
+
vaultDepositAta: vaultTokenAtaPda,
|
|
210
|
+
senderTokenAccount,
|
|
211
|
+
senderShareAccount,
|
|
212
|
+
feeRecipientAccount: feeRecipientTokenAccount,
|
|
213
|
+
shareMint: shareMintPda,
|
|
214
|
+
depositMint: _depositMint,
|
|
215
|
+
signer: _publicKey,
|
|
216
|
+
tokenProgram: spl_token_1.TOKEN_PROGRAM_ID,
|
|
217
|
+
})
|
|
218
|
+
.rpc({
|
|
219
|
+
skipPreflight: false,
|
|
220
|
+
preflightCommitment: 'confirmed',
|
|
221
|
+
});
|
|
222
|
+
console.log('Redeem successful:', tx);
|
|
223
|
+
await connection.confirmTransaction({
|
|
224
|
+
signature: tx,
|
|
225
|
+
blockhash,
|
|
226
|
+
lastValidBlockHeight,
|
|
227
|
+
}, 'confirmed');
|
|
228
|
+
return tx;
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
console.error('Redeem failed:', e);
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=vault.actions.js.map
|