@dripfi/drip-sdk 1.4.14 → 1.4.15

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 CHANGED
@@ -431,6 +431,7 @@ type NonceEnrichedSignedPayload<T> = {
431
431
 
432
432
  type PerqConfig = {
433
433
  route: string;
434
+ spoolSdkConfig: SDKConfig;
434
435
  yelayLiteSdkConfig: sdkConfig;
435
436
  perqTokenAddress: string;
436
437
  perqTokenRecyclerAddress: string;
package/dist/PerqSdk.d.ts CHANGED
@@ -4,6 +4,7 @@ import PerqApi from './PerqApi';
4
4
  import { PerqSwapAndRecyclerContract, PerqTokenRecyclerContract, PerqVestingContract } from './contracts';
5
5
  import VestingPackage from './subpackages/VestingPackage';
6
6
  import LitePackage from './subpackages/LitePackage';
7
+ import V2Package from './subpackages/V2Package';
7
8
  import RecyclerPackage from './subpackages/RecyclerPackage';
8
9
  import LoyaltyCardsPackage from './subpackages/LoyaltyCardsPackage';
9
10
  import { YelayLiteSdk } from '@yelay-lite/sdk';
@@ -17,6 +18,7 @@ export default class PerqSdk {
17
18
  perqApi: PerqApi;
18
19
  signer?: Signer;
19
20
  lite: LitePackage;
21
+ v2: V2Package;
20
22
  vesting: VestingPackage;
21
23
  recycler: RecyclerPackage;
22
24
  loyaltyCards: LoyaltyCardsPackage;
package/dist/PerqSdk.js CHANGED
@@ -7,6 +7,7 @@ const PerqApi_1 = __importDefault(require("./PerqApi"));
7
7
  const contracts_1 = require("./contracts");
8
8
  const VestingPackage_1 = __importDefault(require("./subpackages/VestingPackage"));
9
9
  const LitePackage_1 = __importDefault(require("./subpackages/LitePackage"));
10
+ const V2Package_1 = __importDefault(require("./subpackages/V2Package"));
10
11
  const RecyclerPackage_1 = __importDefault(require("./subpackages/RecyclerPackage"));
11
12
  const LoyaltyCardsPackage_1 = __importDefault(require("./subpackages/LoyaltyCardsPackage"));
12
13
  const sdk_1 = require("@yelay-lite/sdk");
@@ -19,6 +20,7 @@ class PerqSdk {
19
20
  perqApi;
20
21
  signer;
21
22
  lite;
23
+ v2;
22
24
  vesting;
23
25
  recycler;
24
26
  loyaltyCards;
@@ -42,6 +44,7 @@ class PerqSdk {
42
44
  }
43
45
  this.vesting = new VestingPackage_1.default(this);
44
46
  this.lite = new LitePackage_1.default(this);
47
+ this.v2 = new V2Package_1.default(this);
45
48
  this.recycler = new RecyclerPackage_1.default(this);
46
49
  this.loyaltyCards = new LoyaltyCardsPackage_1.default(this);
47
50
  this.tokenUtils = new TokenUtilsPackage_1.default(this);
@@ -0,0 +1,24 @@
1
+ import { UserVaultBalance, VaultData } from '../types';
2
+ import PerqSdk from '../PerqSdk';
3
+ export default class V2Package {
4
+ perqSdk: PerqSdk;
5
+ constructor(perqSdk: PerqSdk);
6
+ getPoolDetails(vaultAddress: string): Promise<VaultData>;
7
+ newDeposit(tokenAddress: string, vaultAddress: string, amount: string): Promise<string>;
8
+ deposit(tokenAddress: string, vaultAddress: string, amount: string): Promise<string>;
9
+ private doDeposit;
10
+ getSwapAndDepositTokenAllowanceForCurrency(tokenAddress: string): Promise<string>;
11
+ getExpectedSwapResult(fromTokenAddress: string, toTokenAddress: string, amount: string, decimals: number): Promise<string>;
12
+ getUserPoolBalance(vaultAddress: string): Promise<UserVaultBalance>;
13
+ fastWithdraw(vaultAddress: string, amountToWithdraw?: string): Promise<string>;
14
+ swapAndDeposit(fromTokenAddress: string, toTokenAddress: string, fromTokenAmount: string, vaultAddress: string, ethAmount?: string): Promise<string>;
15
+ newSwapAndDeposit(fromTokenAddress: string, toTokenAddress: string, fromTokenAmount: string, vaultAddress: string, ethAmount?: string): Promise<string>;
16
+ private doSwapAndDeposit;
17
+ withdraw(vaultAddress: string, amountToWithdraw?: string): Promise<string>;
18
+ claimWithdraws(vaultAddress: string): Promise<string>;
19
+ approveTokenForSwapAndDeposit(tokenAddress: string, amount: string): Promise<string>;
20
+ approveTokenForDeposit(tokenAddress: string, amount: string): Promise<string>;
21
+ private generateRedeemBagStruct;
22
+ private getTokenAllowanceForDeposit;
23
+ getTokenAllowanceForCurrency(tokenAddress: string): Promise<string>;
24
+ }
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ethers_1 = require("ethers");
7
+ const ERC20TokenContract_1 = __importDefault(require("../contracts/ERC20TokenContract"));
8
+ const ChainId_1 = require("../types/ChainId");
9
+ class V2Package {
10
+ perqSdk;
11
+ constructor(perqSdk) {
12
+ this.perqSdk = perqSdk;
13
+ }
14
+ async getPoolDetails(vaultAddress) {
15
+ return this.perqSdk.perqApi.fetchPoolV2Details(vaultAddress);
16
+ }
17
+ async newDeposit(tokenAddress, vaultAddress, amount) {
18
+ return this.doDeposit(tokenAddress, vaultAddress, amount, false);
19
+ }
20
+ async deposit(tokenAddress, vaultAddress, amount) {
21
+ return this.doDeposit(tokenAddress, vaultAddress, amount, true);
22
+ }
23
+ async doDeposit(tokenAddress, vaultAddress, amount, checkAllowance) {
24
+ if (!this.perqSdk.signer) {
25
+ throw Error('No signer provided');
26
+ }
27
+ const tokenContract = new ERC20TokenContract_1.default(tokenAddress, this.perqSdk.signer);
28
+ const decimals = await tokenContract.getPrecission();
29
+ const amountWithDecimals = parseFloat(parseFloat(amount).toFixed(decimals));
30
+ if (checkAllowance) {
31
+ const allowance = await tokenContract.getAllowance(await this.perqSdk.signer.getAddress(), this.perqSdk.perqConfig.smartVaultManagerContractAddress);
32
+ const currentTokenAllowance = parseFloat(ethers_1.ethers.utils.formatUnits(allowance, decimals));
33
+ if (amountWithDecimals > currentTokenAllowance) {
34
+ await this.approveTokenForDeposit(tokenAddress, amountWithDecimals.toString());
35
+ }
36
+ }
37
+ const amountToDeposit = ethers_1.ethers.utils.parseUnits(amountWithDecimals.toString(), decimals);
38
+ const signerAddress = await this.perqSdk.signer.getAddress();
39
+ if (!signerAddress) {
40
+ throw Error('Error fetching address');
41
+ }
42
+ const depositBagStruct = {
43
+ smartVault: vaultAddress.toLowerCase(),
44
+ assets: [amountToDeposit],
45
+ receiver: signerAddress,
46
+ referral: ethers_1.ethers.constants.AddressZero,
47
+ doFlush: false,
48
+ };
49
+ const depositTx = await this.perqSdk.spoolSdk.deposit(depositBagStruct);
50
+ const txReceipt = await depositTx.wait();
51
+ return txReceipt.transactionHash;
52
+ }
53
+ async getSwapAndDepositTokenAllowanceForCurrency(tokenAddress) {
54
+ if (!this.perqSdk.signer) {
55
+ throw Error('No signer provided');
56
+ }
57
+ const tokenContract = new ERC20TokenContract_1.default(tokenAddress, this.perqSdk.signer);
58
+ const allowance = await tokenContract.getAllowance(await this.perqSdk.signer.getAddress(), this.perqSdk.perqConfig.swapAndDepositContractAddress);
59
+ return allowance.toString();
60
+ }
61
+ async getExpectedSwapResult(fromTokenAddress, toTokenAddress, amount, decimals) {
62
+ return this.perqSdk.perqApi.getExpectedSwapResult(fromTokenAddress, toTokenAddress, amount, decimals, ChainId_1.ETHEREUM_CHAIN_ID.toString());
63
+ }
64
+ async getUserPoolBalance(vaultAddress) {
65
+ if (!this.perqSdk.signer) {
66
+ throw Error('No signer provided');
67
+ }
68
+ const userAddress = await this.perqSdk.signer.getAddress();
69
+ return await this.perqSdk.perqApi.fetchV2PoolUserBalance(userAddress.toLowerCase(), vaultAddress.toLowerCase());
70
+ }
71
+ async fastWithdraw(vaultAddress, amountToWithdraw) {
72
+ if (!this.perqSdk.signer) {
73
+ throw Error('No signer provided');
74
+ }
75
+ const userAddress = await this.perqSdk.signer.getAddress();
76
+ const vault = await this.getPoolDetails(vaultAddress);
77
+ const redeemBagStruct = await this.generateRedeemBagStruct(vault, userAddress, amountToWithdraw);
78
+ const currentBlockNumber = await this.perqSdk.signer.provider?.getBlockNumber();
79
+ if (!currentBlockNumber) {
80
+ throw Error('Error fetching block number');
81
+ }
82
+ const redeemTx = await this.perqSdk.spoolSdk?.redeemFast(redeemBagStruct, userAddress, currentBlockNumber);
83
+ const txReceipt = await redeemTx.wait();
84
+ return txReceipt.transactionHash;
85
+ }
86
+ async swapAndDeposit(fromTokenAddress, toTokenAddress, fromTokenAmount, vaultAddress, ethAmount) {
87
+ return this.doSwapAndDeposit(fromTokenAddress, toTokenAddress, fromTokenAmount, vaultAddress, true, ethAmount);
88
+ }
89
+ async newSwapAndDeposit(fromTokenAddress, toTokenAddress, fromTokenAmount, vaultAddress, ethAmount) {
90
+ return this.doSwapAndDeposit(fromTokenAddress, toTokenAddress, fromTokenAmount, vaultAddress, false, ethAmount);
91
+ }
92
+ async doSwapAndDeposit(fromTokenAddress, toTokenAddress, fromTokenAmount, vaultAddress, checkAllowance, ethAmount) {
93
+ if (!this.perqSdk.signer) {
94
+ throw Error('No signer provided');
95
+ }
96
+ const userAddress = await this.perqSdk.signer.getAddress();
97
+ const tokenContract = new ERC20TokenContract_1.default(fromTokenAddress, this.perqSdk.signer);
98
+ const decimals = await tokenContract.getPrecission();
99
+ const amountWithDecimals = parseFloat(parseFloat(fromTokenAmount).toFixed(decimals));
100
+ if (amountWithDecimals > 0 && checkAllowance) {
101
+ const allowance = await tokenContract.getAllowance(await this.perqSdk.signer.getAddress(), this.perqSdk.perqConfig.swapAndDepositContractAddress);
102
+ const currentTokenAllowance = parseFloat(ethers_1.ethers.utils.formatUnits(allowance, decimals));
103
+ if (amountWithDecimals > currentTokenAllowance) {
104
+ await this.approveTokenForSwapAndDeposit(fromTokenAddress, amountWithDecimals.toString());
105
+ }
106
+ }
107
+ const fromToken = ethers_1.ethers.utils.parseUnits(amountWithDecimals.toString(), decimals);
108
+ const swapInfo = await this.perqSdk.perqApi.getSwapInfo(fromTokenAddress, toTokenAddress, fromToken, this.perqSdk.perqConfig.ethereumSwapperAddress, ChainId_1.ETHEREUM_CHAIN_ID);
109
+ const swapDepositBagStruct = {
110
+ inTokens: [fromTokenAddress],
111
+ inAmounts: [fromToken],
112
+ smartVault: vaultAddress.toLowerCase(),
113
+ swapInfo,
114
+ receiver: userAddress,
115
+ referral: ethers_1.ethers.constants.AddressZero,
116
+ doFlush: false,
117
+ };
118
+ const swapAndDepositRequest = ethAmount
119
+ ? await this.perqSdk.spoolSdk.swapAndDeposit(swapDepositBagStruct, {
120
+ value: ethers_1.ethers.utils.parseEther(ethAmount),
121
+ })
122
+ : await this.perqSdk.spoolSdk.swapAndDeposit(swapDepositBagStruct);
123
+ const txReceipt = await swapAndDepositRequest.wait();
124
+ return txReceipt?.transactionHash;
125
+ }
126
+ async withdraw(vaultAddress, amountToWithdraw) {
127
+ if (!this.perqSdk.signer) {
128
+ throw Error('No signer provided');
129
+ }
130
+ const userAddress = await this.perqSdk.signer.getAddress();
131
+ const vault = await this.getPoolDetails(vaultAddress);
132
+ const redeemBagStruct = await this.generateRedeemBagStruct(vault, userAddress, amountToWithdraw);
133
+ const redeemTx = await this.perqSdk.spoolSdk.redeem(redeemBagStruct, userAddress, false);
134
+ const redeemTxReceipt = await redeemTx.wait();
135
+ return redeemTxReceipt.transactionHash;
136
+ }
137
+ async claimWithdraws(vaultAddress) {
138
+ if (!this.perqSdk.signer) {
139
+ throw Error('No signer provided');
140
+ }
141
+ const userAddress = await this.perqSdk.signer.getAddress();
142
+ const wnfts = await this.perqSdk.perqApi.fetchEnrichedUserWNFTForPool(vaultAddress, userAddress);
143
+ //! Shares come as Strings instead of BigNumber from our Backend
144
+ const nftIds = wnfts
145
+ .filter((item) => !item.isBurned && ethers_1.BigNumber.from(item.shares).gt(ethers_1.BigNumber.from('0')) && item.isDHWFinished)
146
+ .map((item) => item.nftId.toString());
147
+ const nftAmounts = wnfts
148
+ .filter((item) => !item.isBurned && ethers_1.BigNumber.from(item.shares).gt(ethers_1.BigNumber.from('0')) && item.isDHWFinished)
149
+ .map((item) => item.shares.toString());
150
+ const claimWithdrawTx = await this.perqSdk.spoolSdk.claimWithdrawal(vaultAddress.toLowerCase(), nftIds, nftAmounts, userAddress);
151
+ const txReceipt = await claimWithdrawTx.wait();
152
+ return txReceipt.transactionHash;
153
+ }
154
+ async approveTokenForSwapAndDeposit(tokenAddress, amount) {
155
+ if (!this.perqSdk.signer) {
156
+ throw Error('No signer provided');
157
+ }
158
+ const tokenContract = new ERC20TokenContract_1.default(tokenAddress, this.perqSdk.signer);
159
+ const decimals = await tokenContract.getPrecission();
160
+ const parsedAmount = ethers_1.ethers.utils.parseUnits(amount, decimals);
161
+ return await tokenContract.approveToken(this.perqSdk.perqConfig.swapAndDepositContractAddress, parsedAmount);
162
+ }
163
+ async approveTokenForDeposit(tokenAddress, amount) {
164
+ if (!this.perqSdk.signer) {
165
+ throw Error('No signer provided');
166
+ }
167
+ const tokenContract = new ERC20TokenContract_1.default(tokenAddress, this.perqSdk.signer);
168
+ const decimals = await tokenContract.getPrecission();
169
+ const parsedAmount = ethers_1.ethers.utils.parseUnits(amount, decimals);
170
+ return await tokenContract.approveToken(this.perqSdk.perqConfig.smartVaultManagerContractAddress, parsedAmount);
171
+ }
172
+ async generateRedeemBagStruct(vault, signerAddress, amountToWithdraw) {
173
+ if (!this.perqSdk.spoolSdk) {
174
+ throw Error('No spool sdk provided');
175
+ }
176
+ const isFullWithdraw = !amountToWithdraw;
177
+ if (isFullWithdraw) {
178
+ return this.perqSdk.spoolSdk.views.userInfo.getMaxRedeemBag({
179
+ userAddress: signerAddress.toLowerCase(),
180
+ vaultAddress: vault.vaultAddress.toLowerCase(),
181
+ });
182
+ }
183
+ else {
184
+ return this.perqSdk.spoolSdk.views.userInfo.getMinimumBurnRedeemBag({
185
+ userAddress: signerAddress.toLowerCase(),
186
+ vaultAddress: vault.vaultAddress.toLowerCase(),
187
+ assetsToWithdraw: [Number(amountToWithdraw)],
188
+ });
189
+ }
190
+ }
191
+ async getTokenAllowanceForDeposit(tokenAddress) {
192
+ if (!this.perqSdk.signer) {
193
+ throw Error('No signer provided');
194
+ }
195
+ const tokenContract = new ERC20TokenContract_1.default(tokenAddress, this.perqSdk.signer);
196
+ const allowance = await tokenContract.getAllowance(await this.perqSdk.signer.getAddress(), this.perqSdk.perqConfig.smartVaultManagerContractAddress);
197
+ return allowance;
198
+ }
199
+ async getTokenAllowanceForCurrency(tokenAddress) {
200
+ if (!this.perqSdk.signer) {
201
+ throw Error('No signer provided');
202
+ }
203
+ const currentTokenAllowance = await this.getTokenAllowanceForDeposit(tokenAddress);
204
+ return currentTokenAllowance.toString();
205
+ }
206
+ }
207
+ exports.default = V2Package;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dripfi/drip-sdk",
3
- "version": "1.4.14",
3
+ "version": "1.4.15",
4
4
  "description": "Drip SDK",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",