@gearbox-protocol/sdk 1.13.0 → 1.14.0

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.
@@ -0,0 +1,4 @@
1
+ import { NetworkType } from "../core/constants";
2
+ import { DieselTokenTypes } from "../tokens/gear";
3
+ import { RangedValue } from "./range";
4
+ export declare const poolRewardsPerBlock: Record<NetworkType, Record<DieselTokenTypes, RangedValue>>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.poolRewardsPerBlock = void 0;
4
+ var range_1 = require("./range");
5
+ exports.poolRewardsPerBlock = {
6
+ Mainnet: {
7
+ dDAI: new range_1.RangedValue(),
8
+ dUSDC: new range_1.RangedValue(),
9
+ dWETH: new range_1.RangedValue(),
10
+ dWBTC: new range_1.RangedValue(),
11
+ dwstETH: new range_1.RangedValue(),
12
+ },
13
+ Goerli: {
14
+ dDAI: new range_1.RangedValue(),
15
+ dUSDC: new range_1.RangedValue(),
16
+ dWETH: new range_1.RangedValue(),
17
+ dWBTC: new range_1.RangedValue(),
18
+ dwstETH: new range_1.RangedValue(),
19
+ },
20
+ };
21
+ // poolRewardsPerBlock.Goerli.dDAI.addValue(90000, BigNumber.from(0));
@@ -0,0 +1,15 @@
1
+ import { BigNumber, providers } from "ethers";
2
+ import { NetworkType } from "../core/constants";
3
+ import { TransferEvent } from "../types/@gearbox-protocol/core-v2/contracts/interfaces/IPhantomERC20";
4
+ import { RangedValue } from "./range";
5
+ export interface Reward {
6
+ address: string;
7
+ amount: BigNumber;
8
+ }
9
+ export declare class PoolRewards {
10
+ static computeReward(dieselToken: string, address: string, provider: providers.Provider, networkType: NetworkType, toBlock?: number): Promise<BigNumber>;
11
+ computeAllRewards(dieselToken: string, provider: providers.Provider, networkType: NetworkType, toBlock?: number): Promise<Array<Reward>>;
12
+ static computeRewardInt(toBlock: number, balance: RangedValue, totalSupply: RangedValue, rewardPerBlock: RangedValue): BigNumber;
13
+ protected static query(dieselToken: string, provider: providers.Provider, toBlock: number): Promise<Array<TransferEvent>>;
14
+ protected static getRewardsRange(dieselToken: string, networkType: NetworkType): RangedValue;
15
+ }
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.PoolRewards = void 0;
49
+ var ethers_1 = require("ethers");
50
+ var constants_1 = require("../core/constants");
51
+ var token_1 = require("../tokens/token");
52
+ var types_1 = require("../types");
53
+ var poolRewardParams_1 = require("./poolRewardParams");
54
+ var range_1 = require("./range");
55
+ var PoolRewards = /** @class */ (function () {
56
+ function PoolRewards() {
57
+ }
58
+ PoolRewards.computeReward = function (dieselToken, address, provider, networkType, toBlock) {
59
+ return __awaiter(this, void 0, void 0, function () {
60
+ var toBlockQuery, _a, query, balanceRange, totalSupplyRange, rewardPerBlock, addrLC, totalSupply, balance;
61
+ return __generator(this, function (_b) {
62
+ switch (_b.label) {
63
+ case 0:
64
+ _a = toBlock;
65
+ if (_a) return [3 /*break*/, 2];
66
+ return [4 /*yield*/, provider.getBlockNumber()];
67
+ case 1:
68
+ _a = (_b.sent());
69
+ _b.label = 2;
70
+ case 2:
71
+ toBlockQuery = _a;
72
+ return [4 /*yield*/, PoolRewards.query(dieselToken, provider, toBlockQuery)];
73
+ case 3:
74
+ query = _b.sent();
75
+ balanceRange = new range_1.RangedValue();
76
+ totalSupplyRange = new range_1.RangedValue();
77
+ rewardPerBlock = PoolRewards.getRewardsRange(dieselToken, networkType);
78
+ addrLC = address.toLowerCase();
79
+ totalSupply = ethers_1.BigNumber.from(0);
80
+ balance = ethers_1.BigNumber.from(0);
81
+ query.forEach(function (e) {
82
+ var from = e.args.from.toLowerCase();
83
+ if (from === constants_1.ADDRESS_0X0) {
84
+ totalSupply = totalSupply.add(e.args.value);
85
+ totalSupplyRange.addValue(e.blockNumber, totalSupply);
86
+ }
87
+ else if (from === addrLC) {
88
+ balance = balance.sub(e.args.value);
89
+ balanceRange.addValue(e.blockNumber, balance);
90
+ }
91
+ var to = e.args.to.toLowerCase();
92
+ if (to === constants_1.ADDRESS_0X0) {
93
+ totalSupply = totalSupply.sub(e.args.value);
94
+ totalSupplyRange.addValue(e.blockNumber, totalSupply);
95
+ }
96
+ else if (to === addrLC) {
97
+ balance = balance.add(e.args.value);
98
+ balanceRange.addValue(e.blockNumber, balance);
99
+ }
100
+ });
101
+ return [2 /*return*/, PoolRewards.computeRewardInt(toBlockQuery, balanceRange, totalSupplyRange, rewardPerBlock)];
102
+ }
103
+ });
104
+ });
105
+ };
106
+ PoolRewards.prototype.computeAllRewards = function (dieselToken, provider, networkType, toBlock) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var toBlockQuery, _a, query, totalSupplyRange, rewardPerBlock, balancesRange, totalSupply, balances;
109
+ return __generator(this, function (_b) {
110
+ switch (_b.label) {
111
+ case 0:
112
+ _a = toBlock;
113
+ if (_a) return [3 /*break*/, 2];
114
+ return [4 /*yield*/, provider.getBlockNumber()];
115
+ case 1:
116
+ _a = (_b.sent());
117
+ _b.label = 2;
118
+ case 2:
119
+ toBlockQuery = _a;
120
+ return [4 /*yield*/, PoolRewards.query(dieselToken, provider, toBlockQuery)];
121
+ case 3:
122
+ query = _b.sent();
123
+ totalSupplyRange = new range_1.RangedValue();
124
+ rewardPerBlock = PoolRewards.getRewardsRange(dieselToken, networkType);
125
+ balancesRange = {};
126
+ totalSupply = ethers_1.BigNumber.from(0);
127
+ balances = {};
128
+ query.forEach(function (e) {
129
+ var from = e.args.from.toLowerCase();
130
+ if (from === constants_1.ADDRESS_0X0) {
131
+ totalSupply = totalSupply.add(e.args.value);
132
+ totalSupplyRange.addValue(e.blockNumber, totalSupply);
133
+ }
134
+ else {
135
+ balances[from] = balances[from].sub(e.args.value);
136
+ balancesRange[from].addValue(e.blockNumber, balances[from]);
137
+ }
138
+ var to = e.args.to.toLowerCase();
139
+ if (to === constants_1.ADDRESS_0X0) {
140
+ totalSupply = totalSupply.sub(e.args.value);
141
+ totalSupplyRange.addValue(e.blockNumber, totalSupply);
142
+ }
143
+ else {
144
+ if (!balances[to]) {
145
+ balances[to] = ethers_1.BigNumber.from(0);
146
+ balancesRange[to] = new range_1.RangedValue();
147
+ }
148
+ balances[to] = balances[to].add(e.args.value);
149
+ balancesRange[to].addValue(e.blockNumber, balances[to]);
150
+ }
151
+ });
152
+ return [2 /*return*/, Object.keys(balances).map(function (address) { return ({
153
+ address: address,
154
+ amount: PoolRewards.computeRewardInt(toBlockQuery, balancesRange[address], totalSupplyRange, rewardPerBlock),
155
+ }); })];
156
+ }
157
+ });
158
+ });
159
+ };
160
+ PoolRewards.computeRewardInt = function (toBlock, balance, totalSupply, rewardPerBlock) {
161
+ var keys = Array.from(new Set(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], balance.keys, true), totalSupply.keys, true), rewardPerBlock.keys, true), [
162
+ toBlock,
163
+ ], false))).sort(function (a, b) { return (a > b ? 1 : -1); });
164
+ var total = ethers_1.BigNumber.from(0);
165
+ var balancesArr = balance.getValues(keys);
166
+ var totalSupplyArr = totalSupply.getValues(keys);
167
+ var rewardsArr = rewardPerBlock.getValues(keys);
168
+ for (var i = 0; i < keys.length; i++) {
169
+ var curBlock = keys[i];
170
+ var nextBlock = i === keys.length - 1 ? toBlock : keys[i + 1];
171
+ total = total.add(balancesArr[i]
172
+ .mul(nextBlock - curBlock)
173
+ .mul(rewardsArr[i])
174
+ .div(totalSupplyArr[i]));
175
+ }
176
+ return total;
177
+ };
178
+ PoolRewards.query = function (dieselToken, provider, toBlock) {
179
+ return __awaiter(this, void 0, void 0, function () {
180
+ var token;
181
+ return __generator(this, function (_a) {
182
+ switch (_a.label) {
183
+ case 0:
184
+ token = types_1.IERC20__factory.connect(dieselToken, provider);
185
+ return [4 /*yield*/, token.queryFilter(token.filters.Transfer(), 0, toBlock)];
186
+ case 1: return [2 /*return*/, _a.sent()];
187
+ }
188
+ });
189
+ });
190
+ };
191
+ PoolRewards.getRewardsRange = function (dieselToken, networkType) {
192
+ var rewardPerBlock = poolRewardParams_1.poolRewardsPerBlock[networkType][token_1.tokenSymbolByAddress[dieselToken.toLowerCase()]];
193
+ if (!rewardPerBlock)
194
+ throw new Error("Unknown diesel token ".concat(dieselToken));
195
+ return rewardPerBlock;
196
+ };
197
+ return PoolRewards;
198
+ }());
199
+ exports.PoolRewards = PoolRewards;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var chai_1 = require("chai");
4
+ var ethers_1 = require("ethers");
5
+ var poolRewards_1 = require("./poolRewards");
6
+ var range_1 = require("./range");
7
+ describe("PoolRewards test", function () {
8
+ it("computeReward works correctly", function () {
9
+ var balances = new range_1.RangedValue();
10
+ balances.addValue(1000, ethers_1.BigNumber.from(100));
11
+ balances.addValue(2000, ethers_1.BigNumber.from(200));
12
+ balances.addValue(3000, ethers_1.BigNumber.from(0));
13
+ var totalSupply = new range_1.RangedValue();
14
+ totalSupply.addValue(500, ethers_1.BigNumber.from(100));
15
+ totalSupply.addValue(1000, ethers_1.BigNumber.from(200));
16
+ totalSupply.addValue(1500, ethers_1.BigNumber.from(250));
17
+ totalSupply.addValue(2000, ethers_1.BigNumber.from(400));
18
+ totalSupply.addValue(3000, ethers_1.BigNumber.from(100));
19
+ var rewards = new range_1.RangedValue();
20
+ rewards.addValue(500, ethers_1.BigNumber.from(20));
21
+ // Block: ----- 500 ------ 1000 ----- 1500 ----- 2000 ------ 2500 ----- 3000
22
+ //
23
+ // Balances: 0 100 ---------------- 200 ------------------ 0
24
+ // Total supply 100 200 -- 250 300 100
25
+ // Rewards: 20
26
+ // 10 ------ 8 10 -------------------- 0
27
+ // Total: 10 * 500 + 8*500 + 10 * 1000 = 19000
28
+ var result = poolRewards_1.PoolRewards.computeRewardInt(3000, balances, totalSupply, rewards);
29
+ (0, chai_1.expect)(result.toNumber()).to.be.eq(19000);
30
+ });
31
+ });
@@ -0,0 +1,12 @@
1
+ import { BigNumber } from "ethers";
2
+ export declare class RangedValue {
3
+ protected initialValue: BigNumber;
4
+ protected data: Map<number, BigNumber>;
5
+ protected _keys: Array<number>;
6
+ constructor(initialValue?: BigNumber);
7
+ addValue(from: number, value: BigNumber): void;
8
+ getValue(at: number): BigNumber;
9
+ getValues(sortedKeys: Array<number>): Array<BigNumber>;
10
+ protected getMapValue(index: number): BigNumber;
11
+ get keys(): Array<number>;
12
+ }
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RangedValue = void 0;
13
+ var ethers_1 = require("ethers");
14
+ var RangedValue = /** @class */ (function () {
15
+ function RangedValue(initialValue) {
16
+ this.data = new Map();
17
+ this._keys = [];
18
+ this.initialValue = initialValue || ethers_1.BigNumber.from(0);
19
+ }
20
+ RangedValue.prototype.addValue = function (from, value) {
21
+ this.data.set(from, value);
22
+ this._keys = __spreadArray(__spreadArray([], this._keys, true), [from], false).sort(function (a, b) { return (a > b ? 1 : -1); });
23
+ };
24
+ RangedValue.prototype.getValue = function (at) {
25
+ for (var _i = 0, _a = __spreadArray([], this._keys, true).reverse(); _i < _a.length; _i++) {
26
+ var index = _a[_i];
27
+ if (at >= index) {
28
+ var value = this.data.get(index);
29
+ if (!value)
30
+ throw new Error("Unexpectedly cant find a value with index ".concat(index));
31
+ return value;
32
+ }
33
+ }
34
+ return this.initialValue;
35
+ };
36
+ RangedValue.prototype.getValues = function (sortedKeys) {
37
+ var lastElm = this._keys.length - 1;
38
+ var ownKeyIndex = lastElm;
39
+ var result = [];
40
+ for (var _i = 0, _a = __spreadArray([], sortedKeys, true).reverse(); _i < _a.length; _i++) {
41
+ var sk = _a[_i];
42
+ if (sk < this._keys[0]) {
43
+ result.push(this.initialValue);
44
+ }
45
+ else if (sk > this._keys[lastElm]) {
46
+ result.push(this.getMapValue(this._keys[lastElm]));
47
+ }
48
+ else {
49
+ if (sk < this._keys[ownKeyIndex]) {
50
+ for (; ownKeyIndex >= 0; ownKeyIndex--) {
51
+ if (sk >= this._keys[ownKeyIndex])
52
+ break;
53
+ }
54
+ }
55
+ result.push(this.getMapValue(this._keys[ownKeyIndex]));
56
+ }
57
+ }
58
+ return result.reverse();
59
+ };
60
+ RangedValue.prototype.getMapValue = function (index) {
61
+ var value = this.data.get(index);
62
+ if (!value)
63
+ throw new Error("Can get value for ".concat(index));
64
+ return value;
65
+ };
66
+ Object.defineProperty(RangedValue.prototype, "keys", {
67
+ get: function () {
68
+ return this._keys;
69
+ },
70
+ enumerable: false,
71
+ configurable: true
72
+ });
73
+ return RangedValue;
74
+ }());
75
+ exports.RangedValue = RangedValue;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var chai_1 = require("chai");
4
+ var ethers_1 = require("ethers");
5
+ var range_1 = require("./range");
6
+ describe("RangedValue test", function () {
7
+ it("addValue and getValue works correctly", function () {
8
+ var r = new range_1.RangedValue(ethers_1.BigNumber.from(5));
9
+ (0, chai_1.expect)(r.getValue(5).toNumber()).to.be.eq(5);
10
+ r.addValue(100, ethers_1.BigNumber.from(8));
11
+ r.addValue(10, ethers_1.BigNumber.from(18));
12
+ (0, chai_1.expect)(r.getValue(9).toNumber()).to.be.eq(5);
13
+ (0, chai_1.expect)(r.getValue(10).toNumber()).to.be.eq(18);
14
+ (0, chai_1.expect)(r.getValue(1000).toNumber()).to.be.eq(8);
15
+ (0, chai_1.expect)(r.keys).to.be.eql([10, 100]);
16
+ });
17
+ it("getValues works correctly", function () {
18
+ var r = new range_1.RangedValue();
19
+ r.addValue(4, ethers_1.BigNumber.from(3));
20
+ r.addValue(2, ethers_1.BigNumber.from(5));
21
+ r.addValue(10, ethers_1.BigNumber.from(1));
22
+ r.addValue(6, ethers_1.BigNumber.from(8));
23
+ r.addValue(8, ethers_1.BigNumber.from(7));
24
+ var keys = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
25
+ var expected = [0, 0, 5, 5, 3, 3, 8, 8, 7, 7, 1, 1];
26
+ var result = r.getValues(keys).map(function (e) { return e.toNumber(); });
27
+ (0, chai_1.expect)(result).to.be.eql(expected);
28
+ });
29
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gearbox-protocol/sdk",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "Gearbox SDK",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",