Skip to content

Commit

Permalink
Merge pull request ubiquity#154 from FernandVEYRIER/development
Browse files Browse the repository at this point in the history
  • Loading branch information
0x4007 authored Feb 17, 2024
2 parents 8b78cc9 + 6c9239a commit dcac7ae
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 131 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
submodules: recursive

- name: Setup Node
uses: actions/setup-node@v3
Expand Down
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,7 @@
[submodule "lib/permit2"]
path = lib/permit2
url = https://github.com/Uniswap/permit2
[submodule "lib/ubiquibot"]
path = lib/ubiquibot
url = https://github.com/ubiquity/ubiquibot
shallow = true
1 change: 1 addition & 0 deletions lib/ubiquibot
Submodule ubiquibot added at 8afd7c
5 changes: 0 additions & 5 deletions static/onboarding.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,6 @@ <h1 class="title">Onboarding</h1>
<input type="text" class="form-control" id="walletPrivateKey" />
<span class="status-log"></span>
</div>
<div class="mb-3">
<label for="safeAddress" class="form-label">SAFE_ADDRESS</label>
<input type="text" class="form-control" id="safeAddress" />
<span class="status-log"></span>
</div>
<div class="mb-3">
<label for="githubPat" class="form-label">GITHUB_PAT</label>
<input type="text" class="form-control" id="githubPat" />
Expand Down
153 changes: 27 additions & 126 deletions static/scripts/onboarding/onboarding.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import _sodium from "libsodium-wrappers";
import { Octokit } from "@octokit/rest";
import { JsonRpcSigner } from "@ethersproject/providers";
import { createOrUpdateTextFile } from "@octokit/plugin-create-or-update-text-file";
import YAML from "yaml";
import { ethers } from "ethers";
import { Octokit } from "@octokit/rest";
import { PERMIT2_ADDRESS } from "@uniswap/permit2-sdk";
import { JsonRpcSigner, Network } from "@ethersproject/providers";
import { ethers } from "ethers";
import { parseUnits } from "ethers/lib/utils";
import { NetworkIds, Tokens, getNetworkName, networkNames } from "../rewards/constants";
import _sodium from "libsodium-wrappers";
import YAML from "yaml";
import { DefaultConfig } from "../../../lib/ubiquibot/src/configs/ubiquibot-config-default";
import { MergedConfig } from "../../../lib/ubiquibot/src/types";
import { erc20Abi } from "../rewards/abis/erc20Abi";
import { getNetworkName, NetworkIds, Tokens } from "../rewards/constants";

const classes = ["error", "warn", "success"];
const inputClasses = ["input-warn", "input-error", "input-success"];
Expand All @@ -22,107 +24,23 @@ const chainIdSelect = document.getElementById("chainId") as HTMLSelectElement;
const loader = document.querySelector(".loader-wrap") as HTMLElement;

const APP_ID = 236521;
const DEFAULT_ORG = "ubiquity";
const REPO_NAME = "ubiquibot-config";
const DEFAULT_REPO = "ubiquibot";
const KEY_PATH = ".github/ubiquibot-config.yml";
const DEFAULT_PATH = "ubiquibot-config-default.json";
const KEY_NAME = "private-key-encrypted";
const PRIVATE_ENCRYPTED_KEY_NAME = "privateKeyEncrypted";
const EVM_NETWORK_KEY_NAME = "evmNetworkId";
const KEY_PREFIX = "HSK_";
const X25519_KEY = "5ghIlfGjz_ChcYlBDOG7dzmgAgBPuTahpvTMBipSH00";

let encryptedValue = "";

interface ConfLabel {
name: string;
}

interface CommandLabel {
name: string;
enabled: boolean;
}

interface IIncentive {
comment: {
elements: Record<string, unknown>;
totals: {
word: number;
};
};
}

interface IControl {
label: boolean;
organization: boolean;
}

interface IConf {
"private-key-encrypted"?: string;
"safe-address"?: string;
"base-multiplier"?: number;
"auto-pay-mode"?: boolean;
"analytics-mode"?: boolean;
"max-concurrent-bounties"?: number;
"incentive-mode"?: boolean;
"evm-network-id"?: number;
"price-multiplier"?: number;
"issue-creator-multiplier"?: number;
"payment-permit-max-price"?: number;
"max-concurrent-assigns"?: number;
"assistive-pricing"?: boolean;
"disable-analytics"?: boolean;
"comment-incentives"?: boolean;
"register-wallet-with-verification"?: boolean;
"promotion-comment"?: string;
"default-labels"?: string[];
"time-labels"?: ConfLabel[];
"priority-labels"?: ConfLabel[];
"command-settings"?: CommandLabel[];
incentives?: IIncentive;
"enable-access-control"?: IControl;
}

let defaultConf: IConf = {
"private-key-encrypted": "",
"safe-address": "",
"base-multiplier": 1,
"auto-pay-mode": false,
"analytics-mode": false,
"max-concurrent-bounties": 1,
"incentive-mode": false,
"evm-network-id": 1,
"price-multiplier": 1,
"issue-creator-multiplier": 1,
"payment-permit-max-price": 1,
"max-concurrent-assigns": 1,
"assistive-pricing": false,
"disable-analytics": false,
"comment-incentives": false,
"register-wallet-with-verification": false,
"promotion-comment": "",
"default-labels": [],
"time-labels": [],
"priority-labels": [],
"command-settings": [],
incentives: {
comment: {
elements: {},
totals: {
word: 0,
},
},
},
"enable-access-control": {
label: false,
organization: true,
},
};
let defaultConf = DefaultConfig;

export const parseYAML = async (data: any): Promise<any | undefined> => {
export const parseYAML = async <T>(data: string | undefined) => {
if (!data) return undefined;
try {
const parsedData = await YAML.parse(data);
if (parsedData !== null) {
return parsedData;
return parsedData as T;
} else {
return undefined;
}
Expand All @@ -131,24 +49,24 @@ export const parseYAML = async (data: any): Promise<any | undefined> => {
}
};

export const parseJSON = async (data: any): Promise<any | undefined> => {
export const parseJSON = async <T>(data: string) => {
try {
const parsedData = await JSON.parse(data);
return parsedData;
return parsedData as T;
} catch (error) {
return undefined;
}
};

export const YAMLStringify = (value: any) => YAML.stringify(value, { defaultKeyType: "PLAIN", defaultStringType: "QUOTE_DOUBLE", lineWidth: 0 });

export const getConf = async (initial: boolean = false): Promise<string | undefined> => {
export const getConf = async (): Promise<string | undefined> => {
try {
const octokit = new Octokit({ auth: githubPAT.value });
const { data } = await octokit.rest.repos.getContent({
owner: initial ? DEFAULT_ORG : orgName.value,
repo: initial ? DEFAULT_REPO : REPO_NAME,
path: initial ? DEFAULT_PATH : KEY_PATH,
owner: orgName.value,
repo: REPO_NAME,
path: KEY_PATH,
mediaType: {
format: "raw",
},
Expand Down Expand Up @@ -227,9 +145,8 @@ const sodiumEncryptedSeal = async (publicKey: string, secret: string) => {
const binsec = sodium.from_string(secret);
const encBytes = sodium.crypto_box_seal(binsec, binkey);
const output = sodium.to_base64(encBytes, sodium.base64_variants.URLSAFE_NO_PADDING);
defaultConf[KEY_NAME] = output;
defaultConf["evm-network-id"] = Number(chainIdSelect.value);
defaultConf["safe-address"] = safeAddressInput.value;
defaultConf[PRIVATE_ENCRYPTED_KEY_NAME] = output;
defaultConf[EVM_NETWORK_KEY_NAME] = Number(chainIdSelect.value);
outKey.value = YAMLStringify(defaultConf);
outKey.style.height = getTextBox(outKey.value);
encryptedValue = output;
Expand Down Expand Up @@ -304,10 +221,9 @@ const setConfig = async () => {
const conf = await getConf();

const updatedConf = defaultConf;
const parsedConf: IConf | undefined = await parseYAML(conf);
updatedConf[KEY_NAME] = encryptedValue;
updatedConf["evm-network-id"] = Number(chainIdSelect.value);
updatedConf["safe-address"] = safeAddressInput.value;
const parsedConf = await parseYAML<MergedConfig>(conf);
updatedConf[PRIVATE_ENCRYPTED_KEY_NAME] = encryptedValue;
updatedConf[EVM_NETWORK_KEY_NAME] = Number(chainIdSelect.value);

// combine configs (default + remote org wide)
const combinedConf = Object.assign(updatedConf, parsedConf);
Expand Down Expand Up @@ -472,18 +388,6 @@ const step1Handler = async () => {
singleToggle("warn", `Warn: GitHub PAT is not set.`, githubPAT);
return;
}
if (!safeAddressInput.value.startsWith("0x")) {
singleToggle("warn", `Warn: Safe Address must start with 0x.`, safeAddressInput);
return;
}
if (!isHex(safeAddressInput.value.substring(2))) {
singleToggle("warn", `Warn: Safe Address is not a valid hex string.`, safeAddressInput);
return;
}
if (safeAddressInput.value.length !== 42) {
singleToggle("warn", `Warn: Safe Address must be 20 bytes long.`, safeAddressInput);
return;
}

await sodiumEncryptedSeal(X25519_KEY, `${KEY_PREFIX}${walletPrivateKey.value}`);
setConfig();
Expand Down Expand Up @@ -550,12 +454,9 @@ const step2Handler = async () => {
};

const init = async () => {
let conf = await getConf(true);
if (conf !== undefined) {
if (defaultConf !== undefined) {
try {
conf = JSON.parse(conf);
defaultConf = conf as IConf;
defaultConf["private-key-encrypted"] = "";
defaultConf[PRIVATE_ENCRYPTED_KEY_NAME] = undefined;
setInputListeners();

setBtn.addEventListener("click", async () => {
Expand Down

0 comments on commit dcac7ae

Please sign in to comment.