Skip to content

Commit 8250bb3

Browse files
committed
0.1.2
* bump tribute contracts version * prompt to set ext acl flags * parse extension flags * parse extension acl inputs * submit managing proposal
1 parent 085c821 commit 8250bb3

File tree

8 files changed

+189
-53
lines changed

8 files changed

+189
-53
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,5 @@ From the root folder of the project:
6060

6161
| Contracts | UI | CLI | Snapshot
6262
:----------:|:------------:|:--------:|:--------:|
63-
v1.0.0 | v1.1.0 | v0.1.1 | v1.2.0
63+
v1.0.0 | v1.1.0 | v0.1.1 | v1.2.0 |
64+
v1.0.2 | v1.1.0 | v0.1.2 | v1.2.0 |

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tribute-contracts-cli",
3-
"version": "0.1.1",
3+
"version": "0.1.2",
44
"description": "A command line interface tool to interact with @openlaw/tribute-contracts.",
55
"main": "cli.js",
66
"bin": {
@@ -25,7 +25,7 @@
2525
"ethereumjs-util": "7.1.0",
2626
"ethers": "5.4.5",
2727
"inquirer": "^8.1.2",
28-
"tribute-contracts": "^1.0.1",
28+
"tribute-contracts": "^1.0.2",
2929
"truffle": "5.4.6",
3030
"web3": "^1.4.0"
3131
},

src/contracts/adapters/managing-adapter.js

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,62 @@ const { configs } = require("../../../cli-config");
55

66
const { sha3 } = require("tribute-contracts/utils/ContractUtil");
77
const { prepareVoteProposalData } = require("@openlaw/snapshot-js-erc712");
8-
const { entryDao } = require("tribute-contracts/utils/DeploymentUtil");
8+
const {
9+
entryDao,
10+
entryBank,
11+
} = require("tribute-contracts/utils/DeploymentUtil");
912
const { getContract } = require("../../utils/contract");
1013
const { submitSnapshotProposal } = require("../../services/snapshot-service");
11-
const { parseDaoFlags } = require("../core/dao-registry");
14+
const { parseDaoFlags, getExtensionAddress } = require("../core/dao-registry");
15+
const { parseBankFlags } = require("../extensions/bank-extension");
1216
const { warn } = require("../../utils/logging");
1317

1418
const submitManagingProposal = async (
19+
updateType,
1520
adapterName,
1621
adapterAddress,
17-
aclFlags,
22+
daoAclFlags,
23+
extensions,
1824
keys,
1925
values,
2026
data,
2127
opts
2228
) => {
2329
const configKeys = keys ? keys.split(",").map((k) => toBytes32(k)) : [];
2430
const configValues = values ? values.split(",").map((v) => v) : [];
25-
const configAclFlags = parseDaoFlags(aclFlags);
31+
const configAclFlags = parseDaoFlags(daoAclFlags);
2632

2733
const { contract, provider, wallet } = getContract(
2834
"ManagingContract",
2935
configs.contracts.ManagingContract
3036
);
3137

38+
let extensionAddresses = [];
39+
let extensionAclFlags = [];
40+
if (extensions && extensions.length > 0) {
41+
for (let i in extensions) {
42+
const ext = extensions[i];
43+
extensionAddresses.push(await getExtensionAddress(ext.id));
44+
switch (ext.id) {
45+
case "bank":
46+
// Convert the acl flag to the interger flag value
47+
extensionAclFlags.push(
48+
entryBank({ address: undefined }, parseBankFlags(ext.selectedFlags))
49+
.flags
50+
);
51+
break;
52+
default:
53+
throw Error(`ACL flag not supported for extension: ${ext.name}`);
54+
}
55+
}
56+
}
57+
58+
const daoFlags = entryDao(
59+
adapterName,
60+
{ address: adapterAddress },
61+
configAclFlags
62+
).flags;
63+
3264
return await submitSnapshotProposal(
3365
`Adapter: ${adapterName}`,
3466
"Creates/Update adapter",
@@ -63,16 +95,15 @@ const submitManagingProposal = async (
6395
configs.contracts.DaoRegistry,
6496
daoProposalId,
6597
{
66-
adapterId: sha3(adapterName),
67-
adapterAddress: adapterAddress,
68-
flags: entryDao(
69-
adapterName,
70-
{ address: adapterAddress },
71-
configAclFlags
72-
).flags,
98+
adapterOrExtensionId: sha3(adapterName),
99+
adapterOrExtensionAddr: adapterAddress,
100+
updateType: updateType,
101+
flags: daoFlags,
102+
keys: configKeys,
103+
values: configValues,
104+
extensionAddresses: extensionAddresses,
105+
extensionAclFlags: extensionAclFlags,
73106
},
74-
configKeys,
75-
configValues,
76107
encodedData ? encodedData : ethers.utils.toUtf8Bytes(""),
77108
{ from: wallet.address }
78109
);

src/contracts/core/dao-registry.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,17 @@ const getAdapterAddress = async (adapterId) => {
3131
"DaoRegistry",
3232
configs.contracts.DaoRegistry
3333
);
34-
return await contract.getAdapterAddress(adapterId);
34+
return await contract.getAdapterAddress(sha3(adapterId));
3535
}
3636

37+
const getExtensionAddress = async (extensionId) => {
38+
const { contract } = getContract(
39+
"DaoRegistry",
40+
configs.contracts.DaoRegistry
41+
);
42+
return await contract.getExtensionAddress(sha3(extensionId));
43+
};
44+
3745
// TODO import from "tribute-contracts/utils/DeploymentUtil" v2.0.3
3846
const daoAccessFlags = [
3947
"REPLACE_ADAPTER",
@@ -63,4 +71,5 @@ module.exports = {
6371
getAddressIfDelegated,
6472
getMemberAddress,
6573
getAdapterAddress,
74+
getExtensionAddress,
6675
};

src/contracts/extensions/bank-extension.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,30 @@
11
const { getContract } = require("../../utils/contract");
22
const { configs } = require("../../../cli-config");
33

4+
// TODO import from "tribute-contracts/utils/DeploymentUtil" v2.x
5+
const bankAclFlags = [
6+
"ADD_TO_BALANCE",
7+
"SUB_FROM_BALANCE",
8+
"INTERNAL_TRANSFER",
9+
"WITHDRAW",
10+
"EXECUTE",
11+
"REGISTER_NEW_TOKEN",
12+
"REGISTER_NEW_INTERNAL_TOKEN",
13+
"UPDATE_TOKEN",
14+
];
15+
16+
// TODO import from "tribute-contracts/utils/DeploymentUtil" v2.x
17+
const parseBankFlags = (aclFlags) => {
18+
return aclFlags
19+
.map((f) => f.toUpperCase())
20+
.reduce((flags, flag) => {
21+
if (bankAclFlags.includes(flag)) {
22+
return { ...flags, [flag]: true };
23+
}
24+
throw Error(`Invalid Bank Access Flag: ${flag}`);
25+
}, {});
26+
};
27+
428
const getBalanceOf = async (memberAddress, tokenAddr) => {
529
const { contract } = getContract(
630
"BankExtension",
@@ -17,4 +41,4 @@ const getPriorAmount = async (account, tokenAddr, blockNumber) => {
1741
return await contract.getPriorAmount(account, tokenAddr, blockNumber);
1842
};
1943

20-
module.exports = { getBalanceOf, getPriorAmount };
44+
module.exports = { bankAclFlags, getBalanceOf, getPriorAmount, parseBankFlags };

src/interfaces/cli/commands/dao-registry-cmd.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const daoRegistryCommands = (program) => {
1818
logEnvConfigs(configs);
1919
info(`AdapterId:\t\t${adapterId}`);
2020

21-
return getAdapterAddress(sha3(adapterId))
21+
return getAdapterAddress(adapterId)
2222
.then((data) => {
2323
success(`Adapter Address: \t${data}\n`);
2424
})

src/interfaces/cli/commands/managing-cmd.js

Lines changed: 98 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ const {
44
submitManagingProposal,
55
processManagingProposal,
66
} = require("../../../contracts/adapters/managing-adapter");
7+
const {
8+
bankAclFlags,
9+
} = require("../../../contracts/extensions/bank-extension");
710

811
const { configs } = require("../../../../cli-config");
912
const { daoAccessFlags } = require("../../../contracts/core/dao-registry");
@@ -23,34 +26,102 @@ const managingCommands = (program) => {
2326
)
2427
.description("Submit a new managing proposal.")
2528
.action(async (adapterName, adapterAddress, keys, values, data) => {
26-
await inquirer
27-
.prompt([
28-
{
29-
type: "checkbox",
30-
message: "Select the ACL Flags or hit ENTER to skip",
31-
name: "aclFlags",
32-
choices: daoAccessFlags.map((f) => Object.assign({ name: f })),
33-
},
34-
])
35-
.then((anwsers) => {
36-
notice(`\n ::: Submitting Managing proposal...\n`);
37-
logEnvConfigs(configs, configs.contracts.ManagingContract);
38-
info(`Adapter:\t\t${adapterName} @ ${adapterAddress}`);
39-
info(`AccessFlags:\t\t${JSON.stringify(anwsers.aclFlags)}`);
40-
info(`Keys:\t\t\t${keys ? keys : "n/a"}`);
41-
info(`Values:\t\t\t${values ? values : "n/a"}`);
42-
info(`Data:\t\t\t${data ? data : "n/a"}\n`);
29+
const { updateType } = await inquirer.prompt([
30+
{
31+
type: "list",
32+
message: "Which type of contract are you going to update?",
33+
name: "updateType",
34+
choices: [
35+
{
36+
name: "Adapter",
37+
value: 1,
38+
description: "If you want to Add/Remove/Update adapters",
39+
},
40+
{
41+
name: "Extension",
42+
value: 2,
43+
description: "If want to Add/Remove/Update extensions",
44+
},
45+
],
46+
},
47+
]);
4348

44-
return submitManagingProposal(
45-
adapterName,
46-
adapterAddress,
47-
anwsers.aclFlags,
48-
keys,
49-
values,
50-
data,
51-
program.opts()
52-
);
53-
})
49+
const { daoAclFlags } = await inquirer.prompt([
50+
{
51+
type: "checkbox",
52+
message: "Select the **DAO** ACL Flags or hit ENTER to skip",
53+
name: "daoAclFlags",
54+
choices: daoAccessFlags.map((f) => Object.assign({ name: f })),
55+
},
56+
]);
57+
58+
const allExtensions = [
59+
{
60+
name: "Bank",
61+
id: "bank",
62+
aclFlags: bankAclFlags,
63+
selectedFlags: [],
64+
},
65+
];
66+
67+
const { requiredExtensions } = await inquirer.prompt([
68+
{
69+
type: "checkbox",
70+
message: "Does the adapter needs access to any of these extensions?",
71+
name: "requiredExtensions",
72+
choices: allExtensions,
73+
},
74+
]);
75+
76+
const extensions = await requiredExtensions
77+
.flatMap((name) => allExtensions.filter((ext) => ext.name === name))
78+
.reduce(async (res, extension) => {
79+
const { flags } = await inquirer.prompt([
80+
{
81+
type: "checkbox",
82+
message: `Select the **${extension.name}** ACL Flags or hit ENTER to skip`,
83+
name: "flags",
84+
choices: extension.aclFlags.map((f) =>
85+
Object.assign({ name: f })
86+
),
87+
},
88+
]);
89+
if (flags && flags.length > 0) {
90+
res.push({ ...extension, selectedFlags: flags });
91+
}
92+
return res;
93+
}, []);
94+
95+
notice(`\n ::: Submitting Managing proposal...\n`);
96+
logEnvConfigs(configs, configs.contracts.ManagingContract);
97+
info(`Adapter:\t\t${adapterName} @ ${adapterAddress}`);
98+
info(`AccessFlags:\t\t${JSON.stringify(daoAclFlags)}`);
99+
info(`Keys:\t\t\t${keys ? keys : "n/a"}`);
100+
info(`Values:\t\t\t${values ? values : "n/a"}`);
101+
info(`Data:\t\t\t${data ? data : "n/a"}`);
102+
info(
103+
`Extensions:\t\t${
104+
extensions
105+
? JSON.stringify(
106+
extensions.map((e) =>
107+
Object.assign({ [e.name]: e.selectedFlags })
108+
)
109+
)
110+
: "n/a"
111+
}\n`
112+
);
113+
114+
return submitManagingProposal(
115+
updateType,
116+
adapterName,
117+
adapterAddress,
118+
daoAclFlags,
119+
extensions,
120+
keys,
121+
values,
122+
data,
123+
program.opts()
124+
)
54125
.then((data) => {
55126
success(`New Snapshot Proposal Id: ${data.snapshotProposalId}\n`);
56127
notice(`::: Managing proposal submitted!\n`);

0 commit comments

Comments
 (0)