@aurigami/sdk 1.12.7 → 1.12.8
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/dist/helpers/historicalPriceFetcher.d.ts +15 -0
- package/dist/helpers/index.d.ts +1 -0
- package/dist/interactors/MoneyMarket.d.ts +2 -0
- package/dist/sdk.cjs.development.js +504 -82
- package/dist/sdk.cjs.development.js.map +1 -1
- package/dist/sdk.cjs.production.min.js +1 -1
- package/dist/sdk.cjs.production.min.js.map +1 -1
- package/dist/sdk.esm.js +516 -100
- package/dist/sdk.esm.js.map +1 -1
- package/package.json +2 -3
- package/src/consts/constants.ts +3 -0
- package/src/consts/decimals.ts +2 -0
- package/src/helpers/historicalPriceFetcher.ts +196 -0
- package/src/helpers/index.ts +1 -0
- package/src/interactors/MoneyMarket.ts +12 -0
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.12.
|
|
2
|
+
"version": "1.12.8",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"typings": "dist/index.d.ts",
|
|
@@ -30,8 +30,7 @@
|
|
|
30
30
|
"name": "@aurigami/sdk",
|
|
31
31
|
"author": "Aurigami Finance",
|
|
32
32
|
"module": "dist/sdk.esm.js",
|
|
33
|
-
"size-limit": [
|
|
34
|
-
{
|
|
33
|
+
"size-limit": [{
|
|
35
34
|
"path": "dist/sdk.cjs.production.min.js",
|
|
36
35
|
"limit": "300 KB"
|
|
37
36
|
},
|
package/src/consts/constants.ts
CHANGED
|
@@ -106,6 +106,9 @@ export const networkAddresses: NetworkAddresses = {
|
|
|
106
106
|
PULP: MAINNET_ADDRESSES.PULP.toLowerCase(),
|
|
107
107
|
PLYWNEAR: MAINNET_ADDRESSES.ply_wnear_lp.toLowerCase(),
|
|
108
108
|
USN: '0x5183e1b1091804bc2602586919e6880ac1cf2896'.toLowerCase(),
|
|
109
|
+
PLY_WNEAR: '0x044b6b0cd3bb13d2b9057781df4459c66781dce7'.toLowerCase(),
|
|
110
|
+
WNEAR_TRI: '0x84b123875f0f36b966d0b6ca14b31121bd9676ad'.toLowerCase(),
|
|
111
|
+
AURORA_WNEAR: '0x1e0e812fbcd3eb75d8562ad6f310ed94d258d008'.toLowerCase(),
|
|
109
112
|
},
|
|
110
113
|
};
|
|
111
114
|
|
package/src/consts/decimals.ts
CHANGED
|
@@ -22,4 +22,6 @@ export const decimalRecords: Record<string, number> = {
|
|
|
22
22
|
'0x04ac48711bcdc45b4d223fb021e09da73c71095e': 18, // PULP
|
|
23
23
|
'0x044b6b0cd3bb13d2b9057781df4459c66781dce7': 18, // PLYWNEAR
|
|
24
24
|
'0x5183e1b1091804bc2602586919e6880ac1cf2896': 18, // USN
|
|
25
|
+
'0x84b123875f0f36b966d0b6ca14b31121bd9676ad': 18, //WNEAR_TRI,
|
|
26
|
+
'0x1e0e812fbcd3eb75d8562ad6f310ed94d258d008': 18, //AURORA_WNEAR
|
|
25
27
|
};
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { IUniswapV2Pair, PriceOracle } from '@aurigami/contracts/typechain';
|
|
2
|
+
import BigNumber from 'bignumber.js';
|
|
3
|
+
import { BigNumber as BN, Contract, providers } from 'ethers';
|
|
4
|
+
import { AuriOracleABI, IUniswapV2PairABI } from '../abis';
|
|
5
|
+
import { HARDCODE_PRICE_TOKENS, networkAddresses } from '../consts/constants';
|
|
6
|
+
import { Address } from '../types';
|
|
7
|
+
import { decimalFactor, devLog, getDecimal, isSameAddress } from './helpers';
|
|
8
|
+
|
|
9
|
+
export async function fetchHistoricalLPPositions(
|
|
10
|
+
LPAddress: Address,
|
|
11
|
+
provider: providers.Provider,
|
|
12
|
+
block: number
|
|
13
|
+
): Promise<{
|
|
14
|
+
token0: Address;
|
|
15
|
+
token1: Address;
|
|
16
|
+
reserve0: BN;
|
|
17
|
+
reserve1: BN;
|
|
18
|
+
totalSupply: BN;
|
|
19
|
+
}> {
|
|
20
|
+
const LPContract = new Contract(LPAddress, IUniswapV2PairABI.abi, provider) as IUniswapV2Pair;
|
|
21
|
+
var promises: any[] = [];
|
|
22
|
+
promises.push(LPContract.token0());
|
|
23
|
+
promises.push(LPContract.token1());
|
|
24
|
+
promises.push(LPContract.getReserves({ blockTag: block }));
|
|
25
|
+
promises.push(LPContract.totalSupply({ blockTag: block }));
|
|
26
|
+
const values: any[] = await Promise.all(promises);
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
token0: values[0] as string,
|
|
30
|
+
token1: values[1] as string,
|
|
31
|
+
reserve0: (values[2] as { reserve0: BN; reserve1: BN }).reserve0,
|
|
32
|
+
reserve1: (values[2] as { reserve0: BN; reserve1: BN }).reserve1,
|
|
33
|
+
totalSupply: values[3] as BN,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function fetchHistoricalLPPrice(
|
|
38
|
+
address: Address,
|
|
39
|
+
provider: providers.Provider,
|
|
40
|
+
block: number
|
|
41
|
+
): Promise<BigNumber> {
|
|
42
|
+
var LPInfo = await fetchHistoricalLPPositions(address, provider, block);
|
|
43
|
+
const LPDecimal = getDecimal(address);
|
|
44
|
+
|
|
45
|
+
async function fetchLPPriceBy(
|
|
46
|
+
tokenReverse: {
|
|
47
|
+
address: string;
|
|
48
|
+
reserve: BN;
|
|
49
|
+
},
|
|
50
|
+
block: number
|
|
51
|
+
): Promise<BigNumber> {
|
|
52
|
+
if (tokenReverse.reserve.isZero()) return new BigNumber(0);
|
|
53
|
+
|
|
54
|
+
const tokenPrice: BigNumber = await fetchHistoricalPrice(tokenReverse.address, provider, block);
|
|
55
|
+
const tokenDecimal = getDecimal(tokenReverse.address);
|
|
56
|
+
|
|
57
|
+
// reserveUSD will be divided by 10^tokenDecimal later for more precision
|
|
58
|
+
const reserveUSD: BigNumber = tokenPrice
|
|
59
|
+
.multipliedBy(tokenReverse.reserve.toString())
|
|
60
|
+
.multipliedBy(2);
|
|
61
|
+
return reserveUSD
|
|
62
|
+
.multipliedBy(decimalFactor(LPDecimal))
|
|
63
|
+
.dividedBy(new BigNumber(LPInfo.totalSupply.toString()))
|
|
64
|
+
.dividedBy(decimalFactor(tokenDecimal));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
// MUST await here
|
|
69
|
+
const lpPrice = await fetchLPPriceBy(
|
|
70
|
+
{
|
|
71
|
+
address: LPInfo.token0,
|
|
72
|
+
reserve: LPInfo.reserve0,
|
|
73
|
+
},
|
|
74
|
+
block
|
|
75
|
+
);
|
|
76
|
+
if (lpPrice.isZero()) {
|
|
77
|
+
throw Error(`Price is zero`);
|
|
78
|
+
}
|
|
79
|
+
return lpPrice;
|
|
80
|
+
} catch (e) {
|
|
81
|
+
devLog(`fetchLPPriceBy ${LPInfo.token0} failed`, e);
|
|
82
|
+
try {
|
|
83
|
+
// MUST await here
|
|
84
|
+
return await fetchLPPriceBy(
|
|
85
|
+
{
|
|
86
|
+
address: LPInfo.token1,
|
|
87
|
+
reserve: LPInfo.reserve1,
|
|
88
|
+
},
|
|
89
|
+
block
|
|
90
|
+
);
|
|
91
|
+
} catch (e) {
|
|
92
|
+
devLog(`fetchLPPriceBy ${LPInfo.token1} failed`, e);
|
|
93
|
+
throw Error(`Unable to fetch price for both tokens of LP ${address}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function processPriceFromOracle(rawPrice: BN, underlyingDecimal: number) {
|
|
99
|
+
return new BigNumber(rawPrice.toString()).div(decimalFactor(36 - underlyingDecimal));
|
|
100
|
+
}
|
|
101
|
+
export async function fetchHistoricalPriceFromOracle(
|
|
102
|
+
auTokenAddress: Address,
|
|
103
|
+
underlyingDecimal: number,
|
|
104
|
+
provider: providers.Provider,
|
|
105
|
+
block: number
|
|
106
|
+
): Promise<BigNumber> {
|
|
107
|
+
const oracleContract: PriceOracle = new Contract(
|
|
108
|
+
networkAddresses.misc.oracle,
|
|
109
|
+
AuriOracleABI.abi,
|
|
110
|
+
provider
|
|
111
|
+
) as PriceOracle;
|
|
112
|
+
const rawPrice = await oracleContract
|
|
113
|
+
.getUnderlyingPrice(auTokenAddress, { blockTag: block })
|
|
114
|
+
.catch((e: any) => {
|
|
115
|
+
console.log(`Unable to fetch price from oracle for ${auTokenAddress}`);
|
|
116
|
+
return BN.from(0);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
return processPriceFromOracle(rawPrice, underlyingDecimal);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export async function fetchHistoricalPrice(
|
|
123
|
+
address: Address,
|
|
124
|
+
provider: providers.Provider,
|
|
125
|
+
block: number
|
|
126
|
+
): Promise<BigNumber> {
|
|
127
|
+
if (address.toLowerCase() in HARDCODE_PRICE_TOKENS) {
|
|
128
|
+
return new BigNumber(HARDCODE_PRICE_TOKENS[address.toLowerCase()]);
|
|
129
|
+
} else if (
|
|
130
|
+
isSameAddress(address, networkAddresses.tokens.PLY_WNEAR) ||
|
|
131
|
+
isSameAddress(address, networkAddresses.tokens.WNEAR_TRI) ||
|
|
132
|
+
isSameAddress(address, networkAddresses.tokens.AURORA_WNEAR)
|
|
133
|
+
) {
|
|
134
|
+
return fetchHistoricalLPPrice(address, provider, block);
|
|
135
|
+
} else if (isSameAddress(address, networkAddresses.tokens.PLY)) {
|
|
136
|
+
return fetchHistoricalPriceByLP(networkAddresses.tokens.PLY_WNEAR, provider, block);
|
|
137
|
+
} else if (isSameAddress(address, networkAddresses.tokens.TRI)) {
|
|
138
|
+
return fetchHistoricalPriceByLP(networkAddresses.tokens.WNEAR_TRI, provider, block, 1);
|
|
139
|
+
} else if (isSameAddress(address, networkAddresses.tokens.AURORA)) {
|
|
140
|
+
return fetchHistoricalPriceByLP(networkAddresses.tokens.AURORA_WNEAR, provider, block);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const matchingAuToken = networkAddresses.auTokens.find((auToken) => {
|
|
144
|
+
return isSameAddress(auToken.underlying, address);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
if (matchingAuToken !== undefined) {
|
|
148
|
+
return fetchHistoricalPriceFromOracle(
|
|
149
|
+
matchingAuToken.address,
|
|
150
|
+
getDecimal(address),
|
|
151
|
+
provider,
|
|
152
|
+
block
|
|
153
|
+
);
|
|
154
|
+
} else {
|
|
155
|
+
throw Error(`Unable to fetch price for ${address}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export async function fetchHistoricalPULPPrice(provider: providers.Provider): Promise<BigNumber> {
|
|
160
|
+
//TODO: Calculate PULP price
|
|
161
|
+
return new BigNumber(0);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export async function fetchHistoricalPriceByLP(
|
|
165
|
+
LP: Address,
|
|
166
|
+
provider: providers.Provider,
|
|
167
|
+
block: number,
|
|
168
|
+
tokenNumber: 0 | 1 = 0
|
|
169
|
+
): Promise<BigNumber> {
|
|
170
|
+
let LPInfo = await fetchHistoricalLPPositions(LP, provider, block);
|
|
171
|
+
|
|
172
|
+
if (tokenNumber === 1) {
|
|
173
|
+
LPInfo = {
|
|
174
|
+
token0: LPInfo.token1,
|
|
175
|
+
token1: LPInfo.token0,
|
|
176
|
+
reserve0: LPInfo.reserve1,
|
|
177
|
+
reserve1: LPInfo.reserve0,
|
|
178
|
+
totalSupply: LPInfo.totalSupply,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (LPInfo.reserve1.isZero()) {
|
|
183
|
+
return new BigNumber(0);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const token0Decimal = getDecimal(LPInfo.token0);
|
|
187
|
+
const token1Decimal = getDecimal(LPInfo.token1);
|
|
188
|
+
|
|
189
|
+
// (token0Price * reserve0) / 10^decimal0 = (token1Price * reserve1) / 10^decimal1
|
|
190
|
+
// token0Price = (token1Price * reserve1) * 10^decimal0 / 10^decimal1 / reserve0
|
|
191
|
+
return (await fetchHistoricalPrice(LPInfo.token1, provider, block))
|
|
192
|
+
.multipliedBy(LPInfo.reserve1.toString())
|
|
193
|
+
.multipliedBy(decimalFactor(token0Decimal))
|
|
194
|
+
.dividedBy(decimalFactor(token1Decimal))
|
|
195
|
+
.dividedBy(LPInfo.reserve0.toString());
|
|
196
|
+
}
|
package/src/helpers/index.ts
CHANGED
|
@@ -332,6 +332,18 @@ export class MoneyMarketRead extends BlockchainEntityRead {
|
|
|
332
332
|
return new TokenAmount(NEARToken, '0');
|
|
333
333
|
}
|
|
334
334
|
}
|
|
335
|
+
public async mintCap(): Promise<TokenAmount> {
|
|
336
|
+
return new TokenAmount(
|
|
337
|
+
this.underlying,
|
|
338
|
+
(await this.env.comptroller.mintCaps(this.auToken.address)).toString()
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
public async borrowCap(): Promise<TokenAmount> {
|
|
342
|
+
return new TokenAmount(
|
|
343
|
+
this.underlying,
|
|
344
|
+
(await this.env.comptroller.borrowCaps(this.auToken.address)).toString()
|
|
345
|
+
);
|
|
346
|
+
}
|
|
335
347
|
}
|
|
336
348
|
|
|
337
349
|
export class MoneyMarketReadWrite extends MoneyMarketRead {
|