Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Ap proposals and improve Complaint logic #830

Draft
wants to merge 17 commits into
base: ap-dashboard
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file modified scripts/tgrade/contracts/cw20_base.wasm
Binary file not shown.
Binary file added scripts/tgrade/contracts/cw3_fixed_multisig.wasm
Binary file not shown.
21 changes: 16 additions & 5 deletions scripts/tgrade/contracts/download_releases.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
set -o errexit -o nounset -o pipefail -x
command -v shellcheck > /dev/null && shellcheck "$0"

if [ $# -ne 2 ]; then
echo "Usage: ./download_releases.sh cwplus_tag tfi_tag"
if [ $# -ne 3 ]; then
echo "Usage: ./download_releases.sh tgd_tag cwplus_tag tfi_tag"
exit 1
fi

cwplus_tag="$1"
tfi_tag="$2"
tgd_tag="$1"
cwplus_tag="$2"
tfi_tag="$3"

# load token from OS keychain when not set via ENV
GITHUB_API_TOKEN=${GITHUB_API_TOKEN:-"$(security find-generic-password -a "$USER" -s "github_api_key" -w)"}
Expand All @@ -17,7 +18,17 @@ GITHUB_API_TOKEN=${GITHUB_API_TOKEN:-"$(security find-generic-password -a "$USER
rm -f *.wasm
rm -f version.txt

CWPLUS="cw20_base"
TGD="tgrade_ap_voting"
for contract in $TGD; do
list_asset_url="https://api.github.com/repos/confio/tgrade-contracts/releases/tags/${tgd_tag}"
# get url for artifact with name==${contract}.wasm
artifact_url=$(curl -H "Accept: application/vnd.github.v3+json" -H "Authorization: token $GITHUB_API_TOKEN" "${list_asset_url}" | jq -r ".assets[] | select(.name==\"${contract}.wasm\") | .url")
# download the artifact
curl -LJO -H 'Accept: application/octet-stream' -H "Authorization: token $GITHUB_API_TOKEN" "$artifact_url"
done
echo "TGD_TAG=$tgd_tag" >> version.txt

CWPLUS="cw20_base cw3_fixed_multisig"
for contract in $CWPLUS; do
list_asset_url="https://api.github.com/repos/CosmWasm/cw-plus/releases/tags/${cwplus_tag}"
# get url for artifact with name==${contract}.wasm
Expand Down
Binary file modified scripts/tgrade/contracts/tfi_factory.wasm
Binary file not shown.
Binary file modified scripts/tgrade/contracts/tfi_pair.wasm
Binary file not shown.
Binary file added scripts/tgrade/contracts/tgrade_ap_voting.wasm
Binary file not shown.
Binary file modified scripts/tgrade/contracts/trusted_token.wasm
Binary file not shown.
3 changes: 2 additions & 1 deletion scripts/tgrade/contracts/version.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
TGD_TAG=v0.14.0
CWPLUS_TAG=v0.13.4
TFI_TAG=v0.4.0 (1df05f30)
TFI_TAG=v0.4.0
24 changes: 24 additions & 0 deletions scripts/tgrade/deploy_contracts.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,30 @@ async function main() {
);
console.info(`Upload Pair Contract succeeded. Receipt: ${JSON.stringify(uploadReceiptPair)}`);

// Multisig Contract: 14
console.info("Uploading Multisig wasm...");
const multisig = "cw3_fixed_multisig.wasm";
let wasmMultisig = fs.readFileSync(path.join(process.cwd(), "contracts", multisig));
const uploadReceiptMultisig = await client.upload(
address,
wasmMultisig,
calculateFee(25000000, config.gasPrice),
"upload multisig wasm",
);
console.info(`Upload Multisig Contract succeeded. Receipt: ${JSON.stringify(uploadReceiptMultisig)}`);

// AP Voting Contract: 15
console.info("Uploading AP Voting wasm...");
const apVoting = "tgrade_ap_voting.wasm";
let wasmApVoting = fs.readFileSync(path.join(process.cwd(), "contracts", apVoting));
const uploadReceiptApVoting = await client.upload(
address,
wasmApVoting,
calculateFee(25000000, config.gasPrice),
"upload ap voting wasm",
);
console.info(`Upload AP Voting Contract succeeded. Receipt: ${JSON.stringify(uploadReceiptApVoting)}`);

const codes = await client.getCodes();
console.info("codes", codes);
}
Expand Down
2 changes: 1 addition & 1 deletion scripts/tgrade/env
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Choose from https://hub.docker.com/r/confio/tgrade/tags
REPOSITORY="confio/tgrade"
VERSION="v1.0.1"
VERSION="v2.1.0-rc0"

CONTAINER_NAME="tgrade"
4 changes: 4 additions & 0 deletions scripts/tgrade/init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,7 @@ SCRIPT_DIR="$(realpath "$(dirname "$0")")"
VALIDATOR_VOTING_ADDRESS="$(curl http://localhost:1317/tgrade/poe/v1beta1/contract/VALIDATOR_VOTING | jq -r '.address')"
# Instantiate factory with validator voting contract's address as migrator
VALIDATOR_VOTING_ADDRESS=$VALIDATOR_VOTING_ADDRESS "$SCRIPT_DIR/instantiate_factory.mjs"
# Query and load validator voting contract's address
AP_VOTING_ADDRESS="$(curl http://localhost:1317/tgrade/poe/v1beta1/contract/ARBITER_POOL_VOTING | jq -r '.address')"
# Instantiate factory with validator voting contract's address as migrator
AP_VOTING_ADDRESS=$AP_VOTING_ADDRESS VALIDATOR_VOTING_ADDRESS=$VALIDATOR_VOTING_ADDRESS "$SCRIPT_DIR/migrate_ap_with_multisig.mjs"
116 changes: 116 additions & 0 deletions scripts/tgrade/migrate_ap_with_multisig.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#!/usr/bin/env node
/*jshint esversion: 8 */

import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate";
import { toBase64, toUtf8 } from "@cosmjs/encoding";
import { FaucetClient } from "@cosmjs/faucet-client";
import { DirectSecp256k1HdWallet } from "@cosmjs/proto-signing";
import { calculateFee, GasPrice, makeCosmoshubPath } from "@cosmjs/stargate";

/*
Usage:
1. Configure the network in which to instantiate the factory by filling the networkConfig object accordingly.
2. Run "./instantiate_factory.mjs network" and copy the generated factory address.
3. Hardcode that address in src/config/network.ts.
*/

const networkConfig = {
// Get this information from Miguel
endpoint: "https://rpc.dryrunnet.tgrade.confio.run",
faucet: "https://faucet.dryrunnet.tgrade.confio.run",
bech32prefix: "tgrade",
feeDenom: "utgd",
gasPrice: GasPrice.fromString("0.05utgd"),
gasLimit: 500_000,
multisigCodeId: 17,
apVotingCodeId: 18,
};

const localConfig = {
endpoint: "http://localhost:26657",
faucet: "http://localhost:8000",
bech32prefix: "tgrade",
feeDenom: "utgd",
gasPrice: GasPrice.fromString("0.05utgd"),
gasLimit: 500_000,
multisigCodeId: 14,
apVotingCodeId: 15,
};

const config = process.argv[2] === "network" ? networkConfig : localConfig;

async function main() {
// build signing client
const mnemonic =
"fox orange tiger coach ski arm shrimp scrub quote reason visa better wait drift program burst mind assault develop canvas inspire battle odor visit";
const wallet = await DirectSecp256k1HdWallet.fromMnemonic(mnemonic, {
hdPaths: [makeCosmoshubPath(0)],
prefix: config.bech32prefix,
});
const options = { prefix: config.bech32prefix };
const client = await SigningCosmWasmClient.connectWithSigner(config.endpoint, wallet, options);

// get fee tokens
console.info("Hitting the faucet...");
const { address } = (await wallet.getAccounts())[0];
const faucet = new FaucetClient(config.faucet);
await faucet.credit(address, config.feeDenom);
console.info("...done");

const apVotingAddress = process.env.AP_VOTING_ADDRESS;
const validatorVotingAddress = process.env.VALIDATOR_VOTING_ADDRESS;

console.info(`Arbiter Pool Voting address: ${apVotingAddress}`);
console.info(`Validator Voting address: ${validatorVotingAddress}`);

// Propose a migration
const migrateProposalMsg = {
propose: {
title: "Migrate contract",
description: "Migrate Arbiter Pool Voting to new Code ID to set multisig",
proposal: {
migrate_contract: {
contract: apVotingAddress,
code_id: config.apVotingCodeId,
migrate_msg: toBase64(
toUtf8(`{ "multisig_code": ${config.multisigCodeId}, "waiting_period": 60 }`),
),
},
},
},
};

const { logs } = await client.execute(
address,
validatorVotingAddress,
migrateProposalMsg,
calculateFee(config.gasLimit, config.gasPrice),
);

// Execute the proposal
const proposalIdAttr = logs
.flatMap((log) => log.events)
.flatMap((event) => event.attributes)
.find((attr) => attr.key === "proposal_id");

const proposalId = proposalIdAttr ? Number(proposalIdAttr.value) : 0;

const executeProposalMsg = { execute: { proposal_id: proposalId } };
await client.execute(
address,
validatorVotingAddress,
executeProposalMsg,
calculateFee(config.gasLimit, config.gasPrice),
);
}

main().then(
() => {
console.info("Arbiter Pool migrated!");
process.exit(0);
},
(error) => {
console.error(error);
process.exit(1);
},
);
19 changes: 5 additions & 14 deletions scripts/tgrade/template/node0/tgrade/config/genesis.json
Original file line number Diff line number Diff line change
Expand Up @@ -275,10 +275,7 @@
"create_localhost": false,
"next_client_sequence": "0",
"params": {
"allowed_clients": [
"06-solomachine",
"07-tendermint"
]
"allowed_clients": ["06-solomachine", "07-tendermint"]
}
},
"connection_genesis": {
Expand Down Expand Up @@ -334,11 +331,9 @@
"threshold": "55.000000000000000000",
"voting_period": 30
},
"waiting_period": "0s"
"waiting_period": "60s"
},
"arbiter_pool_members": [
"tgrade1kalzk5cvq5yu6f5u73k7r905yw52sawckddsc3"
],
"arbiter_pool_members": ["tgrade1kalzk5cvq5yu6f5u73k7r905yw52sawckddsc3"],
"bond_denom": "utgd",
"bootstrap_account_address": "tgrade1vl76n4q0pfk2ek07tz2cd5vnlvkuf5tnznqed5",
"community_pool_contract_config": {
Expand Down Expand Up @@ -471,9 +466,7 @@
"voting_period": 30
}
},
"oversight_community_members": [
"tgrade1kalzk5cvq5yu6f5u73k7r905yw52sawckddsc3"
],
"oversight_community_members": ["tgrade1kalzk5cvq5yu6f5u73k7r905yw52sawckddsc3"],
"stake_contract_config": {
"claim_autoreturn_limit": 20,
"min_bond": "1",
Expand Down Expand Up @@ -547,9 +540,7 @@
"max_bytes": "1048576"
},
"validator": {
"pub_key_types": [
"ed25519"
]
"pub_key_types": ["ed25519"]
},
"version": {}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export default function ComplaintData({ complaintId }: ComplaintDataProps): JSX.
{complaint?.plaintiff ? <AddressTag address={complaint.plaintiff} /> : null}
</ComplaintField>
<ComplaintField>
<Text>Plaintiff: </Text>
<Text>State: </Text>
<Text>{capitalizedState}</Text>
</ComplaintField>
</Stack>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ function getGasFromStep(complaintActionStep: ComplaintActionStep): number {
return ApContract.GAS_ACCEPT_COMPLAINT;
case ComplaintAction.WithdrawComplaint:
return ApContract.GAS_WITHDRAW_COMPLAINT;
case ComplaintAction.RenderDecision:
return ApContract.GAS_RENDER_DECISION;
default:
return ApContract.GAS_EXECUTE;
}
Expand All @@ -29,8 +27,6 @@ function getGasFromStep(complaintActionStep: ComplaintActionStep): number {
interface ConfirmComplaintActionProps {
readonly complaintActionStep: ComplaintActionStep;
readonly reason: string;
readonly summary: string;
readonly ipfsLink: string;
readonly isSubmitting: boolean;
readonly goBack: () => void;
readonly submitForm: () => void;
Expand All @@ -39,8 +35,6 @@ interface ConfirmComplaintActionProps {
export default function ConfirmComplaintAction({
complaintActionStep,
reason,
summary,
ipfsLink,
isSubmitting,
goBack,
submitForm,
Expand Down Expand Up @@ -77,18 +71,6 @@ export default function ConfirmComplaintAction({
<Text>{reason}</Text>
</ConfirmField>
) : null}
{complaintActionStep.type === ComplaintAction.RenderDecision ? (
<>
<ConfirmField>
<Text>Summary: </Text>
<Text>{summary}</Text>
</ConfirmField>
<ConfirmField>
<Text>IPFS link: </Text>
<Text>{ipfsLink}</Text>
</ConfirmField>
</>
) : null}
{complaintActionStep.type !== ComplaintAction.AcceptComplaint ? <Separator /> : null}
<ButtonGroup>
<BackButtonOrLink disabled={isSubmitting} onClick={() => goBack()} text="Back" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,41 @@
import { Typography } from "antd";
import Button from "App/components/Button";
import { useSdk } from "service";
import { Complaint } from "utils/arbiterPool";

const { Text } = Typography;

interface FormAcceptComplaintProps {
readonly complaint: Complaint | undefined;
readonly handleSubmit: () => void;
}

export default function FormAcceptComplaint({ handleSubmit }: FormAcceptComplaintProps): JSX.Element {
export default function FormAcceptComplaint({
handleSubmit,
complaint,
}: FormAcceptComplaintProps): JSX.Element {
const {
sdkState: { address },
} = useSdk();

const complaintIsNotInitiated = !complaint?.state.initiated;
const userIsNotDefendant = !address || complaint?.defendant !== address;

return (
<Button onClick={() => handleSubmit()}>
<div>Accept Complaint</div>
</Button>
<>
{complaintIsNotInitiated ? (
<Text style={{ color: "var(--color-error-form)" }}>
The complaint must be on state "initiated" to be accepted
</Text>
) : null}
{userIsNotDefendant ? (
<Text style={{ color: "var(--color-error-form)" }}>
The complaint can only be accepted by its defendant
</Text>
) : null}
<Button disabled={complaintIsNotInitiated || userIsNotDefendant} onClick={() => handleSubmit()}>
<div>Accept Complaint</div>
</Button>
</>
);
}