@mento-protocol/mento-sdk 0.1.2 → 0.1.3
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 +63 -48
- package/dist/cjs/mento.d.ts +35 -13
- package/dist/cjs/mento.js +52 -47
- package/dist/cjs/utils.d.ts +13 -1
- package/dist/cjs/utils.js +31 -1
- package/dist/esm/mento.d.ts +35 -13
- package/dist/esm/mento.js +53 -48
- package/dist/esm/utils.d.ts +13 -1
- package/dist/esm/utils.js +29 -1
- package/package.json +12 -7
package/README.md
CHANGED
|
@@ -2,57 +2,72 @@
|
|
|
2
2
|
|
|
3
3
|
The official Mento Protocol SDK for interacting with Multi-Collateral Mento smart contracts on the Celo network.
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# Example Usage
|
|
6
6
|
|
|
7
7
|
```javascript
|
|
8
|
-
|
|
9
|
-
'https://baklava-forno.celo-testnet.org'
|
|
10
|
-
)
|
|
11
|
-
const pKey = 'privateKey'
|
|
12
|
-
const wallet = new Wallet(pKey, provider)
|
|
8
|
+
import { Wallet, providers, utils } from 'ethers'
|
|
13
9
|
|
|
14
|
-
|
|
10
|
+
import { Mento } from '@mento-protocol/mento-sdk'
|
|
15
11
|
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
async function main() {
|
|
13
|
+
const provider = new providers.JsonRpcProvider(
|
|
14
|
+
'https://baklava-forno.celo-testnet.org'
|
|
15
|
+
)
|
|
16
|
+
const pKey =
|
|
17
|
+
'b214fcf9673dc1a880f8041a8c8952c2dc7daff41fb64cf7715919df095c3fce'
|
|
18
|
+
const wallet = new Wallet(pKey, provider)
|
|
19
|
+
|
|
20
|
+
const mento = await Mento.create(wallet)
|
|
21
|
+
console.log('available pairs: ', await mento.getTradeablePairs())
|
|
22
|
+
/*
|
|
23
|
+
[
|
|
18
24
|
[
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
25
|
+
{
|
|
26
|
+
address: '0x62492A644A588FD904270BeD06ad52B9abfEA1aE',
|
|
27
|
+
symbol: 'cUSD'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
address: '0xdDc9bE57f553fe75752D61606B94CBD7e0264eF8',
|
|
31
|
+
symbol: 'CELO'
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
...
|
|
35
|
+
]
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
// swap 1 CELO for cUSD
|
|
39
|
+
const one = 1
|
|
40
|
+
const tokenIn = '0xdDc9bE57f553fe75752D61606B94CBD7e0264eF8' // CELO
|
|
41
|
+
const tokenOut = '0x62492A644A588FD904270BeD06ad52B9abfEA1aE' // cUSD
|
|
42
|
+
const amountIn = utils.parseUnits(one.toString(), 18)
|
|
43
|
+
const expectedAmountOut = await mento.getAmountOut(
|
|
44
|
+
tokenIn,
|
|
45
|
+
tokenOut,
|
|
46
|
+
utils.parseUnits(one.toString(), 18)
|
|
47
|
+
)
|
|
48
|
+
// 95% of the quote to allow some slippage
|
|
49
|
+
const minAmountOut = expectedAmountOut.mul(95).div(100)
|
|
50
|
+
|
|
51
|
+
// allow the broker contract to spend CELO on behalf of the wallet
|
|
52
|
+
const allowanceTxObj = await mento.increaseTradingAllowance(tokenIn, amountIn)
|
|
53
|
+
const allowanceTx = await wallet.sendTransaction(allowanceTxObj)
|
|
54
|
+
const allowanceReceipt = await allowanceTx.wait()
|
|
55
|
+
console.log('increaseAllowance receipt', allowanceReceipt)
|
|
56
|
+
|
|
57
|
+
// execute the swap
|
|
58
|
+
const swapTxObj = await mento.swapIn(
|
|
59
|
+
tokenIn,
|
|
60
|
+
tokenOut,
|
|
61
|
+
amountIn,
|
|
62
|
+
minAmountOut
|
|
63
|
+
)
|
|
64
|
+
const swapTx = await wallet.sendTransaction(swapTxObj)
|
|
65
|
+
const swapReceipt = await swapTx.wait()
|
|
66
|
+
|
|
67
|
+
console.log('swapIn receipt', swapReceipt)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
main()
|
|
71
|
+
.then(() => console.log('Done'))
|
|
72
|
+
.catch((e) => console.error('Error:', e))
|
|
58
73
|
```
|
package/dist/cjs/mento.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IBroker } from '@mento-protocol/mento-core-ts';
|
|
2
|
+
import { BigNumber, providers, Signer } from 'ethers';
|
|
2
3
|
import { Address } from './types';
|
|
3
|
-
interface
|
|
4
|
+
export interface Exchange {
|
|
5
|
+
providerAddr: Address;
|
|
6
|
+
id: string;
|
|
7
|
+
assets: Address[];
|
|
8
|
+
}
|
|
9
|
+
export interface Asset {
|
|
4
10
|
address: Address;
|
|
5
11
|
symbol: string;
|
|
6
12
|
}
|
|
@@ -9,11 +15,11 @@ export declare class Mento {
|
|
|
9
15
|
private readonly broker;
|
|
10
16
|
private exchanges;
|
|
11
17
|
/**
|
|
12
|
-
* This constructor is private, use the static create or
|
|
18
|
+
* This constructor is private, use the static create or createWithParams methods
|
|
13
19
|
* to create a new Mento instance
|
|
20
|
+
* @param signerOrProvider an ethers provider or connected signer
|
|
14
21
|
* @param brokerAddress the address of the broker contract
|
|
15
|
-
* @param
|
|
16
|
-
* @param signer an optional ethers signer to execute swaps (must be connected to a provider)
|
|
22
|
+
* @param exchanges exchange data for the broker
|
|
17
23
|
*/
|
|
18
24
|
private constructor();
|
|
19
25
|
/**
|
|
@@ -24,13 +30,20 @@ export declare class Mento {
|
|
|
24
30
|
*/
|
|
25
31
|
static create(signerOrProvider: Signer | providers.Provider): Promise<Mento>;
|
|
26
32
|
/**
|
|
27
|
-
* Create a new Mento object instance given a
|
|
28
|
-
* When constructed with
|
|
29
|
-
* @param brokerAddr the address of the broker contract
|
|
33
|
+
* Create a new Mento object instance given a broker address and optional exchanges data
|
|
34
|
+
* When constructed with a Provider, only read-only operations are supported
|
|
30
35
|
* @param signerOrProvider an ethers signer or provider. A signer is required to execute swaps
|
|
36
|
+
* @param brokerAddr the address of the broker contract
|
|
37
|
+
* @param exchanges the exchanges data for the broker
|
|
31
38
|
* @returns a new Mento object instance
|
|
32
39
|
*/
|
|
33
|
-
static
|
|
40
|
+
static createWithParams(signerOrProvider: Signer | providers.Provider, brokerAddr: Address, exchanges?: Exchange[]): Mento;
|
|
41
|
+
/**
|
|
42
|
+
* Returns a new Mento instance connected to the given signer
|
|
43
|
+
* @param signer an ethers signer
|
|
44
|
+
* @returns new Mento object instance
|
|
45
|
+
*/
|
|
46
|
+
connectSigner(signer: Signer): Mento;
|
|
34
47
|
/**
|
|
35
48
|
* Returns a list of all the pairs that can be traded on Mento
|
|
36
49
|
* @returns The list of tradeable pairs in the form of [{address, symbol}]
|
|
@@ -79,17 +92,26 @@ export declare class Mento {
|
|
|
79
92
|
* @returns the populated TransactionRequest object
|
|
80
93
|
*/
|
|
81
94
|
swapOut(tokenIn: Address, tokenOut: Address, amountOut: BigNumber, amountInMax: BigNumber): Promise<providers.TransactionRequest>;
|
|
95
|
+
/**
|
|
96
|
+
* Returns the mento instance's broker contract
|
|
97
|
+
* @returns broker contract
|
|
98
|
+
*/
|
|
99
|
+
getBroker(): IBroker;
|
|
82
100
|
/**
|
|
83
101
|
* Returns the list of exchanges available in Mento (cached)
|
|
84
102
|
* @returns the list of exchanges
|
|
85
103
|
*/
|
|
86
|
-
|
|
104
|
+
getExchanges(): Promise<Exchange[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Returns the list of exchanges for a given exchange provider address
|
|
107
|
+
* @returns list of exchanges
|
|
108
|
+
*/
|
|
109
|
+
getExchangesForProvider(exchangeProviderAddr: Address): Promise<Exchange[]>;
|
|
87
110
|
/**
|
|
88
111
|
* Returns the Mento exchange (if any) for a given pair of tokens
|
|
89
112
|
* @param token0 the first token
|
|
90
113
|
* @param token1 the second token
|
|
91
|
-
* @returns
|
|
114
|
+
* @returns exchange
|
|
92
115
|
*/
|
|
93
|
-
|
|
116
|
+
getExchangeForTokens(token0: Address, token1: Address): Promise<Exchange>;
|
|
94
117
|
}
|
|
95
|
-
export {};
|
package/dist/cjs/mento.js
CHANGED
|
@@ -10,22 +10,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.Mento = void 0;
|
|
13
|
-
const ethers_1 = require("ethers");
|
|
14
13
|
const mento_core_ts_1 = require("@mento-protocol/mento-core-ts");
|
|
14
|
+
const ethers_1 = require("ethers");
|
|
15
15
|
const utils_1 = require("./utils");
|
|
16
16
|
const assert_1 = require("assert");
|
|
17
17
|
class Mento {
|
|
18
18
|
/**
|
|
19
|
-
* This constructor is private, use the static create or
|
|
19
|
+
* This constructor is private, use the static create or createWithParams methods
|
|
20
20
|
* to create a new Mento instance
|
|
21
|
+
* @param signerOrProvider an ethers provider or connected signer
|
|
21
22
|
* @param brokerAddress the address of the broker contract
|
|
22
|
-
* @param
|
|
23
|
-
* @param signer an optional ethers signer to execute swaps (must be connected to a provider)
|
|
23
|
+
* @param exchanges exchange data for the broker
|
|
24
24
|
*/
|
|
25
|
-
constructor(brokerAddress,
|
|
26
|
-
this.broker = mento_core_ts_1.IBroker__factory.connect(brokerAddress, signerOrProvider);
|
|
25
|
+
constructor(signerOrProvider, brokerAddress, exchanges) {
|
|
27
26
|
this.signerOrProvider = signerOrProvider;
|
|
28
|
-
this.
|
|
27
|
+
this.broker = mento_core_ts_1.IBroker__factory.connect(brokerAddress, signerOrProvider);
|
|
28
|
+
this.exchanges = exchanges || [];
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Creates a new Mento object instance.
|
|
@@ -35,38 +35,30 @@ class Mento {
|
|
|
35
35
|
*/
|
|
36
36
|
static create(signerOrProvider) {
|
|
37
37
|
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (!isSigner && !isProvider) {
|
|
41
|
-
throw new Error('A valid signer or provider must be provided');
|
|
42
|
-
}
|
|
43
|
-
if (isSigner) {
|
|
44
|
-
if (!ethers_1.providers.Provider.isProvider(signerOrProvider.provider)) {
|
|
45
|
-
throw new Error('Signer must be connected to a provider');
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return new Mento(yield (0, utils_1.getBrokerAddressFromRegistry)(signerOrProvider), signerOrProvider);
|
|
38
|
+
(0, utils_1.validateSignerOrProvider)(signerOrProvider);
|
|
39
|
+
return new Mento(signerOrProvider, yield (0, utils_1.getBrokerAddressFromRegistry)(signerOrProvider));
|
|
49
40
|
});
|
|
50
41
|
}
|
|
51
42
|
/**
|
|
52
|
-
* Create a new Mento object instance given a
|
|
53
|
-
* When constructed with
|
|
54
|
-
* @param brokerAddr the address of the broker contract
|
|
43
|
+
* Create a new Mento object instance given a broker address and optional exchanges data
|
|
44
|
+
* When constructed with a Provider, only read-only operations are supported
|
|
55
45
|
* @param signerOrProvider an ethers signer or provider. A signer is required to execute swaps
|
|
46
|
+
* @param brokerAddr the address of the broker contract
|
|
47
|
+
* @param exchanges the exchanges data for the broker
|
|
56
48
|
* @returns a new Mento object instance
|
|
57
49
|
*/
|
|
58
|
-
static
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return new Mento(
|
|
50
|
+
static createWithParams(signerOrProvider, brokerAddr, exchanges) {
|
|
51
|
+
(0, utils_1.validateSignerOrProvider)(signerOrProvider);
|
|
52
|
+
return new Mento(signerOrProvider, brokerAddr, exchanges);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns a new Mento instance connected to the given signer
|
|
56
|
+
* @param signer an ethers signer
|
|
57
|
+
* @returns new Mento object instance
|
|
58
|
+
*/
|
|
59
|
+
connectSigner(signer) {
|
|
60
|
+
(0, utils_1.validateSigner)(signer);
|
|
61
|
+
return new Mento(signer, this.broker.address, this.exchanges);
|
|
70
62
|
}
|
|
71
63
|
/**
|
|
72
64
|
* Returns a list of all the pairs that can be traded on Mento
|
|
@@ -174,6 +166,13 @@ class Mento {
|
|
|
174
166
|
return this.signerOrProvider.populateTransaction(tx);
|
|
175
167
|
});
|
|
176
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Returns the mento instance's broker contract
|
|
171
|
+
* @returns broker contract
|
|
172
|
+
*/
|
|
173
|
+
getBroker() {
|
|
174
|
+
return this.broker;
|
|
175
|
+
}
|
|
177
176
|
/**
|
|
178
177
|
* Returns the list of exchanges available in Mento (cached)
|
|
179
178
|
* @returns the list of exchanges
|
|
@@ -183,29 +182,35 @@ class Mento {
|
|
|
183
182
|
if (this.exchanges.length > 0) {
|
|
184
183
|
return this.exchanges;
|
|
185
184
|
}
|
|
186
|
-
const exchanges = [];
|
|
187
185
|
const exchangeProvidersAddresses = yield this.broker.getExchangeProviders();
|
|
188
|
-
|
|
189
|
-
const exchangeManager = mento_core_ts_1.IExchangeProvider__factory.connect(exchangeProviderAddr, this.signerOrProvider);
|
|
190
|
-
const exchangesInManager = yield exchangeManager.getExchanges();
|
|
191
|
-
for (const exchange of exchangesInManager) {
|
|
192
|
-
(0, assert_1.strict)(exchange.assets.length === 2, 'Exchange must have 2 assets');
|
|
193
|
-
exchanges.push({
|
|
194
|
-
providerAddr: exchangeProviderAddr,
|
|
195
|
-
id: exchange.exchangeId,
|
|
196
|
-
assets: exchange.assets,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
}
|
|
186
|
+
const exchanges = (yield Promise.all(exchangeProvidersAddresses.map((a) => this.getExchangesForProvider(a)))).flat();
|
|
200
187
|
this.exchanges = exchanges;
|
|
201
188
|
return exchanges;
|
|
202
189
|
});
|
|
203
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* Returns the list of exchanges for a given exchange provider address
|
|
193
|
+
* @returns list of exchanges
|
|
194
|
+
*/
|
|
195
|
+
getExchangesForProvider(exchangeProviderAddr) {
|
|
196
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
197
|
+
const exchangeProvider = mento_core_ts_1.IExchangeProvider__factory.connect(exchangeProviderAddr, this.signerOrProvider);
|
|
198
|
+
const exchangesInProvider = yield exchangeProvider.getExchanges();
|
|
199
|
+
return exchangesInProvider.map((e) => {
|
|
200
|
+
(0, assert_1.strict)(e.assets.length === 2, 'Exchange must have 2 assets');
|
|
201
|
+
return {
|
|
202
|
+
providerAddr: exchangeProviderAddr,
|
|
203
|
+
id: e.exchangeId,
|
|
204
|
+
assets: e.assets,
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
}
|
|
204
209
|
/**
|
|
205
210
|
* Returns the Mento exchange (if any) for a given pair of tokens
|
|
206
211
|
* @param token0 the first token
|
|
207
212
|
* @param token1 the second token
|
|
208
|
-
* @returns
|
|
213
|
+
* @returns exchange
|
|
209
214
|
*/
|
|
210
215
|
getExchangeForTokens(token0, token1) {
|
|
211
216
|
return __awaiter(this, void 0, void 0, function* () {
|
package/dist/cjs/utils.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
import { BigNumber,
|
|
1
|
+
import { BigNumber, providers, Signer } from 'ethers';
|
|
2
2
|
import { Address } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Ensures that given signer is truly a a connected signer
|
|
5
|
+
* @param signer an ethers signer
|
|
6
|
+
* @throws if signer is invalid or not connected
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateSigner(signer: Signer): void;
|
|
9
|
+
/**
|
|
10
|
+
* Ensures that given signerOrProvider is truly a provider or a connected signer
|
|
11
|
+
* @param signerOrProvider an ethers provider or signer
|
|
12
|
+
* @throws if signerOrProvider is invalid or not connected
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateSignerOrProvider(signerOrProvider: Signer | providers.Provider): void;
|
|
3
15
|
/**
|
|
4
16
|
* Returns the broker address from the Celo registry
|
|
5
17
|
* @param signerOrProvider an ethers provider or signer
|
package/dist/cjs/utils.js
CHANGED
|
@@ -9,8 +9,38 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.increaseAllowance = exports.getSymbolFromTokenAddress = exports.getBrokerAddressFromRegistry = void 0;
|
|
12
|
+
exports.increaseAllowance = exports.getSymbolFromTokenAddress = exports.getBrokerAddressFromRegistry = exports.validateSignerOrProvider = exports.validateSigner = void 0;
|
|
13
13
|
const ethers_1 = require("ethers");
|
|
14
|
+
/**
|
|
15
|
+
* Ensures that given signer is truly a a connected signer
|
|
16
|
+
* @param signer an ethers signer
|
|
17
|
+
* @throws if signer is invalid or not connected
|
|
18
|
+
*/
|
|
19
|
+
function validateSigner(signer) {
|
|
20
|
+
if (!ethers_1.Signer.isSigner(signer)) {
|
|
21
|
+
throw new Error('A valid signer must be provided');
|
|
22
|
+
}
|
|
23
|
+
if (!ethers_1.providers.Provider.isProvider(signer.provider)) {
|
|
24
|
+
throw new Error('Signer must be connected to a provider');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.validateSigner = validateSigner;
|
|
28
|
+
/**
|
|
29
|
+
* Ensures that given signerOrProvider is truly a provider or a connected signer
|
|
30
|
+
* @param signerOrProvider an ethers provider or signer
|
|
31
|
+
* @throws if signerOrProvider is invalid or not connected
|
|
32
|
+
*/
|
|
33
|
+
function validateSignerOrProvider(signerOrProvider) {
|
|
34
|
+
const isSigner = ethers_1.Signer.isSigner(signerOrProvider);
|
|
35
|
+
const isProvider = ethers_1.providers.Provider.isProvider(signerOrProvider);
|
|
36
|
+
if (!isSigner && !isProvider) {
|
|
37
|
+
throw new Error('A valid signer or provider must be provided');
|
|
38
|
+
}
|
|
39
|
+
if (isSigner && !ethers_1.providers.Provider.isProvider(signerOrProvider.provider)) {
|
|
40
|
+
throw new Error('Signer must be connected to a provider');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.validateSignerOrProvider = validateSignerOrProvider;
|
|
14
44
|
/**
|
|
15
45
|
* Returns the broker address from the Celo registry
|
|
16
46
|
* @param signerOrProvider an ethers provider or signer
|
package/dist/esm/mento.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IBroker } from '@mento-protocol/mento-core-ts';
|
|
2
|
+
import { BigNumber, providers, Signer } from 'ethers';
|
|
2
3
|
import { Address } from './types';
|
|
3
|
-
interface
|
|
4
|
+
export interface Exchange {
|
|
5
|
+
providerAddr: Address;
|
|
6
|
+
id: string;
|
|
7
|
+
assets: Address[];
|
|
8
|
+
}
|
|
9
|
+
export interface Asset {
|
|
4
10
|
address: Address;
|
|
5
11
|
symbol: string;
|
|
6
12
|
}
|
|
@@ -9,11 +15,11 @@ export declare class Mento {
|
|
|
9
15
|
private readonly broker;
|
|
10
16
|
private exchanges;
|
|
11
17
|
/**
|
|
12
|
-
* This constructor is private, use the static create or
|
|
18
|
+
* This constructor is private, use the static create or createWithParams methods
|
|
13
19
|
* to create a new Mento instance
|
|
20
|
+
* @param signerOrProvider an ethers provider or connected signer
|
|
14
21
|
* @param brokerAddress the address of the broker contract
|
|
15
|
-
* @param
|
|
16
|
-
* @param signer an optional ethers signer to execute swaps (must be connected to a provider)
|
|
22
|
+
* @param exchanges exchange data for the broker
|
|
17
23
|
*/
|
|
18
24
|
private constructor();
|
|
19
25
|
/**
|
|
@@ -24,13 +30,20 @@ export declare class Mento {
|
|
|
24
30
|
*/
|
|
25
31
|
static create(signerOrProvider: Signer | providers.Provider): Promise<Mento>;
|
|
26
32
|
/**
|
|
27
|
-
* Create a new Mento object instance given a
|
|
28
|
-
* When constructed with
|
|
29
|
-
* @param brokerAddr the address of the broker contract
|
|
33
|
+
* Create a new Mento object instance given a broker address and optional exchanges data
|
|
34
|
+
* When constructed with a Provider, only read-only operations are supported
|
|
30
35
|
* @param signerOrProvider an ethers signer or provider. A signer is required to execute swaps
|
|
36
|
+
* @param brokerAddr the address of the broker contract
|
|
37
|
+
* @param exchanges the exchanges data for the broker
|
|
31
38
|
* @returns a new Mento object instance
|
|
32
39
|
*/
|
|
33
|
-
static
|
|
40
|
+
static createWithParams(signerOrProvider: Signer | providers.Provider, brokerAddr: Address, exchanges?: Exchange[]): Mento;
|
|
41
|
+
/**
|
|
42
|
+
* Returns a new Mento instance connected to the given signer
|
|
43
|
+
* @param signer an ethers signer
|
|
44
|
+
* @returns new Mento object instance
|
|
45
|
+
*/
|
|
46
|
+
connectSigner(signer: Signer): Mento;
|
|
34
47
|
/**
|
|
35
48
|
* Returns a list of all the pairs that can be traded on Mento
|
|
36
49
|
* @returns The list of tradeable pairs in the form of [{address, symbol}]
|
|
@@ -79,17 +92,26 @@ export declare class Mento {
|
|
|
79
92
|
* @returns the populated TransactionRequest object
|
|
80
93
|
*/
|
|
81
94
|
swapOut(tokenIn: Address, tokenOut: Address, amountOut: BigNumber, amountInMax: BigNumber): Promise<providers.TransactionRequest>;
|
|
95
|
+
/**
|
|
96
|
+
* Returns the mento instance's broker contract
|
|
97
|
+
* @returns broker contract
|
|
98
|
+
*/
|
|
99
|
+
getBroker(): IBroker;
|
|
82
100
|
/**
|
|
83
101
|
* Returns the list of exchanges available in Mento (cached)
|
|
84
102
|
* @returns the list of exchanges
|
|
85
103
|
*/
|
|
86
|
-
|
|
104
|
+
getExchanges(): Promise<Exchange[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Returns the list of exchanges for a given exchange provider address
|
|
107
|
+
* @returns list of exchanges
|
|
108
|
+
*/
|
|
109
|
+
getExchangesForProvider(exchangeProviderAddr: Address): Promise<Exchange[]>;
|
|
87
110
|
/**
|
|
88
111
|
* Returns the Mento exchange (if any) for a given pair of tokens
|
|
89
112
|
* @param token0 the first token
|
|
90
113
|
* @param token1 the second token
|
|
91
|
-
* @returns
|
|
114
|
+
* @returns exchange
|
|
92
115
|
*/
|
|
93
|
-
|
|
116
|
+
getExchangeForTokens(token0: Address, token1: Address): Promise<Exchange>;
|
|
94
117
|
}
|
|
95
|
-
export {};
|
package/dist/esm/mento.js
CHANGED
|
@@ -7,22 +7,22 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { Signer, providers } from 'ethers';
|
|
11
10
|
import { IBroker__factory, IExchangeProvider__factory, } from '@mento-protocol/mento-core-ts';
|
|
12
|
-
import {
|
|
11
|
+
import { Signer } from 'ethers';
|
|
12
|
+
import { getBrokerAddressFromRegistry, getSymbolFromTokenAddress, increaseAllowance, validateSigner, validateSignerOrProvider, } from './utils';
|
|
13
13
|
import { strict as assert } from 'assert';
|
|
14
14
|
export class Mento {
|
|
15
15
|
/**
|
|
16
|
-
* This constructor is private, use the static create or
|
|
16
|
+
* This constructor is private, use the static create or createWithParams methods
|
|
17
17
|
* to create a new Mento instance
|
|
18
|
+
* @param signerOrProvider an ethers provider or connected signer
|
|
18
19
|
* @param brokerAddress the address of the broker contract
|
|
19
|
-
* @param
|
|
20
|
-
* @param signer an optional ethers signer to execute swaps (must be connected to a provider)
|
|
20
|
+
* @param exchanges exchange data for the broker
|
|
21
21
|
*/
|
|
22
|
-
constructor(brokerAddress,
|
|
23
|
-
this.broker = IBroker__factory.connect(brokerAddress, signerOrProvider);
|
|
22
|
+
constructor(signerOrProvider, brokerAddress, exchanges) {
|
|
24
23
|
this.signerOrProvider = signerOrProvider;
|
|
25
|
-
this.
|
|
24
|
+
this.broker = IBroker__factory.connect(brokerAddress, signerOrProvider);
|
|
25
|
+
this.exchanges = exchanges || [];
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
28
|
* Creates a new Mento object instance.
|
|
@@ -32,38 +32,30 @@ export class Mento {
|
|
|
32
32
|
*/
|
|
33
33
|
static create(signerOrProvider) {
|
|
34
34
|
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (!isSigner && !isProvider) {
|
|
38
|
-
throw new Error('A valid signer or provider must be provided');
|
|
39
|
-
}
|
|
40
|
-
if (isSigner) {
|
|
41
|
-
if (!providers.Provider.isProvider(signerOrProvider.provider)) {
|
|
42
|
-
throw new Error('Signer must be connected to a provider');
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return new Mento(yield getBrokerAddressFromRegistry(signerOrProvider), signerOrProvider);
|
|
35
|
+
validateSignerOrProvider(signerOrProvider);
|
|
36
|
+
return new Mento(signerOrProvider, yield getBrokerAddressFromRegistry(signerOrProvider));
|
|
46
37
|
});
|
|
47
38
|
}
|
|
48
39
|
/**
|
|
49
|
-
* Create a new Mento object instance given a
|
|
50
|
-
* When constructed with
|
|
51
|
-
* @param brokerAddr the address of the broker contract
|
|
40
|
+
* Create a new Mento object instance given a broker address and optional exchanges data
|
|
41
|
+
* When constructed with a Provider, only read-only operations are supported
|
|
52
42
|
* @param signerOrProvider an ethers signer or provider. A signer is required to execute swaps
|
|
43
|
+
* @param brokerAddr the address of the broker contract
|
|
44
|
+
* @param exchanges the exchanges data for the broker
|
|
53
45
|
* @returns a new Mento object instance
|
|
54
46
|
*/
|
|
55
|
-
static
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return new Mento(
|
|
47
|
+
static createWithParams(signerOrProvider, brokerAddr, exchanges) {
|
|
48
|
+
validateSignerOrProvider(signerOrProvider);
|
|
49
|
+
return new Mento(signerOrProvider, brokerAddr, exchanges);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Returns a new Mento instance connected to the given signer
|
|
53
|
+
* @param signer an ethers signer
|
|
54
|
+
* @returns new Mento object instance
|
|
55
|
+
*/
|
|
56
|
+
connectSigner(signer) {
|
|
57
|
+
validateSigner(signer);
|
|
58
|
+
return new Mento(signer, this.broker.address, this.exchanges);
|
|
67
59
|
}
|
|
68
60
|
/**
|
|
69
61
|
* Returns a list of all the pairs that can be traded on Mento
|
|
@@ -171,6 +163,13 @@ export class Mento {
|
|
|
171
163
|
return this.signerOrProvider.populateTransaction(tx);
|
|
172
164
|
});
|
|
173
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Returns the mento instance's broker contract
|
|
168
|
+
* @returns broker contract
|
|
169
|
+
*/
|
|
170
|
+
getBroker() {
|
|
171
|
+
return this.broker;
|
|
172
|
+
}
|
|
174
173
|
/**
|
|
175
174
|
* Returns the list of exchanges available in Mento (cached)
|
|
176
175
|
* @returns the list of exchanges
|
|
@@ -180,29 +179,35 @@ export class Mento {
|
|
|
180
179
|
if (this.exchanges.length > 0) {
|
|
181
180
|
return this.exchanges;
|
|
182
181
|
}
|
|
183
|
-
const exchanges = [];
|
|
184
182
|
const exchangeProvidersAddresses = yield this.broker.getExchangeProviders();
|
|
185
|
-
|
|
186
|
-
const exchangeManager = IExchangeProvider__factory.connect(exchangeProviderAddr, this.signerOrProvider);
|
|
187
|
-
const exchangesInManager = yield exchangeManager.getExchanges();
|
|
188
|
-
for (const exchange of exchangesInManager) {
|
|
189
|
-
assert(exchange.assets.length === 2, 'Exchange must have 2 assets');
|
|
190
|
-
exchanges.push({
|
|
191
|
-
providerAddr: exchangeProviderAddr,
|
|
192
|
-
id: exchange.exchangeId,
|
|
193
|
-
assets: exchange.assets,
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
}
|
|
183
|
+
const exchanges = (yield Promise.all(exchangeProvidersAddresses.map((a) => this.getExchangesForProvider(a)))).flat();
|
|
197
184
|
this.exchanges = exchanges;
|
|
198
185
|
return exchanges;
|
|
199
186
|
});
|
|
200
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Returns the list of exchanges for a given exchange provider address
|
|
190
|
+
* @returns list of exchanges
|
|
191
|
+
*/
|
|
192
|
+
getExchangesForProvider(exchangeProviderAddr) {
|
|
193
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
194
|
+
const exchangeProvider = IExchangeProvider__factory.connect(exchangeProviderAddr, this.signerOrProvider);
|
|
195
|
+
const exchangesInProvider = yield exchangeProvider.getExchanges();
|
|
196
|
+
return exchangesInProvider.map((e) => {
|
|
197
|
+
assert(e.assets.length === 2, 'Exchange must have 2 assets');
|
|
198
|
+
return {
|
|
199
|
+
providerAddr: exchangeProviderAddr,
|
|
200
|
+
id: e.exchangeId,
|
|
201
|
+
assets: e.assets,
|
|
202
|
+
};
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
201
206
|
/**
|
|
202
207
|
* Returns the Mento exchange (if any) for a given pair of tokens
|
|
203
208
|
* @param token0 the first token
|
|
204
209
|
* @param token1 the second token
|
|
205
|
-
* @returns
|
|
210
|
+
* @returns exchange
|
|
206
211
|
*/
|
|
207
212
|
getExchangeForTokens(token0, token1) {
|
|
208
213
|
return __awaiter(this, void 0, void 0, function* () {
|
package/dist/esm/utils.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
import { BigNumber,
|
|
1
|
+
import { BigNumber, providers, Signer } from 'ethers';
|
|
2
2
|
import { Address } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Ensures that given signer is truly a a connected signer
|
|
5
|
+
* @param signer an ethers signer
|
|
6
|
+
* @throws if signer is invalid or not connected
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateSigner(signer: Signer): void;
|
|
9
|
+
/**
|
|
10
|
+
* Ensures that given signerOrProvider is truly a provider or a connected signer
|
|
11
|
+
* @param signerOrProvider an ethers provider or signer
|
|
12
|
+
* @throws if signerOrProvider is invalid or not connected
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateSignerOrProvider(signerOrProvider: Signer | providers.Provider): void;
|
|
3
15
|
/**
|
|
4
16
|
* Returns the broker address from the Celo registry
|
|
5
17
|
* @param signerOrProvider an ethers provider or signer
|
package/dist/esm/utils.js
CHANGED
|
@@ -7,7 +7,35 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { Contract,
|
|
10
|
+
import { constants, Contract, providers, Signer } from 'ethers';
|
|
11
|
+
/**
|
|
12
|
+
* Ensures that given signer is truly a a connected signer
|
|
13
|
+
* @param signer an ethers signer
|
|
14
|
+
* @throws if signer is invalid or not connected
|
|
15
|
+
*/
|
|
16
|
+
export function validateSigner(signer) {
|
|
17
|
+
if (!Signer.isSigner(signer)) {
|
|
18
|
+
throw new Error('A valid signer must be provided');
|
|
19
|
+
}
|
|
20
|
+
if (!providers.Provider.isProvider(signer.provider)) {
|
|
21
|
+
throw new Error('Signer must be connected to a provider');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Ensures that given signerOrProvider is truly a provider or a connected signer
|
|
26
|
+
* @param signerOrProvider an ethers provider or signer
|
|
27
|
+
* @throws if signerOrProvider is invalid or not connected
|
|
28
|
+
*/
|
|
29
|
+
export function validateSignerOrProvider(signerOrProvider) {
|
|
30
|
+
const isSigner = Signer.isSigner(signerOrProvider);
|
|
31
|
+
const isProvider = providers.Provider.isProvider(signerOrProvider);
|
|
32
|
+
if (!isSigner && !isProvider) {
|
|
33
|
+
throw new Error('A valid signer or provider must be provided');
|
|
34
|
+
}
|
|
35
|
+
if (isSigner && !providers.Provider.isProvider(signerOrProvider.provider)) {
|
|
36
|
+
throw new Error('Signer must be connected to a provider');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
11
39
|
/**
|
|
12
40
|
* Returns the broker address from the Celo registry
|
|
13
41
|
* @param signerOrProvider an ethers provider or signer
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mento-protocol/mento-sdk",
|
|
3
3
|
"description": "Official SDK for interacting with the Mento Protocol",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.3",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Mento Labs",
|
|
7
7
|
"keywords": [
|
|
@@ -17,14 +17,16 @@
|
|
|
17
17
|
"module": "dist/esm/index.js",
|
|
18
18
|
"typings": "dist/esm/index.d.ts",
|
|
19
19
|
"files": [
|
|
20
|
-
"dist"
|
|
20
|
+
"dist",
|
|
21
|
+
"!dist/**/*.test.*"
|
|
21
22
|
],
|
|
22
23
|
"scripts": {
|
|
23
24
|
"analyze": "size-limit --why",
|
|
24
25
|
"build": "yarn build:cjs && yarn build:esm",
|
|
25
26
|
"build:cjs": "tsc --project ./tsconfig.json",
|
|
26
27
|
"build:esm": "tsc --project ./tsconfig.esm.json",
|
|
27
|
-
"
|
|
28
|
+
"clean": "rm -rf ./dist",
|
|
29
|
+
"lint": "eslint --config ./.eslintrc.json src/**/*.ts",
|
|
28
30
|
"prettier": "prettier --config ./.prettierrc.json --write **/*.{json,md,js,ts,yml}",
|
|
29
31
|
"size": "size-limit",
|
|
30
32
|
"test": "jest --runInBand --verbose",
|
|
@@ -61,15 +63,17 @@
|
|
|
61
63
|
"@tsconfig/recommended": "^1.0.1",
|
|
62
64
|
"@types/jest": "^29.4.0",
|
|
63
65
|
"@types/node": "^18.13.0",
|
|
64
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
65
|
-
"@typescript-eslint/parser": "^5.
|
|
66
|
-
"eslint": "^8.
|
|
66
|
+
"@typescript-eslint/eslint-plugin": "^5.53.0",
|
|
67
|
+
"@typescript-eslint/parser": "^5.53.0",
|
|
68
|
+
"eslint": "^8.34.0",
|
|
69
|
+
"eslint-config-prettier": "^8.6.0",
|
|
67
70
|
"ethers": "^5.7.2",
|
|
68
71
|
"husky": "^8.0.2",
|
|
69
72
|
"jest": "^29.4.2",
|
|
70
73
|
"prettier": "^2.8.4",
|
|
71
74
|
"size-limit": "^8.1.0",
|
|
72
75
|
"ts-jest": "^29.0.5",
|
|
76
|
+
"ts-node": "^10.9.1",
|
|
73
77
|
"typescript": "^4.9.5"
|
|
74
78
|
},
|
|
75
79
|
"dependencies": {
|
|
@@ -77,5 +81,6 @@
|
|
|
77
81
|
},
|
|
78
82
|
"peerDependencies": {
|
|
79
83
|
"ethers": "^5.7.2"
|
|
80
|
-
}
|
|
84
|
+
},
|
|
85
|
+
"packageManager": "yarn@3.3.1"
|
|
81
86
|
}
|