Skip to content

Commit

Permalink
feature: upload and instantiation of multisig contracts (#83)
Browse files Browse the repository at this point in the history
* feature: upload & deploy cw4_group and cw3_flex_multisig (#83)

Instructions for uploading & deploying these 2 contracts have been added
to gauntlet-terra-contracts README.md, along with functionality.

This does not include ability to make multisig proposals and vote on
them--that will be in a separate PR.

This also includes support for downloading wasm artifacts from cwplus repo

* refactor command vs contract inputs (#83)

* wallet input refactor (#83)

* bugfix: Fix base64 encoding in downloader, remove unused params (#83)

It looks like downloading remote wasm files and uploading them was
never actually working (even on main).  The terra network was rejecting
the contract uploads due to them not being base64 encoded.  I think
the toString('base64') operation on a string must have been a no-op.
Seems to work after this change.

Other changes:
- Separate default versions for cwplus contracts and chainlink-terra contracts
- Remove unused params
- Workaround for exceptional naming of the execute shcema for cw20_base
  (cw20_execute.json instead of execute.json)

* chore: rebase to latest main, and update gauntlet README.md (#83)

* chore: validate that owners.length != 0, and improve error reporting (#83)

* chore: Merge changes from (#98) with changes from (#86)

An automatic merge of PR "implement additional gauntlet command (#98)"
with PR "multisig instantiation (#86)" resulted in lots of stuff
either not compiling or not working.

This fixes the bugs introduced by the automatic merge, by manually merging
the two branches.  Mostly, needed to add categories for all of the new commands.

Co-authored-by: RodrigoAD <[email protected]>
  • Loading branch information
reductionista and RodrigoAD authored Feb 14, 2022
1 parent bf293c9 commit f5b5504
Show file tree
Hide file tree
Showing 54 changed files with 2,820 additions and 48 deletions.
7 changes: 3 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
.direnv
.vscode
target/
artifacts/bin/
tarpaulin-report.html
artifacts

# TS
node_modules
Expand All @@ -12,9 +13,7 @@ flow-report.json
.envrc
bin

packages-ts/gauntlet-terra-contracts/artifacts/bin

# test
packages-ts/gauntlet-terra-contracts/codeIds/test*
tests/e2e/logs
packages-ts/gauntlet-terra-contracts/networks/.env.test*
networks/.env.test*
25 changes: 23 additions & 2 deletions packages-ts/gauntlet-terra-contracts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ The command follows the same style:

For our Access Controller contract, we could perform:

- Deploy
- Deploy chainlink contract
```
./bin/gauntlet-terra-macos access_controller:deploy --network=bombay-testnet
```
Expand All @@ -62,4 +62,25 @@ The following contracts have the previous actions available:
- `access_controller`
- `flags`
- `ocr2`
- `deviation_flagging_validator`
- `deviation_flagging_validator`

## Multisig Commands

- Create a cw4 group

This instantiates a group with 3 members, each having equal voting power, for a total of 1+1+1=3 votes: (passing admin address is optional)

```
yarn gauntlet cw4_group:deploy --members='[terra1pl4k5rj2jv6phm2vvhkttju7px6va2ja2v3haw,terra1tsxn3zzp09kvwpx03gzwquhc6nn794vvznuhzr,terra1s66cck3sxacdc2jfpdd4t4pk4yzc60pa72ssdr]' --admin=terra1pl4k5rj2jv6phm2vvhkttju7px6va2ja2v3haw --network=bombay-testnet
```
- Create a cw3 flex multisig wallet

This instantiates a multisig wallet, for the group above... with a max voting period of 28800s (8 hours) and an threshold of 100 percent of the vote:

```
yarn gauntlet cw3_flex_multisig:deploy --network=bombay-testnet --group=terra1wx0ahe6gpeyyh0wtq3cyc26f2wyk08kjtndxhf --time=28800 --threshold=3
```

You may also specify the threshold as an absolute number of votes, or even a quorum combined with a threshold percentage.
( See https://docs.cosmwasm.com/cw-plus/0.9.0/cw3/cw3-flex-spec for details )

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "AllAccountsResponse",
"type": "object",
"required": [
"accounts"
],
"properties": {
"accounts": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "AllAllowancesResponse",
"type": "object",
"required": [
"allowances"
],
"properties": {
"allowances": {
"type": "array",
"items": {
"$ref": "#/definitions/AllowanceInfo"
}
}
},
"definitions": {
"AllowanceInfo": {
"type": "object",
"required": [
"allowance",
"expires",
"spender"
],
"properties": {
"allowance": {
"$ref": "#/definitions/Uint128"
},
"expires": {
"$ref": "#/definitions/Expiration"
},
"spender": {
"type": "string"
}
}
},
"Expiration": {
"description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)",
"anyOf": [
{
"description": "AtHeight will expire when `env.block.height` >= height",
"type": "object",
"required": [
"at_height"
],
"properties": {
"at_height": {
"type": "integer",
"format": "uint64",
"minimum": 0.0
}
},
"additionalProperties": false
},
{
"description": "AtTime will expire when `env.block.time` >= time",
"type": "object",
"required": [
"at_time"
],
"properties": {
"at_time": {
"$ref": "#/definitions/Timestamp"
}
},
"additionalProperties": false
},
{
"description": "Never will never expire. Used to express the empty variant",
"type": "object",
"required": [
"never"
],
"properties": {
"never": {
"type": "object"
}
},
"additionalProperties": false
}
]
},
"Timestamp": {
"description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```",
"allOf": [
{
"$ref": "#/definitions/Uint64"
}
]
},
"Uint128": {
"description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```",
"type": "string"
},
"Uint64": {
"description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```",
"type": "string"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "AllowanceResponse",
"type": "object",
"required": [
"allowance",
"expires"
],
"properties": {
"allowance": {
"$ref": "#/definitions/Uint128"
},
"expires": {
"$ref": "#/definitions/Expiration"
}
},
"definitions": {
"Expiration": {
"description": "Expiration represents a point in time when some event happens. It can compare with a BlockInfo and will return is_expired() == true once the condition is hit (and for every block in the future)",
"anyOf": [
{
"description": "AtHeight will expire when `env.block.height` >= height",
"type": "object",
"required": [
"at_height"
],
"properties": {
"at_height": {
"type": "integer",
"format": "uint64",
"minimum": 0.0
}
},
"additionalProperties": false
},
{
"description": "AtTime will expire when `env.block.time` >= time",
"type": "object",
"required": [
"at_time"
],
"properties": {
"at_time": {
"$ref": "#/definitions/Timestamp"
}
},
"additionalProperties": false
},
{
"description": "Never will never expire. Used to express the empty variant",
"type": "object",
"required": [
"never"
],
"properties": {
"never": {
"type": "object"
}
},
"additionalProperties": false
}
]
},
"Timestamp": {
"description": "A point in time in nanosecond precision.\n\nThis type can represent times from 1970-01-01T00:00:00Z to 2554-07-21T23:34:33Z.\n\n## Examples\n\n``` # use cosmwasm_std::Timestamp; let ts = Timestamp::from_nanos(1_000_000_202); assert_eq!(ts.nanos(), 1_000_000_202); assert_eq!(ts.seconds(), 1); assert_eq!(ts.subsec_nanos(), 202);\n\nlet ts = ts.plus_seconds(2); assert_eq!(ts.nanos(), 3_000_000_202); assert_eq!(ts.seconds(), 3); assert_eq!(ts.subsec_nanos(), 202); ```",
"allOf": [
{
"$ref": "#/definitions/Uint64"
}
]
},
"Uint128": {
"description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```",
"type": "string"
},
"Uint64": {
"description": "A thin wrapper around u64 that is using strings for JSON encoding/decoding, such that the full u64 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u64` to get the value out:\n\n``` # use cosmwasm_std::Uint64; let a = Uint64::from(42u64); assert_eq!(a.u64(), 42);\n\nlet b = Uint64::from(70u32); assert_eq!(b.u64(), 70); ```",
"type": "string"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "BalanceResponse",
"type": "object",
"required": [
"balance"
],
"properties": {
"balance": {
"$ref": "#/definitions/Uint128"
}
},
"definitions": {
"Uint128": {
"description": "A thin wrapper around u128 that is using strings for JSON encoding/decoding, such that the full u128 range can be used for clients that convert JSON numbers to floats, like JavaScript and jq.\n\n# Examples\n\nUse `from` to create instances of this and `u128` to get the value out:\n\n``` # use cosmwasm_std::Uint128; let a = Uint128::from(123u128); assert_eq!(a.u128(), 123);\n\nlet b = Uint128::from(42u64); assert_eq!(b.u128(), 42);\n\nlet c = Uint128::from(70u32); assert_eq!(c.u128(), 70); ```",
"type": "string"
}
}
}
Loading

0 comments on commit f5b5504

Please sign in to comment.