|
1 |
| -import { Connection, Keypair, Transaction, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'; |
2 |
| -import BN from 'bn.js'; |
3 |
| -import * as anchor from '@project-serum/anchor'; |
4 |
| -import { parseReserve, SolendAction, SolendMarket, SolendWallet } from "../src"; |
| 1 | +import { |
| 2 | + Connection, |
| 3 | + PublicKey, |
| 4 | +} from "@solana/web3.js"; |
| 5 | +import { parseObligation } from "../src"; |
5 | 6 |
|
6 | 7 | jest.setTimeout(50_000);
|
7 | 8 |
|
8 |
| -describe("calculate", function () { |
9 |
| - it ('parses reserves', async function() { |
10 |
| - |
11 |
| - const connection = new Connection('https://api.mainnet-beta.solana.com', { |
12 |
| - commitment: "finalized", |
13 |
| - }); |
14 |
| - |
15 |
| - const reserve = await connection.getAccountInfo(new PublicKey('CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6')); |
16 |
| - |
17 |
| - const parsedReserveData = parseReserve(new PublicKey('CCpirWrgNuBVLdkP2haxLTbD6XqEgaYuVXixbbpxUB6'), reserve!); |
18 |
| - expect(parsedReserveData!.info.liquidity.pythOracle).not.toBeUndefined(); |
19 |
| - expect(parsedReserveData!.info.liquidity.switchboardOracle).not.toBeUndefined(); |
20 |
| - }); |
21 |
| - |
22 |
| - it("reads wallet", async function () { |
23 |
| - const connection = new Connection('https://api.mainnet-beta.solana.com', { |
24 |
| - commitment: "finalized", |
25 |
| - }); |
26 |
| - |
27 |
| - const keypair = Keypair.generate(); |
28 |
| - const wallet = new anchor.Wallet(keypair); |
29 |
| - const solendWallet = await SolendWallet.initialize( |
30 |
| - wallet, |
31 |
| - connection, |
32 |
| - ); |
33 |
| - |
34 |
| - const [setupIxs, claimIxs] = await solendWallet.getClaimAllIxs(); |
35 |
| - |
36 |
| - expect([...setupIxs, ...claimIxs].length).toEqual(0); |
37 |
| - }); |
38 |
| - |
39 |
| - it("reads solend main market", async function () { |
40 |
| - const connection = new Connection('https://api.mainnet-beta.solana.com', { |
41 |
| - commitment: "finalized", |
42 |
| - }); |
43 |
| - |
44 |
| - const market = await SolendMarket.initialize( |
45 |
| - connection |
46 |
| - ); |
47 |
| - await market.loadReserves(); |
48 |
| - await market.loadRewards(); |
49 |
| - const reserve = market.reserves.find(res => res.config.liquidityToken.symbol === 'USDC'); |
50 |
| - |
51 |
| - expect(reserve!.stats!.decimals).toEqual(6); |
52 |
| - expect(reserve!.stats!.protocolTakeRate).toBeLessThanOrEqual(1); |
53 |
| - }); |
54 |
| - |
55 |
| - it("reads solend devnet", async function () { |
56 |
| - const connection = new Connection('https://api.devnet.solana.com', { |
57 |
| - commitment: "finalized", |
58 |
| - }); |
59 |
| - |
60 |
| - const market = await SolendMarket.initialize( |
61 |
| - connection, |
62 |
| - 'devnet' |
63 |
| - ); |
64 |
| - await market.loadReserves(); |
65 |
| - await market.loadRewards(); |
66 |
| - const reserve = market.reserves.find(res => res.config.liquidityToken.symbol === 'USDC'); |
67 |
| - |
68 |
| - expect(reserve!.stats!.decimals).toEqual(6); |
69 |
| - expect(reserve!.stats!.protocolTakeRate).toBeLessThanOrEqual(1); |
70 |
| - }); |
71 |
| - |
72 |
| - it("reads solend invictus market", async function () { |
73 |
| - const connection = new Connection('https://api.mainnet-beta.solana.com', { |
74 |
| - commitment: "finalized", |
75 |
| - }); |
76 |
| - |
77 |
| - const market = await SolendMarket.initialize( |
78 |
| - connection, |
79 |
| - 'production', |
80 |
| - '5i8SzwX2LjpGUxLZRJ8EiYohpuKgW2FYDFhVjhGj66P1', |
| 9 | +describe("check", function () { |
| 10 | + it("parses obligation in both formats", async function () { |
| 11 | + const zstdEncodedObligationData = Buffer.from( |
| 12 | + "KLUv/QBYLQoAdBEBWZHIBwAAAAABM7MexO/4+iia6oyVTAFjLi12SQjOVE1oZb3vERv/YSsChcZ+Ktz1mRBrkyRk1BwBK+MRLDs2kN6sQJrkE/068ae2QKj1GoAIagEAUiLO4HOtZQD9iDA+OBRghg/ZNGo1t+NsujMBAQFsp+C1qN6toMtzc12/wVf8DODwcnh4K7b1j6DEElE6V8esAGvgw8KAVqMAbcvwdUngHTQhP3KK2EcTtbcXhy+sOBPKuWOvMSyN283/9ZTFWnxCDgDvyiK06ZHhKd04ANAh+wRuI+ENjqkOBTFIeS9ID9NTKr93sO+769EA4idmIqc8x1Enq7K/tz3DwaHWY5RMvzQOIJZ5G4lBjXXPHRJX7vzRwA8SAM1yFQDEt5APgChdqyVY2VtAAS80LATg+oCsBCUWCFQgLRhoqHwAcXWBMw==", |
| 13 | + "base64" |
81 | 14 | );
|
82 |
| - await market.loadReserves(); |
83 |
| - await market.loadRewards(); |
84 |
| - const reserve = market.reserves.find(res => res.config.liquidityToken.symbol === 'USDC'); |
85 |
| - expect((await reserve!.totalBorrowAPY()).rewards).toEqual([]); |
86 |
| - expect(reserve!.stats!.optimalUtilizationRate).toEqual(0.8); |
87 |
| - }); |
88 |
| - |
89 |
| - it("reads permissionless", async function () { |
90 |
| - const connection = new Connection('https://api.mainnet-beta.solana.com', { |
91 |
| - commitment: "finalized", |
92 |
| - }); |
93 |
| - |
94 |
| - const market = await SolendMarket.initialize( |
95 |
| - connection, |
96 |
| - 'production', |
97 |
| - 'Ckya2fwCXDqTUg9fnWbajR6YLcSfQmPxxy5MyAoZXgyb', |
| 15 | + const base64EncodedObligationData = Buffer.from( |
| 16 | + "AVmRyAcAAAAAATOzHsTv+PoomuqMlUwBYy4tdkkIzlRNaGW97xEb/2ErAoXGfirc9ZkQa5MkZNQcASvjESw7NpDerECa5BP9OvGntkCo9RqACGoBAAAAAAAAUiLO4HOtZQAAAAAAAAAAAP2IMD44FGCGDwEAAAAAAADZNGo1t+NsujMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBbKfgtajeraDLc3Ndv8FX/Azg8HJ4eCu29Y+gxBJROlfHrAAAAAAAAGvgw8KAVqMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG3L8HVJ4B00IT9yithHE7W3F4cvrDgTyrljrzEsjdvN//WUxVp8Qg4AAAAAAAAAAO/KIrTpkeEp3TgAAAAAAABSIs7gc61lAAAAAAAAAAAAAAAAAAAAAABty/B1SeAdNCE/corYRxO1txeHL6w4E8q5Y68xLI3bzf/1lMVafEIOAAAAAAAAAADvyiK06ZHhKd04AAAAAAAAUiLO4HOtZQAAAAAAAAAAANAh+wQAAAAAbiPhDY6pDgUxAQAAAAAAAAAAAAAAAAAASHkvSA/TUyq/d7Dvu+vRAOInZiKnPMdRJ6uyv7c9w8Gh1mOUTL80DgAAAAAAAAAAIJZ5G4lBjXXPIfsEAAAAAB0SV+780cAPMQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", |
| 17 | + "base64" |
98 | 18 | );
|
99 |
| - await market.loadReserves(); |
100 |
| - await market.loadRewards(); |
101 |
| - const reserve = market.reserves.find(res => res.config.liquidityToken.symbol === 'SLND'); |
102 |
| - expect((await reserve!.totalBorrowAPY()).rewards).toEqual([]); |
103 |
| - expect(reserve!.stats!.optimalUtilizationRate).toEqual(0.8); |
104 |
| - }); |
105 | 19 |
|
106 |
| - it("performs a deposit", async function () { |
107 |
| - const connection = new Connection('https://api.devnet.solana.com', { |
| 20 | + const obligationPubkey = new PublicKey( |
| 21 | + "FfRLBU1gHm3MyqJ3KX6dBnsxxJtwVGCwKFwJrfDnceWN" |
| 22 | + ); |
| 23 | + const connection = new Connection("https://api.mainnet-beta.solana.com", { |
108 | 24 | commitment: "finalized",
|
109 | 25 | });
|
110 | 26 |
|
111 |
| - const depositAmount = new BN("1000"); |
112 |
| - |
113 |
| - const account = Keypair.generate(); |
114 |
| - |
115 |
| - const signature = await connection.requestAirdrop(account.publicKey, LAMPORTS_PER_SOL); |
116 |
| - await connection.confirmTransaction(signature); |
117 |
| - |
118 |
| - const solendAction = await SolendAction.buildDepositTxns( |
119 |
| - connection, |
120 |
| - depositAmount, |
121 |
| - "SOL", |
122 |
| - account.publicKey, |
123 |
| - "devnet" |
| 27 | + const zstdEncodedObligation = await connection.getAccountInfo( |
| 28 | + obligationPubkey |
124 | 29 | );
|
125 |
| - |
126 |
| - const sendTransaction = async (txn: Transaction, connection: Connection) => { |
127 |
| - const { blockhash } = await connection.getRecentBlockhash(); |
128 |
| - txn.recentBlockhash = blockhash; |
129 |
| - txn.feePayer = account.publicKey; |
130 |
| - txn.sign(account); |
131 |
| - return connection.sendRawTransaction(txn.serialize()); |
132 |
| - } |
133 |
| - |
134 |
| - const txHash = await solendAction.sendTransactions(sendTransaction); |
135 |
| - |
136 |
| - await connection.confirmTransaction(txHash, 'finalized'); |
137 |
| - |
138 |
| - const market = await SolendMarket.initialize( |
139 |
| - connection, |
140 |
| - 'devnet', |
| 30 | + zstdEncodedObligation!.data = zstdEncodedObligationData; |
| 31 | + const base64EncodedObligation = await connection.getAccountInfo( |
| 32 | + obligationPubkey |
141 | 33 | );
|
| 34 | + base64EncodedObligation!.data = base64EncodedObligationData; |
142 | 35 |
|
143 |
| - const obligation = await market.fetchObligationByWallet(account.publicKey); |
144 |
| - |
145 |
| - expect(obligation!.deposits[0].amount === depositAmount) |
146 |
| - }); |
147 |
| - |
148 |
| - // TODO update to a non-primary pool after another pool deployed to devnet |
149 |
| - it("performs a deposit to specific pool", async function () { |
150 |
| - const connection = new Connection('https://api.devnet.solana.com', { |
151 |
| - commitment: "finalized", |
152 |
| - }); |
153 |
| - |
154 |
| - const depositAmount = new BN("1000"); |
155 |
| - |
156 |
| - const account = Keypair.generate(); |
157 |
| - |
158 |
| - const signature = await connection.requestAirdrop(account.publicKey, LAMPORTS_PER_SOL); |
159 |
| - await connection.confirmTransaction(signature); |
160 |
| - |
161 |
| - const solendAction = await SolendAction.buildDepositTxns( |
162 |
| - connection, |
163 |
| - depositAmount, |
164 |
| - "SOL", |
165 |
| - account.publicKey, |
166 |
| - "devnet", |
167 |
| - new PublicKey("GvjoVKNjBvQcFaSKUW1gTE7DxhSpjHbE69umVR5nPuQp"), |
| 36 | + const parsedzstdEncodedObligation = parseObligation( |
| 37 | + obligationPubkey, |
| 38 | + zstdEncodedObligation!, |
| 39 | + "base64+zstd" |
168 | 40 | );
|
169 |
| - |
170 |
| - const sendTransaction = async (txn: Transaction, connection: Connection) => { |
171 |
| - const { blockhash } = await connection.getRecentBlockhash(); |
172 |
| - txn.recentBlockhash = blockhash; |
173 |
| - txn.feePayer = account.publicKey; |
174 |
| - txn.sign(account); |
175 |
| - return connection.sendRawTransaction(txn.serialize()); |
176 |
| - } |
177 |
| - |
178 |
| - const txHash = await solendAction.sendTransactions(sendTransaction); |
179 |
| - |
180 |
| - await connection.confirmTransaction(txHash, 'finalized'); |
181 |
| - |
182 |
| - const market = await SolendMarket.initialize( |
183 |
| - connection, |
184 |
| - 'devnet', |
| 41 | + const parsedbase64EncodedObligation = parseObligation( |
| 42 | + obligationPubkey, |
| 43 | + base64EncodedObligation! |
185 | 44 | );
|
186 | 45 |
|
187 |
| - const obligation = await market.fetchObligationByWallet(account.publicKey); |
188 |
| - |
189 |
| - expect(obligation!.deposits[0].amount === depositAmount) |
| 46 | + expect(parsedzstdEncodedObligation!).toMatchObject( |
| 47 | + parsedbase64EncodedObligation! |
| 48 | + ); |
190 | 49 | });
|
191 | 50 | });
|
0 commit comments