@defisaver/sdk 0.1.11 → 0.1.12
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/DEV.md +26 -4
- package/package.json +1 -1
- package/src/Action.js +7 -4
- package/src/Recipe.js +7 -4
- package/src/types.js +11 -0
- package/test/accessLists/Recipe.js +9 -6
- package/test/accessLists/access-lists.js +15 -8
package/DEV.md
CHANGED
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
<dt><a href="#VaultId">VaultId</a> : <code>string</code> | <code>number</code></dt>
|
|
30
30
|
<dd><p>Maker vault ID</p>
|
|
31
31
|
</dd>
|
|
32
|
+
<dt><a href="#AccessListItem">AccessListItem</a> : <code>Object</code></dt>
|
|
33
|
+
<dd><p>Access list item</p>
|
|
34
|
+
</dd>
|
|
35
|
+
<dt><a href="#AccessList">AccessList</a> : <code><a href="#AccessListItem">Array.<AccessListItem></a></code></dt>
|
|
36
|
+
<dd></dd>
|
|
32
37
|
</dl>
|
|
33
38
|
|
|
34
39
|
<a name="utils.module_uniswapLP"></a>
|
|
@@ -159,7 +164,7 @@ Single action that can be executed directly, or combined into a set (ie. supply
|
|
|
159
164
|
* [.encodeForRecipe()](#Action+encodeForRecipe) ⇒ <code>Array.<string></code>
|
|
160
165
|
* [.getAssetsToApprove()](#Action+getAssetsToApprove) ⇒ <code>Promise.<Array.<{owner: string, asset: string}>></code>
|
|
161
166
|
* [.getEthValue()](#Action+getEthValue) ⇒ <code>Promise.<string></code>
|
|
162
|
-
* [.getAccessList()](#Action+getAccessList) ⇒ <code>
|
|
167
|
+
* [.getAccessList()](#Action+getAccessList) ⇒ [<code>AccessList</code>](#AccessList)
|
|
163
168
|
|
|
164
169
|
<a name="new_Action_new"></a>
|
|
165
170
|
|
|
@@ -200,7 +205,7 @@ ETH value to be sent with transaction
|
|
|
200
205
|
**Returns**: <code>Promise.<string></code> - ETH value in wei
|
|
201
206
|
<a name="Action+getAccessList"></a>
|
|
202
207
|
|
|
203
|
-
### action.getAccessList() ⇒ <code>
|
|
208
|
+
### action.getAccessList() ⇒ [<code>AccessList</code>](#AccessList)
|
|
204
209
|
Access list for single action
|
|
205
210
|
|
|
206
211
|
**Kind**: instance method of [<code>Action</code>](#Action)
|
|
@@ -218,7 +223,7 @@ Set of Actions to be performed sequentially in a single transaction
|
|
|
218
223
|
* [._validateParamMappings()](#Recipe+_validateParamMappings)
|
|
219
224
|
* [.getAssetsToApprove()](#Recipe+getAssetsToApprove) ⇒ <code>Promise.<Array.<{owner: string, asset: string}>></code>
|
|
220
225
|
* [.getEthValue()](#Recipe+getEthValue) ⇒ <code>Promise.<string></code>
|
|
221
|
-
* [.getAccessList()](#Recipe+getAccessList) ⇒ <code>
|
|
226
|
+
* [.getAccessList()](#Recipe+getAccessList) ⇒ [<code>AccessList</code>](#AccessList)
|
|
222
227
|
|
|
223
228
|
<a name="new_Recipe_new"></a>
|
|
224
229
|
|
|
@@ -265,7 +270,7 @@ ETH value to be sent with transaction
|
|
|
265
270
|
**Returns**: <code>Promise.<string></code> - ETH value in wei
|
|
266
271
|
<a name="Recipe+getAccessList"></a>
|
|
267
272
|
|
|
268
|
-
### recipe.getAccessList() ⇒ <code>
|
|
273
|
+
### recipe.getAccessList() ⇒ [<code>AccessList</code>](#AccessList)
|
|
269
274
|
Generates an access list for the recipe
|
|
270
275
|
|
|
271
276
|
**Kind**: instance method of [<code>Recipe</code>](#Recipe)
|
|
@@ -281,3 +286,20 @@ Ethereum address
|
|
|
281
286
|
Maker vault ID
|
|
282
287
|
|
|
283
288
|
**Kind**: global typedef
|
|
289
|
+
<a name="AccessListItem"></a>
|
|
290
|
+
|
|
291
|
+
## AccessListItem : <code>Object</code>
|
|
292
|
+
Access list item
|
|
293
|
+
|
|
294
|
+
**Kind**: global typedef
|
|
295
|
+
**Properties**
|
|
296
|
+
|
|
297
|
+
| Name | Type |
|
|
298
|
+
| --- | --- |
|
|
299
|
+
| address | <code>string</code> |
|
|
300
|
+
| storageKeys | <code>Array.<string></code> |
|
|
301
|
+
|
|
302
|
+
<a name="AccessList"></a>
|
|
303
|
+
|
|
304
|
+
## AccessList : [<code>Array.<AccessListItem></code>](#AccessListItem)
|
|
305
|
+
**Kind**: global typedef
|
package/package.json
CHANGED
package/src/Action.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const AbiCoder = require('web3-eth-abi');
|
|
2
|
-
const
|
|
2
|
+
const { keccak256, padLeft, toHex } = require('web3-utils');
|
|
3
3
|
|
|
4
4
|
const ActionAbi = require('./abis/Action.json');
|
|
5
5
|
|
|
@@ -32,7 +32,7 @@ class Action {
|
|
|
32
32
|
* @private
|
|
33
33
|
*/
|
|
34
34
|
_getId() {
|
|
35
|
-
return
|
|
35
|
+
return keccak256(this.name);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
@@ -137,13 +137,16 @@ class Action {
|
|
|
137
137
|
|
|
138
138
|
/**
|
|
139
139
|
* Access list for single action
|
|
140
|
-
* @returns {
|
|
140
|
+
* @returns {AccessList}
|
|
141
141
|
*/
|
|
142
142
|
getAccessList() {
|
|
143
143
|
return [
|
|
144
144
|
[this.contractAddress, []],
|
|
145
145
|
...(AccessLists[this.name] || []),
|
|
146
|
-
]
|
|
146
|
+
].map(([address, storageKeys]) => ({
|
|
147
|
+
address: address,
|
|
148
|
+
storageKeys: storageKeys.map(num => padLeft(toHex(num), 64)),
|
|
149
|
+
}));
|
|
147
150
|
}
|
|
148
151
|
}
|
|
149
152
|
|
package/src/Recipe.js
CHANGED
|
@@ -103,7 +103,7 @@ class Recipe {
|
|
|
103
103
|
|
|
104
104
|
/**
|
|
105
105
|
* Generates an access list for the recipe
|
|
106
|
-
* @returns {
|
|
106
|
+
* @returns {AccessList}
|
|
107
107
|
*/
|
|
108
108
|
getAccessList() {
|
|
109
109
|
const addressMapping = {
|
|
@@ -112,11 +112,14 @@ class Recipe {
|
|
|
112
112
|
};
|
|
113
113
|
this.actions.forEach((action) => {
|
|
114
114
|
const accessList = action.getAccessList();
|
|
115
|
-
accessList.forEach((
|
|
116
|
-
addressMapping[address] = new Set([...
|
|
115
|
+
accessList.forEach(({ address, storageKeys }) => {
|
|
116
|
+
addressMapping[address] = new Set([...storageKeys, ...(addressMapping[address] || [])]);
|
|
117
117
|
})
|
|
118
118
|
});
|
|
119
|
-
return Object.keys(addressMapping).map((
|
|
119
|
+
return Object.keys(addressMapping).map((address) => ({
|
|
120
|
+
address,
|
|
121
|
+
storageKeys: [...addressMapping[address]],
|
|
122
|
+
}));
|
|
120
123
|
}
|
|
121
124
|
}
|
|
122
125
|
|
package/src/types.js
CHANGED
|
@@ -7,3 +7,14 @@
|
|
|
7
7
|
* Maker vault ID
|
|
8
8
|
* @typedef {(string|number)} VaultId
|
|
9
9
|
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Access list item
|
|
13
|
+
* @typedef {Object} AccessListItem
|
|
14
|
+
* @property {string} address
|
|
15
|
+
* @property {Array<string>} storageKeys
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @typedef {Array<AccessListItem>} AccessList
|
|
20
|
+
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const AbiCoder = require('web3-eth-abi');
|
|
2
|
-
const { BN } = require('web3-utils');
|
|
2
|
+
const { BN, padLeft, toHex } = require('web3-utils');
|
|
3
3
|
const {getAssetInfo, utils: {compare}} = require("@defisaver/tokens");
|
|
4
4
|
const Action = require('../../src/Action');
|
|
5
5
|
const {getAddr} = require('../../src/addresses');
|
|
@@ -103,7 +103,7 @@ class Recipe {
|
|
|
103
103
|
|
|
104
104
|
/**
|
|
105
105
|
* Generates an access list for the recipe
|
|
106
|
-
* @returns {
|
|
106
|
+
* @returns {AccessList}
|
|
107
107
|
*/
|
|
108
108
|
getAccessList() {
|
|
109
109
|
const addressMapping = {
|
|
@@ -111,12 +111,15 @@ class Recipe {
|
|
|
111
111
|
[getAddr('DFSRegistry')]: [],
|
|
112
112
|
};
|
|
113
113
|
this.actions.forEach((action) => {
|
|
114
|
-
const accessList = MockAccessLists[action.name];
|
|
115
|
-
accessList.forEach((
|
|
116
|
-
addressMapping[address] = new Set([...
|
|
114
|
+
const accessList = MockAccessLists[action.name].map(([address, storageKeys]) => ({ address, storageKeys: storageKeys.map(num => padLeft(toHex(num), 64)) }));
|
|
115
|
+
accessList.forEach(({ address, storageKeys }) => {
|
|
116
|
+
addressMapping[address] = new Set([...storageKeys, ...(addressMapping[address] || [])]);
|
|
117
117
|
})
|
|
118
118
|
});
|
|
119
|
-
return Object.keys(addressMapping).map((
|
|
119
|
+
return Object.keys(addressMapping).map((address) => ({
|
|
120
|
+
address,
|
|
121
|
+
storageKeys: [...addressMapping[address]],
|
|
122
|
+
}));
|
|
120
123
|
}
|
|
121
124
|
}
|
|
122
125
|
|
|
@@ -2,18 +2,19 @@ const { assert } = require("chai");
|
|
|
2
2
|
const dfs = require("../../index.js");
|
|
3
3
|
const Recipe = require("./Recipe");
|
|
4
4
|
const MockAccessLists = require('./MockAccessLists');
|
|
5
|
+
const { padLeft, toHex } = require('web3-utils');
|
|
5
6
|
|
|
6
7
|
const testDuplicates = (accessList) => {
|
|
7
8
|
const contractAddrs = accessList.map((entry) => {
|
|
8
9
|
assert(
|
|
9
|
-
entry
|
|
10
|
+
entry.storageKeys.length === [...new Set(entry.storageKeys)].length,
|
|
10
11
|
'Duplicate storage address found',
|
|
11
12
|
);
|
|
12
|
-
return entry
|
|
13
|
+
return entry.address;
|
|
13
14
|
})
|
|
14
15
|
|
|
15
16
|
assert(
|
|
16
|
-
accessList.length
|
|
17
|
+
accessList.length === [...new Set(contractAddrs)].length,
|
|
17
18
|
'Duplicate contract address found',
|
|
18
19
|
);
|
|
19
20
|
|
|
@@ -22,15 +23,20 @@ const testDuplicates = (accessList) => {
|
|
|
22
23
|
|
|
23
24
|
const testInclusion = (recipe, accessList) => {
|
|
24
25
|
const actions = recipe.actions;
|
|
25
|
-
const addressMapping =
|
|
26
|
+
const addressMapping = accessList.reduce((list, current) => {
|
|
27
|
+
list[current.address] = current.storageKeys;
|
|
28
|
+
return list;
|
|
29
|
+
}, {});
|
|
26
30
|
actions.forEach((action) => {
|
|
27
|
-
MockAccessLists[action.name]
|
|
28
|
-
|
|
31
|
+
MockAccessLists[action.name]
|
|
32
|
+
.map(([address, storageKeys]) => ({ address, storageKeys: storageKeys.map(num => padLeft(toHex(num), 64)) }))
|
|
33
|
+
.forEach((entry) => {
|
|
34
|
+
const storageAddrs = new Set(addressMapping[entry.address]);
|
|
29
35
|
assert(
|
|
30
36
|
storageAddrs,
|
|
31
37
|
'Access list missing a contract address',
|
|
32
38
|
);
|
|
33
|
-
entry
|
|
39
|
+
entry.storageKeys.forEach((addr) => {
|
|
34
40
|
assert(
|
|
35
41
|
storageAddrs.has(addr),
|
|
36
42
|
'Access list missing a storage address',
|
|
@@ -79,7 +85,8 @@ describe('Access-Lists', () => {
|
|
|
79
85
|
sampleRecipes.forEach((recipe) => {
|
|
80
86
|
it(`... should make an access list for recipe ${recipe.name}`, () => {
|
|
81
87
|
const recipeAccessList = recipe.getAccessList();
|
|
82
|
-
|
|
88
|
+
console.log(recipeAccessList);
|
|
89
|
+
testDuplicates(recipeAccessList);
|
|
83
90
|
testInclusion(recipe, recipeAccessList);
|
|
84
91
|
});
|
|
85
92
|
});
|