@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 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
- # Sample Usage
5
+ # Example Usage
6
6
 
7
7
  ```javascript
8
- const provider = new providers.JsonRpcProvider(
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
- const mento = await Mento.create(wallet)
10
+ import { Mento } from '@mento-protocol/mento-sdk'
15
11
 
16
- console.log('available pairs: ', await mento.getTradeablePairs())
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
- address: '0x62492A644A588FD904270BeD06ad52B9abfEA1aE',
22
- symbol: 'cUSD'
23
- },
24
- {
25
- address: '0xdDc9bE57f553fe75752D61606B94CBD7e0264eF8',
26
- symbol: 'CELO'
27
- }
28
- ],
29
- ...
30
- ]
31
- */
32
-
33
- // swap 1 CELO for cUSD
34
- const one = 1
35
- const tokenIn = '0xdDc9bE57f553fe75752D61606B94CBD7e0264eF8' // CELO
36
- const tokenOut = '0x62492A644A588FD904270BeD06ad52B9abfEA1aE' // cUSD
37
- const amountIn = utils.parseUnits(one.toString(), 18)
38
- const expectedAmountOut = await mento.getAmountOut(
39
- tokenIn,
40
- tokenOut,
41
- utils.parseUnits(one.toString(), 18)
42
- )
43
- // 95% of the quote to allow some slippage
44
- const minAmountOut = expectedAmountOut.mul(95).div(100)
45
-
46
- // allow the broker contract to spend CELO on behalf of the wallet
47
- const allowanceTxObj = await mento.increaseTradingAllowance(tokenIn, amountIn)
48
- const allowanceTx = await wallet.sendTransaction(allowanceTxObj)
49
- const allowanceReceipt = await allowanceTx.wait()
50
- console.log('increaseAllowance receipt', allowanceReceipt)
51
-
52
- // execute the swap
53
- const swapTxObj = await mento.swapIn(tokenIn, tokenOut, amountIn, minAmountOut)
54
- const swapTx = await wallet.sendTransaction(swapTxObj)
55
- const swapReceipt = await swapTx.wait()
56
-
57
- console.log('swapIn receipt', swapReceipt)
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
  ```
@@ -1,6 +1,12 @@
1
- import { BigNumber, Signer, providers } from 'ethers';
1
+ import { IBroker } from '@mento-protocol/mento-core-ts';
2
+ import { BigNumber, providers, Signer } from 'ethers';
2
3
  import { Address } from './types';
3
- interface Asset {
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 createWithBrokerAddress methods
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 provider an ethers provider
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 specific broker address
28
- * When constructed with only a Provider only read-only operations are supported
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 createWithBrokerAddress(brokerAddr: Address, signerOrProvider: Signer | providers.Provider): Mento;
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
- private getExchanges;
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
- private getExchangeForTokens;
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 createWithBrokerAddress methods
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 provider an ethers provider
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, signerOrProvider) {
26
- this.broker = mento_core_ts_1.IBroker__factory.connect(brokerAddress, signerOrProvider);
25
+ constructor(signerOrProvider, brokerAddress, exchanges) {
27
26
  this.signerOrProvider = signerOrProvider;
28
- this.exchanges = new Array();
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
- const isSigner = ethers_1.Signer.isSigner(signerOrProvider);
39
- const isProvider = ethers_1.providers.Provider.isProvider(signerOrProvider);
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 specific broker address
53
- * When constructed with only a Provider only read-only operations are supported
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 createWithBrokerAddress(brokerAddr, signerOrProvider) {
59
- const isSigner = ethers_1.Signer.isSigner(signerOrProvider);
60
- const isProvider = ethers_1.providers.Provider.isProvider(signerOrProvider);
61
- if (!isSigner && !isProvider) {
62
- throw new Error('A valid signer or provider must be provided');
63
- }
64
- if (isSigner) {
65
- if (!ethers_1.providers.Provider.isProvider(signerOrProvider.provider)) {
66
- throw new Error('Signer must be connected to a provider');
67
- }
68
- }
69
- return new Mento(brokerAddr, signerOrProvider);
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
- for (const exchangeProviderAddr of exchangeProvidersAddresses) {
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* () {
@@ -1,5 +1,17 @@
1
- import { BigNumber, Signer, providers } from 'ethers';
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
@@ -1,6 +1,12 @@
1
- import { BigNumber, Signer, providers } from 'ethers';
1
+ import { IBroker } from '@mento-protocol/mento-core-ts';
2
+ import { BigNumber, providers, Signer } from 'ethers';
2
3
  import { Address } from './types';
3
- interface Asset {
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 createWithBrokerAddress methods
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 provider an ethers provider
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 specific broker address
28
- * When constructed with only a Provider only read-only operations are supported
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 createWithBrokerAddress(brokerAddr: Address, signerOrProvider: Signer | providers.Provider): Mento;
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
- private getExchanges;
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
- private getExchangeForTokens;
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 { getBrokerAddressFromRegistry, getSymbolFromTokenAddress, increaseAllowance, } from './utils';
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 createWithBrokerAddress methods
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 provider an ethers provider
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, signerOrProvider) {
23
- this.broker = IBroker__factory.connect(brokerAddress, signerOrProvider);
22
+ constructor(signerOrProvider, brokerAddress, exchanges) {
24
23
  this.signerOrProvider = signerOrProvider;
25
- this.exchanges = new Array();
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
- const isSigner = Signer.isSigner(signerOrProvider);
36
- const isProvider = providers.Provider.isProvider(signerOrProvider);
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 specific broker address
50
- * When constructed with only a Provider only read-only operations are supported
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 createWithBrokerAddress(brokerAddr, signerOrProvider) {
56
- const isSigner = Signer.isSigner(signerOrProvider);
57
- const isProvider = providers.Provider.isProvider(signerOrProvider);
58
- if (!isSigner && !isProvider) {
59
- throw new Error('A valid signer or provider must be provided');
60
- }
61
- if (isSigner) {
62
- if (!providers.Provider.isProvider(signerOrProvider.provider)) {
63
- throw new Error('Signer must be connected to a provider');
64
- }
65
- }
66
- return new Mento(brokerAddr, signerOrProvider);
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
- for (const exchangeProviderAddr of exchangeProvidersAddresses) {
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* () {
@@ -1,5 +1,17 @@
1
- import { BigNumber, Signer, providers } from 'ethers';
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, constants } from 'ethers';
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.2",
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
- "lint": "eslint --config ./.eslintrc.json **/*.{json,ts}",
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.51.0",
65
- "@typescript-eslint/parser": "^5.51.0",
66
- "eslint": "^8.33.0",
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
  }