Skip to content

Commit 7c396e9

Browse files
authored
Add PerpV2LeverageModule factory and Wrapper/tests (#100)
1 parent 55c0e6c commit 7c396e9

File tree

4 files changed

+205
-5
lines changed

4 files changed

+205
-5
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
"@0xproject/types": "^1.1.4",
5959
"@0xproject/typescript-typings": "^3.0.2",
6060
"@0xproject/utils": "^2.0.2",
61-
"@setprotocol/set-protocol-v2": "^0.1.8",
61+
"@setprotocol/set-protocol-v2": "^0.1.9",
6262
"@types/chai-as-promised": "^7.1.3",
6363
"@types/jest": "^26.0.5",
6464
"@types/web3": "^1.2.2",

src/wrappers/set-protocol-v2/ContractWrapper.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
StreamingFeeModule,
3333
TradeModule,
3434
NavIssuanceModule,
35+
PerpV2LeverageModule,
3536
PriceOracle,
3637
} from '@setprotocol/set-protocol-v2/typechain';
3738
import { BasicIssuanceModule__factory } from '@setprotocol/set-protocol-v2/dist/typechain/factories/BasicIssuanceModule__factory';
@@ -46,6 +47,7 @@ import { SetTokenCreator__factory } from '@setprotocol/set-protocol-v2/dist/type
4647
import { StreamingFeeModule__factory } from '@setprotocol/set-protocol-v2/dist/typechain/factories/StreamingFeeModule__factory';
4748
import { TradeModule__factory } from '@setprotocol/set-protocol-v2/dist/typechain/factories/TradeModule__factory';
4849
import { NavIssuanceModule__factory } from '@setprotocol/set-protocol-v2/dist/typechain/factories/NavIssuanceModule__factory';
50+
import { PerpV2LeverageModule__factory } from '@setprotocol/set-protocol-v2/dist/typechain/factories/PerpV2LeverageModule__factory';
4951
import { PriceOracle__factory } from '@setprotocol/set-protocol-v2/dist/typechain/factories/PriceOracle__factory';
5052

5153
/**
@@ -421,4 +423,31 @@ export default class ContractWrapper {
421423
return slippageIssuanceModuleContract;
422424
}
423425
}
426+
427+
/**
428+
* Load PerpV2LeverageModule contract
429+
*
430+
* @param perpV2LeverageModuleAddress Address of the Perp V2 Leverage module
431+
* @param callerAddress Address of caller, uses first one on node if none provided.
432+
* @return PerpV2LeverageModule contract instance
433+
*/
434+
public async loadPerpV2LeverageModuleAsync(
435+
perpV2LeverageModuleAddress: Address,
436+
callerAddress?: Address,
437+
): Promise<PerpV2LeverageModule> {
438+
const signer = (this.provider as JsonRpcProvider).getSigner(callerAddress);
439+
const cacheKey = `PerpV2LeverageModule_${perpV2LeverageModuleAddress}_${await signer.getAddress()}`;
440+
441+
if (cacheKey in this.cache) {
442+
return this.cache[cacheKey] as PerpV2LeverageModule;
443+
} else {
444+
const perpV2LeverageModuleContract = PerpV2LeverageModule__factory.connect(
445+
perpV2LeverageModuleAddress,
446+
signer
447+
);
448+
449+
this.cache[cacheKey] = perpV2LeverageModuleContract;
450+
return perpV2LeverageModuleContract;
451+
}
452+
}
424453
}
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
/*
2+
Copyright 2022 Set Labs Inc.
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
http://www.apache.org/licenses/LICENSE-2.0
7+
Unless required by applicable law or agreed to in writing, software
8+
distributed under the License is distributed on an "AS IS" BASIS,
9+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
See the License for the specific language governing permissions and
11+
limitations under the License.
12+
*/
13+
14+
'use strict';
15+
16+
import { Address } from '@setprotocol/set-protocol-v2/utils/types';
17+
import { BigNumber, ContractTransaction } from 'ethers';
18+
import { TransactionOverrides } from '@setprotocol/set-protocol-v2/dist/typechain';
19+
import { Provider } from '@ethersproject/providers';
20+
import { generateTxOpts } from '../../utils/transactions';
21+
22+
import ContractWrapper from './ContractWrapper';
23+
24+
/**
25+
* @title PerpV2LeverageModuleWrapper
26+
* @author Set Protocol
27+
*
28+
* The PerpV2LeverageModuleWrapper forwards functionality from the PerpV2LeverageModule contract.
29+
*
30+
*/
31+
export default class PerpV2LeverageModuleWrapper {
32+
private provider: Provider;
33+
private contracts: ContractWrapper;
34+
35+
private perpV2LeverageModuleAddress: Address;
36+
37+
public constructor(provider: Provider, perpV2LeverageModuleAddress: Address) {
38+
this.provider = provider;
39+
this.contracts = new ContractWrapper(this.provider);
40+
this.perpV2LeverageModuleAddress = perpV2LeverageModuleAddress;
41+
}
42+
43+
/**
44+
* Initializes this module to the SetToken. Only callable by the SetToken's manager.
45+
*
46+
* @param setTokenAddress Address of the SetToken to initialize
47+
* @param callerAddress Address of caller (optional)
48+
* @param txOpts Overrides for transaction (optional)
49+
*/
50+
public async initialize(
51+
setTokenAddress: Address,
52+
callerAddress: Address = undefined,
53+
txOpts: TransactionOverrides = {}
54+
): Promise<ContractTransaction> {
55+
const txOptions = await generateTxOpts(txOpts);
56+
const perpV2LeverageModuleInstance = await this.contracts.loadPerpV2LeverageModuleAsync(
57+
this.perpV2LeverageModuleAddress,
58+
callerAddress
59+
);
60+
61+
return await perpV2LeverageModuleInstance.initialize(
62+
setTokenAddress,
63+
txOptions,
64+
);
65+
}
66+
67+
/**
68+
* Gets the address of the collateral token
69+
*
70+
* @param callerAddress Address of the method caller
71+
* @return The address of the ERC20 collateral token
72+
*/
73+
public async collateralToken(
74+
callerAddress: Address = undefined,
75+
): Promise<Address> {
76+
const perpV2LeverageModuleInstance = await this.contracts.loadPerpV2LeverageModuleAsync(
77+
this.perpV2LeverageModuleAddress,
78+
callerAddress
79+
);
80+
81+
return await perpV2LeverageModuleInstance.collateralToken();
82+
}
83+
84+
/**
85+
* Gets decimals of the collateral token
86+
*
87+
* @param callerAddress Address of the method caller
88+
* @return The decimals of the ERC20 collateral token
89+
*/
90+
public async collateralDecimals(
91+
callerAddress: Address = undefined,
92+
): Promise<Number> {
93+
const perpV2LeverageModuleInstance = await this.contracts.loadPerpV2LeverageModuleAsync(
94+
this.perpV2LeverageModuleAddress,
95+
callerAddress
96+
);
97+
98+
return await perpV2LeverageModuleInstance.collateralDecimals();
99+
}
100+
101+
/**
102+
* Returns a PositionUnitNotionalInfo array representing all positions open for the SetToken.
103+
*
104+
* @param _setToken Instance of SetToken
105+
*
106+
* @return address[] baseToken: addresses
107+
* @return BigNumber[] baseBalance: baseToken balances as notional quantity (10**18)
108+
* @return BigNumber[] quoteBalance: USDC quote asset balances as notional quantity (10**18)
109+
*/
110+
public async getPositionNotionalInfo(
111+
setTokenAddress: Address,
112+
callerAddress: Address = undefined,
113+
): Promise<(Address|BigNumber)[][]> {
114+
const perpV2LeverageModuleInstance = await this.contracts.loadPerpV2LeverageModuleAsync(
115+
this.perpV2LeverageModuleAddress,
116+
callerAddress
117+
);
118+
119+
return await perpV2LeverageModuleInstance.getPositionNotionalInfo(
120+
setTokenAddress,
121+
);
122+
}
123+
124+
/**
125+
* Returns a PositionUnitInfo array representing all positions open for the SetToken.
126+
*
127+
* @param _setToken Instance of SetToken
128+
*
129+
* @return address[] baseToken: addresses
130+
* @return BigNumber[] baseUnit: baseToken balances as position unit (10**18)
131+
* @return BigNumber[] quoteUnit: USDC quote asset balances as position unit (10**18)
132+
*/
133+
public async getPositionUnitInfo(
134+
setTokenAddress: Address,
135+
callerAddress: Address = undefined,
136+
): Promise<(Address|BigNumber)[][]> {
137+
const perpV2LeverageModuleInstance = await this.contracts.loadPerpV2LeverageModuleAsync(
138+
this.perpV2LeverageModuleAddress,
139+
callerAddress
140+
);
141+
142+
return await perpV2LeverageModuleInstance.getPositionUnitInfo(
143+
setTokenAddress,
144+
);
145+
}
146+
147+
/**
148+
* Gets Perp account info for SetToken. Returns an AccountInfo struct containing account wide
149+
* (rather than position specific) balance info
150+
*
151+
* @param _setToken Instance of the SetToken
152+
*
153+
* @return BigNumber collateral balance (10**18, regardless of underlying collateral decimals)
154+
* @return BigNumber owed realized Pnl` (10**18)
155+
* @return BigNumber pending funding payments (10**18)
156+
* @return BigNumber net quote balance (10**18)
157+
*/
158+
public async getAccountInfo(
159+
setTokenAddress: Address,
160+
callerAddress: Address = undefined,
161+
): Promise<BigNumber[]> {
162+
const perpV2LeverageModuleInstance = await this.contracts.loadPerpV2LeverageModuleAsync(
163+
this.perpV2LeverageModuleAddress,
164+
callerAddress
165+
);
166+
167+
return await perpV2LeverageModuleInstance.getAccountInfo(
168+
setTokenAddress,
169+
);
170+
}
171+
}

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,10 +1016,10 @@
10161016
resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz#371c67ebffe50f551c3146a9eec5fe6ffe862e92"
10171017
integrity sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==
10181018

1019-
"@setprotocol/set-protocol-v2@^0.1.8":
1020-
version "0.1.8"
1021-
resolved "https://registry.yarnpkg.com/@setprotocol/set-protocol-v2/-/set-protocol-v2-0.1.8.tgz#d936be0807edd7fdfd6310b124fd6f28f63d950e"
1022-
integrity sha512-4Tu+UGfJjpHwVZukE9WnA1gke7DR7ba48LY/A66Z87yQDs+I/VfRE9lG5yCL7g8SpOpvQ2DoL9lq3NunsuITog==
1019+
"@setprotocol/set-protocol-v2@^0.1.9":
1020+
version "0.1.9"
1021+
resolved "https://registry.yarnpkg.com/@setprotocol/set-protocol-v2/-/set-protocol-v2-0.1.9.tgz#1b0eef8667d01405f0b259bc5129986e5db7b53b"
1022+
integrity sha512-sPbCD6ngw4yIosXyOT+ytFZbFeMyHNOgDA6hdhrXkllsSKoJ2thc9Y6SqzF5kCPkK+bKmVhNF+cMTDMX0lemZg==
10231023
dependencies:
10241024
"@uniswap/v3-sdk" "^3.5.1"
10251025
ethers "^5.5.2"

0 commit comments

Comments
 (0)