master
cyl19970726 2 years ago
parent e2a3c743d5
commit 3419e228f0

@ -41,4 +41,28 @@ export const importActions = [
return 'default' return 'default'
}, },
} }
]
export const createHubActions = [
{
type: 'list',
name: 'permissionless',
message: 'can anyone join hub?',
choices: [
'yes',
'no',
],
},
]
export const HubMemberActions = [
{
type: 'list',
name: 'role',
message: 'add contributor or manager into hub',
choices: [
'contribotor',
'manager',
],
},
] ]

@ -3,7 +3,7 @@ import { ethers } from "ethers"
import { Command } from "commander" import { Command } from "commander"
import bip39 from "bip39" import bip39 from "bip39"
import inquirer from "inquirer" import inquirer from "inquirer"
import { importActions, generateActions } from "./actions.js" import { importActions, generateActions,createHubActions,HubMemberActions } from "./actions.js"
import network from "../config/evm-network.js" import network from "../config/evm-network.js"
import { explorerTxUrl, getWallet, randomRPC, setupContract } from "../common/wallet.js" import { explorerTxUrl, getWallet, randomRPC, setupContract } from "../common/wallet.js"
import { parseGit3URI } from "../common/git3-protocol.js" import { parseGit3URI } from "../common/git3-protocol.js"
@ -15,10 +15,20 @@ const program = new Command()
program.name("git3").description("git3 mangement tool").version("0.1.0") program.name("git3").description("git3 mangement tool").version("0.1.0")
program let wallet = program
.command("generate") .command("wallet")
.alias("gen") .description("wallet [create/import/delete/list]")
.alias("new")
let hub = program
.command("hub")
.description("hub [create/join/list/members/add-member/remove-member]")
let repo = program
.command("repo")
.description("repo [create/members/add-member/remove-member]")
wallet
.command("create")
.description("generate a cryto wallet to use git3") .description("generate a cryto wallet to use git3")
.action(() => { .action(() => {
inquirer.prompt(generateActions).then((answers) => { inquirer.prompt(generateActions).then((answers) => {
@ -47,9 +57,8 @@ program
}) })
}) })
program wallet
.command("list", { isDefault: true }) .command("list")
.alias("ls")
.description("list all wallets in user folder ~/.git3/keys") .description("list all wallets in user folder ~/.git3/keys")
.option("-r, --raw", "output raw wallet data with pravate key / mnemonic") .option("-r, --raw", "output raw wallet data with pravate key / mnemonic")
.action((params) => { .action((params) => {
@ -83,7 +92,7 @@ program
}) })
}) })
program wallet
.command("import") .command("import")
.description("import a wallet from a private key or mnemonic") .description("import a wallet from a private key or mnemonic")
.action(() => { .action(() => {
@ -104,7 +113,7 @@ program
}) })
}) })
program wallet
.command("delete") .command("delete")
.description("delete a wallet") .description("delete a wallet")
.action(() => { .action(() => {
@ -132,16 +141,45 @@ program
}) })
}) })
let create = program wallet
.command("create") .command("info")
.description("create hub [is_permissionless] OR create repo <uri>") .argument("[wallet]", "wallet you want to get info", "default")
.description("get info of a wallet")
.action((wallet) => {
let etherWallet = getWallet(wallet)
create const address = etherWallet.address
.command("hub")
console.log(`wallet: ${wallet}`)
console.log(`address: ${address}`)
for (let [_, net] of Object.entries(network)) {
const provider = new ethers.providers.JsonRpcProvider(randomRPC(net.rpc))
const balance = provider.getBalance(address)
balance.then((res) => {
console.log(
`[${net.name}] balance: ${ethers.utils.formatUnits(
res,
net.nativeCurrency.decimals
)} ${net.nativeCurrency.symbol}`
)
})
}
})
hub
.command("create")
.argument("<chain>", "chain name or chain id") .argument("<chain>", "chain name or chain id")
.argument("[is_permissionless]", "true or false", false)
.description("create a new hub") .description("create a new hub")
.action(async (chain, isPermissionless) => { .action(async (chain) => {
let answers = await inquirer.prompt(createHubActions)
const {permissionless} = answers
let isPermissionless = permissionless === "yes"? true:false
console.log(`creating hub with permissionless:${isPermissionless} ...`)
let netConfig, chainId let netConfig, chainId
chainId = parseInt(chain) chainId = parseInt(chain)
if (chainId) { if (chainId) {
@ -177,48 +215,26 @@ create
console.log("hub owner:", events[0].args.creator) console.log("hub owner:", events[0].args.creator)
}) })
create wallet
.command("repo") .command("clear")
.argument("<uri>", "ex: git3.w3q/repo_name or hub_addr:chainid/repo_name") .description("clear pending nonce")
.description("create a new repo") .argument("<uri>", "ex: default@git3.w3q")
.action(async (uri) => { .argument("[num]", "number of pending nonce to clear", 1)
const protocol = await parseGit3URI(uri, { ignoreProtocolHeader: true }) .action(async (uri, num) => {
if (!uri.startsWith("git3://")) {
let isMember = await protocol.hub.membership(protocol.wallet.address) uri = "git3://" + uri
if (!isMember) {
let hubName = protocol.ns
? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress
console.error(`you are not a member of this hub: ${hubName}`)
let isPermissionless = await protocol.hub.permissionless()
if (isPermissionless) {
console.error(
`this hub is permissionless, you can join it with: git3 join ${hubName}`
)
} else {
console.error(
`this hub is not permissionless, you can ask the hub owner to add you as a member`
)
}
return
}
let owner = await protocol.hub.repoOwner(Buffer.from(protocol.repoName))
if (owner != "0x0000000000000000000000000000000000000000") {
console.error(`repo ${protocol.repoName} already exists`)
return
} }
const protocol = await parseGit3URI(uri, { skipRepoName: true })
console.log(`creating repo ${protocol.repoName} on ${protocol.netConfig.name}...`)
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst) const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
let receipt = await txManager.SendCall("createRepo", [Buffer.from(protocol.repoName)]) let nonce = await protocol.wallet.getTransactionCount()
console.log(`current nonce: ${nonce}`)
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers)) await txManager.clearPendingNonce(num)
console.log(`repo ${protocol.repoName} created.`) nonce = await protocol.wallet.getTransactionCount()
console.log(`current nonce: ${nonce}`)
}) })
program // =============================Hub Commands===================================
hub
.command("join") .command("join")
.argument("<hub>", "hub_name.NS or hub_address:chain_id") .argument("<hub>", "hub_name.NS or hub_address:chain_id")
.description("join a permissionless hub") .description("join a permissionless hub")
@ -234,130 +250,169 @@ program
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers)) console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
}) })
program hub
.command("addManager") .command("add-member")
.argument("<hub>", "hub_name.NS or hub_address:chain_id") .argument("<member address>", "member address which will be added to the hub")
.argument("<manager address>", "manager address") .option("-u, --uri <uri>", "hub_name.NS or hub_address:chain_id")
.description("add a manager into hub") .description("add a manager/contributor into hub")
.action(async (hub,managerAddr) => { .action(async (member,options) => {
let protocol = await parseGit3URI(hub, { ignoreProtocolHeader: true, skipRepoName: true })
let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address) let answers = await inquirer.prompt(HubMemberActions)
if (!isAdmin) { let memberIsManager = answers.role === 'manager' ? true: false
let hubName = protocol.ns let protocol = await parseGit3URI(options.uri, { ignoreProtocolHeader: true, skipRepoName: true })
? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress if (memberIsManager){
console.error(`[addManager] can only be executed with the admin authority of this hub: ${hubName}`) let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address)
return if (!isAdmin) {
} let hubName = protocol.ns
? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress
console.error(`[addManager] can only be executed with the admin authority of this hub: ${hubName}`)
return
}
[isAdmin,isManager,isContributor] = await protocol.hub.memberRole(managerAddr) [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(member)
if (isManager) { if (isManager) {
let hubName = protocol.ns let hubName = protocol.ns
? `${protocol.nsName}.${protocol.nsDomain}` ? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress : protocol.hubAddress
console.error(`${managerAddr} is already a manager to hub: ${hubName}`) console.error(`${member} is already a manager to hub: ${hubName}`)
return return
} }
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst) const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
let receipt = await txManager.SendCall("addManager", [managerAddr]) let receipt = await txManager.SendCall("addManager", [member])
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers)) console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
}else{
let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address)
if (!isManager) {
let hubName = protocol.ns
? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress
console.error(`[addContributor] can only be executed with the manager authority of this hub: ${hubName}`)
return
}
[isAdmin,isManager,isContributor] = await protocol.hub.memberRole(member)
if (isContributor) {
let hubName = protocol.ns
? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress
console.error(`${member} is already a contributor to hub: ${hubName}`)
return
}
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
let receipt = await txManager.SendCall("addContributor", [member])
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
}
}) })
program program
.command("removeManager") .command("removeManager")
.argument("<hub>", "hub_name.NS or hub_address:chain_id")
.argument("<manager address>", "manager address") .argument("<manager address>", "manager address")
.description("remove a manager from hub") .option("-u, --uri <uri>", "hub_name.NS or hub_address:chain_id")
.action(async (hub,managerAddr) => { .description("remove a manager/contributor from hub")
let protocol = await parseGit3URI(hub, { ignoreProtocolHeader: true, skipRepoName: true }) .action(async (member,options) => {
let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address)
if (!isAdmin) { let answers = await inquirer.prompt(HubMemberActions)
let hubName = protocol.ns let memberIsManager = answers.role === 'manager' ? true: false
? `${protocol.nsName}.${protocol.nsDomain}` let protocol = await parseGit3URI(options.uri, { ignoreProtocolHeader: true, skipRepoName: true })
: protocol.hubAddress
console.error(`[removeManager] can only be executed with the admin authority of this hub: ${hubName}`) if (memberIsManager){
return let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address)
} if (!isAdmin) {
let hubName = protocol.ns
[isAdmin,isManager,isContributor] = await protocol.hub.memberRole(managerAddr) ? `${protocol.nsName}.${protocol.nsDomain}`
if (!isManager) { : protocol.hubAddress
let hubName = protocol.ns console.error(`[removeManager] can only be executed with the admin authority of this hub: ${hubName}`)
? `${protocol.nsName}.${protocol.nsDomain}` return
: protocol.hubAddress }
console.error(`${managerAddr} is not a manager to hub: ${hubName}`)
return
}
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst) [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(member)
let receipt = await txManager.SendCall("removeManager", [managerAddr]) if (!isManager) {
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers)) let hubName = protocol.ns
}) ? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress
console.error(`${member} is not a manager to hub: ${hubName}`)
return
}
program const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
.command("addCon") let receipt = await txManager.SendCall("removeManager", [member])
.argument("<hub>", "hub_name.NS or hub_address:chain_id") console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
.argument("<contributor address>", "contributor address") }else{
.description("add a manager into hub") let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address)
.action(async (hub,contributorAddr) => { if (!isManager) {
let protocol = await parseGit3URI(hub, { ignoreProtocolHeader: true, skipRepoName: true }) let hubName = protocol.ns
let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address) ? `${protocol.nsName}.${protocol.nsDomain}`
if (!isManager) { : protocol.hubAddress
let hubName = protocol.ns console.error(`[removeContributor] can only be executed with the manager authority of this hub: ${hubName}`)
? `${protocol.nsName}.${protocol.nsDomain}` return
: protocol.hubAddress }
console.error(`[addContributor] can only be executed with the manager authority of this hub: ${hubName}`)
return
}
[isAdmin,isManager,isContributor] = await protocol.hub.memberRole(contributorAddr) [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(member)
if (isContributor) { if (!isContributor) {
let hubName = protocol.ns let hubName = protocol.ns
? `${protocol.nsName}.${protocol.nsDomain}` ? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress : protocol.hubAddress
console.error(`${contributorAddr} is already a contributor to hub: ${hubName}`) console.error(`${member} is not a contributor to hub: ${hubName}`)
return return
}
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
let receipt = await txManager.SendCall("removeContributor", [member])
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
} }
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
let receipt = await txManager.SendCall("addContributor", [contributorAddr])
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
}) })
program // =============================Repo Commands===================================
.command("removeCon")
.argument("<hub>", "hub_name.NS or hub_address:chain_id") repo
.argument("<contributor address>", "contributor address") .command("create")
.description("add a manager into hub") .argument("<uri>", "ex: git3.w3q/repo_name or hub_addr:chainid/repo_name")
.action(async (hub,contributorAddr) => { .description("create a new repo")
let protocol = await parseGit3URI(hub, { ignoreProtocolHeader: true, skipRepoName: true }) .action(async (uri) => {
let [isAdmin,isManager,isContributor] = await protocol.hub.memberRole(protocol.wallet.address) const protocol = await parseGit3URI(uri, { ignoreProtocolHeader: true })
if (!isManager) {
let isMember = await protocol.hub.membership(protocol.wallet.address)
if (!isMember) {
let hubName = protocol.ns let hubName = protocol.ns
? `${protocol.nsName}.${protocol.nsDomain}` ? `${protocol.nsName}.${protocol.nsDomain}`
: protocol.hubAddress : protocol.hubAddress
console.error(`[removeContributor] can only be executed with the manager authority of this hub: ${hubName}`) console.error(`you are not a member of this hub: ${hubName}`)
let isPermissionless = await protocol.hub.permissionless()
if (isPermissionless) {
console.error(
`this hub is permissionless, you can join it with: git3 join ${hubName}`
)
} else {
console.error(
`this hub is not permissionless, you can ask the hub owner to add you as a member`
)
}
return return
} }
[isAdmin,isManager,isContributor] = await protocol.hub.memberRole(contributorAddr) let owner = await protocol.hub.repoOwner(Buffer.from(protocol.repoName))
if (!isContributor) {
let hubName = protocol.ns if (owner != "0x0000000000000000000000000000000000000000") {
? `${protocol.nsName}.${protocol.nsDomain}` console.error(`repo ${protocol.repoName} already exists`)
: protocol.hubAddress
console.error(`${contributorAddr} is not a contributor to hub: ${hubName}`)
return return
} }
console.log(`creating repo ${protocol.repoName} on ${protocol.netConfig.name}...`)
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst) const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
let receipt = await txManager.SendCall("removeContributor", [contributorAddr]) let receipt = await txManager.SendCall("createRepo", [Buffer.from(protocol.repoName)])
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers)) console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
console.log(`repo ${protocol.repoName} created.`)
}) })
// repo funcitons
let repository = program
.command("repository")
.description("repository related operations")
repository repo
.command("members") .command("members")
.argument("<uri>","ex: git3.w3q/repo_name or hub_addr:chainid/repo_name") .argument("<uri>","ex: git3.w3q/repo_name or hub_addr:chainid/repo_name")
.description("get all members information of the repository") .description("get all members information of the repository")
@ -369,13 +424,13 @@ repository
console.log(`owner:${owner} \ncontributors:${contributors}`) console.log(`owner:${owner} \ncontributors:${contributors}`)
}) })
repository repo
.command("addCon") .command("add-member")
.argument("<uri>","ex: git3.w3q/repo_name or hub_addr:chainid/repo_name")
.argument("<con addr>","contributor address") .argument("<con addr>","contributor address")
.option("-u, --uri <uri>","ex: git3.w3q/repo_name or hub_addr:chainid/repo_name")
.description("add a contributor into the specified repository") .description("add a contributor into the specified repository")
.action(async (uri,conAddr) => { .action(async (conAddr,options) => {
let protocol = await parseGit3URI(uri, { ignoreProtocolHeader: true, skipRepoName: true }) let protocol = await parseGit3URI(options.uri, { ignoreProtocolHeader: true, skipRepoName: true })
let owner = await protocol.hub.repoOwner(Buffer.from(protocol.repoName)) let owner = await protocol.hub.repoOwner(Buffer.from(protocol.repoName))
if (owner != protocol.wallet.address){ if (owner != protocol.wallet.address){
let hubName = protocol.ns let hubName = protocol.ns
@ -388,13 +443,13 @@ repository
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers)) console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
}) })
repository repo
.command("removeCon") .command("remove-member")
.argument("<uri>","ex: git3.w3q/repo_name or hub_addr:chainid/repo_name")
.argument("<con addr>","contributor address") .argument("<con addr>","contributor address")
.option("-u, --uri <uri>","ex: git3.w3q/repo_name or hub_addr:chainid/repo_name")
.description("remove a contributor from the specified repository") .description("remove a contributor from the specified repository")
.action(async (uri,conAddr) => { .action(async (conAddr,options) => {
let protocol = await parseGit3URI(uri, { ignoreProtocolHeader: true, skipRepoName: true }) let protocol = await parseGit3URI(options.uri, { ignoreProtocolHeader: true, skipRepoName: true })
let owner = await protocol.hub.repoOwner(Buffer.from(protocol.repoName)) let owner = await protocol.hub.repoOwner(Buffer.from(protocol.repoName))
if (owner != protocol.wallet.address){ if (owner != protocol.wallet.address){
let hubName = protocol.ns let hubName = protocol.ns
@ -407,51 +462,6 @@ repository
console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers)) console.log(explorerTxUrl(receipt.transactionHash, protocol.netConfig.explorers))
}) })
program
.command("info")
.argument("[wallet]", "wallet you want to get info", "default")
.description("get info of a wallet")
.action((wallet) => {
let etherWallet = getWallet(wallet)
const address = etherWallet.address
console.log(`wallet: ${wallet}`)
console.log(`address: ${address}`)
for (let [_, net] of Object.entries(network)) {
const provider = new ethers.providers.JsonRpcProvider(randomRPC(net.rpc))
const balance = provider.getBalance(address)
balance.then((res) => {
console.log(
`[${net.name}] balance: ${ethers.utils.formatUnits(
res,
net.nativeCurrency.decimals
)} ${net.nativeCurrency.symbol}`
)
})
}
})
program
.command("clear")
.description("clear pending nonce")
.argument("<uri>", "ex: default@git3.w3q")
.argument("[num]", "number of pending nonce to clear", 1)
.action(async (uri, num) => {
if (!uri.startsWith("git3://")) {
uri = "git3://" + uri
}
const protocol = await parseGit3URI(uri, { skipRepoName: true })
const txManager = new TxManager(protocol.hub, protocol.chainId, protocol.netConfig.txConst)
let nonce = await protocol.wallet.getTransactionCount()
console.log(`current nonce: ${nonce}`)
await txManager.clearPendingNonce(num)
nonce = await protocol.wallet.getTransactionCount()
console.log(`current nonce: ${nonce}`)
})
// Todo: set-wallet temporarily useless // Todo: set-wallet temporarily useless
// program // program
// .command("set-wallet") // .command("set-wallet")

Loading…
Cancel
Save