diff --git a/.circleci/config.yml b/.circleci/config.yml index 95c9978..e5e9a2f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -125,7 +125,7 @@ jobs: root: ./target/wasm32-unknown-unknown/release paths: - mesh_consumer.wasm - - mesh_lockup.wasm + - mesh_vault.wasm - mesh_provider.wasm - mesh_slasher.wasm - meta_staking.wasm diff --git a/Cargo.lock b/Cargo.lock index d578495..542e845 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -563,76 +563,76 @@ dependencies = [ ] [[package]] -name = "mesh-lockup" +name = "mesh-provider" version = "0.1.0" dependencies = [ "anyhow", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", + "cw-controllers", "cw-multi-test", "cw-storage-plus 1.0.1", "cw-utils 1.0.1", "cw2 1.0.1", - "derivative", "mesh-apis", + "mesh-ibc", + "mesh-testing", "schemars", "serde", - "test-case", "thiserror", ] [[package]] -name = "mesh-provider" +name = "mesh-slasher" version = "0.1.0" dependencies = [ - "anyhow", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", - "cw-controllers", "cw-multi-test", "cw-storage-plus 1.0.1", - "cw-utils 1.0.1", "cw2 1.0.1", - "mesh-apis", - "mesh-ibc", - "mesh-testing", "schemars", "serde", "thiserror", ] [[package]] -name = "mesh-slasher" +name = "mesh-testing" version = "0.1.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", "cw-multi-test", - "cw-storage-plus 1.0.1", - "cw2 1.0.1", + "mesh-consumer", + "mesh-ibc", + "mesh-provider", + "mesh-slasher", + "meta-staking", "schemars", "serde", "thiserror", ] [[package]] -name = "mesh-testing" +name = "mesh-vault" version = "0.1.0" dependencies = [ + "anyhow", "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", "cw-multi-test", - "mesh-consumer", - "mesh-ibc", - "mesh-provider", - "mesh-slasher", - "meta-staking", + "cw-storage-plus 1.0.1", + "cw-utils 1.0.1", + "cw2 1.0.1", + "derivative", + "mesh-apis", "schemars", "serde", + "test-case", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 05184cc..ee030d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,7 +43,7 @@ test-case = "2.2.0" codegen-units = 1 incremental = false -[profile.release.package.mesh-lockup] +[profile.release.package.mesh-vault] codegen-units = 1 incremental = false diff --git a/README.md b/README.md index 8e4ff24..e81a533 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ to get view of the various flows involved. * `meta-staking` - a bridge between the rest of the contracts and the x/staking module to provide a consistent, friendly interface for our use case -* `mesh-lockup` - a contract that locks tokens and allows lockers to issue multiple claims +* `mesh-vault` - a contract that locks tokens and allows lockers to issue multiple claims to other consumers, who can all slash that stake and eventually release their claim * `mesh-provider` - an IBC-enabled contract that issues claims on an ILP and speaks IBC to a consumer. It is responsible for submitting slashes it receives from the `slasher` to the `ilp` contract. @@ -36,10 +36,10 @@ You can also connect each chain as a provider to N chains and a consumer from N Let's analyze the Osmosis side of this. Osmosis is the provider of security to Juno. Once the contracts have been deployed, a user can interact with this as follows. -#### Cross-staking: +#### Cross-staking -1. User stakes their tokens in the `mesh-lockup` contract on Osmosis -2. User can cross-stake those tokens to a Juno `mesh-provider` contract (on Osmosis), specifying how many of their +1. User stakes their tokens in the `mesh-vault` contract on Osmosis +2. User can cross-stake those tokens to a Juno `mesh-provider` contract (on Osmosis), specifying how many of their tokens to cross-stake and to which validator 3. The Osmosis `mesh-consumer` contract (on Juno) receives a message from the counterparty `mesh-provider` contract and updates the stake in the `meta-staking` contract (on Juno). @@ -47,7 +47,7 @@ Once the contracts have been deployed, a user can interact with this as follows. meta-staking contract is assumed to have enough JUNO tokens to do the delegations. How it gets that JUNO is out of scope.) -#### Claiming Rewards: +#### Claiming Rewards 1. Anyone can trigger the Osmosis consumer contract to claim rewards from the `meta-staking` contract 2. The `mesh-consumer` contract (on JUNO) sends tokens to the `mesh-provider` contract (on Osmosis) via ics20 @@ -56,7 +56,7 @@ Once the contracts have been deployed, a user can interact with this as follows. 4. The `mesh-provider` (on Osmosis) contract updates distribution info to all stakers, allowing them to claim their share of the $JUNO rewards on Osmosis. -#### Unstaking: +#### Unstaking 1. A user submits a request to unstake their tokens from the `mesh-provider` contract (on Osmosis) 2. We update the local distribution info to reflect the new amount of tokens staked @@ -65,24 +65,24 @@ Once the contracts have been deployed, a user can interact with this as follows. 4. The `mesh-provider` contract (on Osmosis) gets the unbonding period for this cross stake by querying the `slasher` contract 5. After the unbonding period has passed (eg. 2 weeks, 4 weeks) the `mesh-provider` contract - informs the `mesh-lockup` contract that it removes its claim. -6. If the user's stake in the `mesh-lockup` contract has not more claims on it, they can withdraw their stake. + informs the `mesh-vault` contract that it removes its claim. +6. If the user's stake in the `mesh-vault` contract has not more claims on it, they can withdraw their stake. -#### Slashing: +#### Slashing 1. Someone calls a method to submit evidence of Juno misbehavior on the `meta-slasher` contract (on Osmosis). 2. The `meta-slasher` contract verifies that a slashing event has indeed occurred and makes a contract call to the `mesh-provider` contract with the amount to slash. -3. The `mesh-provider` updates the `mesh-lockup` stakes of everyone delegating to the offending validator. Tokens are unbonded +3. The `mesh-provider` updates the `mesh-vault` stakes of everyone delegating to the offending validator. Tokens are unbonded and scheduled to be burned. 4. `mesh-provider` sends IBC packet updates to the `mesh-consumer`s on all other chains about the new voting power. -#### Claiming tokens: +#### Claiming tokens -A user can stake any number of tokens to the `mesh-lockup` contract, and use them in multiple provider contracts. -The `mesh-lockup` contract ensures that the user has balance >= the max claim at all times. +A user can stake any number of tokens to the `mesh-vault` contract, and use them in multiple provider contracts. +The `mesh-vault` contract ensures that the user has balance >= the max claim at all times. If you put in eg 1000 OSMO, but then provide 700, 500, and 300 to various providers, -you can pull out 300 OSMO from the `mesh-lockup` contract. Once you successfully release the claim on the +you can pull out 300 OSMO from the `mesh-vault` contract. Once you successfully release the claim on the provider with 700, then you can pull out another 200 OSMO. ## Overview for Installing @@ -101,7 +101,7 @@ provider with 700, then you can pull out another 200 OSMO. These are well-defined but removed from the MVP for simplicity. We can add them later. -* `mesh-lockup` must also allow local staking, and tie into the meta-staking contract to use that +* `mesh-vault` must also allow local staking, and tie into the meta-staking contract to use that same stake to provide security on the home chain. ## Open Questions diff --git a/contracts/mesh-lockup/.cargo/config b/contracts/mesh-vault/.cargo/config similarity index 100% rename from contracts/mesh-lockup/.cargo/config rename to contracts/mesh-vault/.cargo/config diff --git a/contracts/mesh-lockup/Cargo.toml b/contracts/mesh-vault/Cargo.toml similarity index 98% rename from contracts/mesh-lockup/Cargo.toml rename to contracts/mesh-vault/Cargo.toml index 3516123..cf19667 100644 --- a/contracts/mesh-lockup/Cargo.toml +++ b/contracts/mesh-vault/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "mesh-lockup" +name = "mesh-vault" authors = ["Ethan Frey "] edition = { workspace = true } diff --git a/contracts/mesh-lockup/src/bin/schema.rs b/contracts/mesh-vault/src/bin/schema.rs similarity index 72% rename from contracts/mesh-lockup/src/bin/schema.rs rename to contracts/mesh-vault/src/bin/schema.rs index 9e24098..91528b0 100644 --- a/contracts/mesh-lockup/src/bin/schema.rs +++ b/contracts/mesh-vault/src/bin/schema.rs @@ -1,6 +1,6 @@ use cosmwasm_schema::write_api; -use mesh_lockup::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use mesh_vault::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; fn main() { write_api! { diff --git a/contracts/mesh-lockup/src/contract.rs b/contracts/mesh-vault/src/contract.rs similarity index 99% rename from contracts/mesh-lockup/src/contract.rs rename to contracts/mesh-vault/src/contract.rs index 8f2d057..fd04efe 100644 --- a/contracts/mesh-lockup/src/contract.rs +++ b/contracts/mesh-vault/src/contract.rs @@ -13,7 +13,7 @@ use crate::state::{Config, BALANCES, CONFIG}; use mesh_apis::ClaimReceiverMsg; // version info for migration info -const CONTRACT_NAME: &str = "crates.io:mesh-lockup"; +const CONTRACT_NAME: &str = "crates.io:mesh-vault"; const CONTRACT_VERSION: &str = env!("CARGO_PKG_VERSION"); #[cfg_attr(not(feature = "library"), entry_point)] diff --git a/contracts/mesh-lockup/src/error.rs b/contracts/mesh-vault/src/error.rs similarity index 100% rename from contracts/mesh-lockup/src/error.rs rename to contracts/mesh-vault/src/error.rs diff --git a/contracts/mesh-lockup/src/helpers.rs b/contracts/mesh-vault/src/helpers.rs similarity index 100% rename from contracts/mesh-lockup/src/helpers.rs rename to contracts/mesh-vault/src/helpers.rs diff --git a/contracts/mesh-lockup/src/lib.rs b/contracts/mesh-vault/src/lib.rs similarity index 100% rename from contracts/mesh-lockup/src/lib.rs rename to contracts/mesh-vault/src/lib.rs diff --git a/contracts/mesh-lockup/src/msg.rs b/contracts/mesh-vault/src/msg.rs similarity index 100% rename from contracts/mesh-lockup/src/msg.rs rename to contracts/mesh-vault/src/msg.rs diff --git a/contracts/mesh-lockup/src/multitest.rs b/contracts/mesh-vault/src/multitest.rs similarity index 100% rename from contracts/mesh-lockup/src/multitest.rs rename to contracts/mesh-vault/src/multitest.rs diff --git a/contracts/mesh-lockup/src/multitest/bonding.rs b/contracts/mesh-vault/src/multitest/bonding.rs similarity index 100% rename from contracts/mesh-lockup/src/multitest/bonding.rs rename to contracts/mesh-vault/src/multitest/bonding.rs diff --git a/contracts/mesh-lockup/src/multitest/mock_grantee.rs b/contracts/mesh-vault/src/multitest/mock_grantee.rs similarity index 100% rename from contracts/mesh-lockup/src/multitest/mock_grantee.rs rename to contracts/mesh-vault/src/multitest/mock_grantee.rs diff --git a/contracts/mesh-lockup/src/multitest/suite.rs b/contracts/mesh-vault/src/multitest/suite.rs similarity index 100% rename from contracts/mesh-lockup/src/multitest/suite.rs rename to contracts/mesh-vault/src/multitest/suite.rs diff --git a/contracts/mesh-lockup/src/state.rs b/contracts/mesh-vault/src/state.rs similarity index 100% rename from contracts/mesh-lockup/src/state.rs rename to contracts/mesh-vault/src/state.rs diff --git a/scripts/create_clients.sh b/scripts/create_clients.sh index 230b73f..84c06ef 100755 --- a/scripts/create_clients.sh +++ b/scripts/create_clients.sh @@ -13,12 +13,12 @@ cosmwasm-ts-codegen generate \ --name MeshConsumer \ --no-bundle - #Create client for mesh-lockup + #Create client for mesh-vault cosmwasm-ts-codegen generate \ --plugin client \ - --schema ls ../contracts/mesh-lockup/schema \ + --schema ls ../contracts/mesh-vault/schema \ --out ./src/bindings \ - --name MeshLockup \ + --name MeshVault \ --no-bundle #Create client for mesh-provider diff --git a/tests/src/cosmwasm.spec.ts b/tests/src/cosmwasm.spec.ts index 6f7630b..88871a0 100644 --- a/tests/src/cosmwasm.spec.ts +++ b/tests/src/cosmwasm.spec.ts @@ -40,7 +40,7 @@ test.before(async (t) => { console.debug("Upload contracts to osmosis..."); const osmosisContracts = { - mesh_lockup: "./internal/mesh_lockup.wasm", + mesh_vault: "./internal/mesh_vault.wasm", mesh_provider: "./internal/mesh_provider.wasm", mesh_slasher: "./internal/mesh_slasher.wasm", }; @@ -59,7 +59,7 @@ interface SetupInfo { wasmMetaStaking: string; osmoMeshProvider: string; osmoMeshSlasher: string; - osmoMeshLockup: string; + osmoMeshVault: string; meshConsumerPort: string; meshProviderPort: string; link: Link; @@ -81,13 +81,13 @@ async function demoSetup(): Promise { const osmoStargateClient = await setupOsmoStargateClient(); const wasmStargateClient = await setupWasmStargateClient(); - // instantiate mesh_lockup on osmosis - const initMeshLockup = { denom: osmosis.denomStaking }; - const { contractAddress: osmoMeshLockup } = await osmoClient.sign.instantiate( + // instantiate mesh_vault on osmosis + const initMeshVault = { denom: osmosis.denomStaking }; + const { contractAddress: osmoMeshVault } = await osmoClient.sign.instantiate( osmoClient.senderAddress, - osmosisIds.mesh_lockup, - initMeshLockup, - "mesh_lockup contract", + osmosisIds.mesh_vault, + initMeshVault, + "mesh_vault contract", "auto" ); @@ -114,7 +114,7 @@ async function demoSetup(): Promise { owner: osmoClient.senderAddress, }), }, - lockup: osmoMeshLockup, + lockup: osmoMeshVault, // 0 second unbonding here so we can test it unbonding_period: 0, rewards_ibc_denom: ibcDenom, @@ -172,7 +172,7 @@ async function demoSetup(): Promise { wasmStargateClient, wasmMeshConsumer, osmoMeshProvider, - osmoMeshLockup, + osmoMeshVault, osmoMeshSlasher, wasmMetaStaking, meshConsumerPort, @@ -273,7 +273,7 @@ test.serial("Happy Path (cross-stake / cross-unstake)", async (t) => { osmoStargateClient, wasmMeshConsumer, osmoMeshProvider, - osmoMeshLockup, + osmoMeshVault, wasmMetaStaking, link, ics20, @@ -313,7 +313,7 @@ test.serial("Happy Path (cross-stake / cross-unstake)", async (t) => { const lockedTokens = { amount: "500000", denom: "uosmo" }; const lockupRes = await osmoClient.sign.execute( osmoClient.senderAddress, - osmoMeshLockup, + osmoMeshVault, { bond: {} }, "auto", "memo", @@ -333,7 +333,7 @@ test.serial("Happy Path (cross-stake / cross-unstake)", async (t) => { // Grant claim, cross stake 100 tokens to validator on wasmd const grantClaimRes = await osmoClient.sign.execute( osmoClient.senderAddress, - osmoMeshLockup, + osmoMeshVault, { grant_claim: { leinholder: osmoMeshProvider, amount: "500000", validator: validatorAddr }, }, @@ -446,12 +446,12 @@ test.serial("Happy Path (cross-stake / cross-unstake)", async (t) => { t.is(senderBalance.amount, rewardsTosend.amount); // Make another tx to advanace the block - await osmoClient.sign.execute(osmoClient.senderAddress, osmoMeshLockup, { bond: {} }, "auto", "memo", [lockedTokens]); + await osmoClient.sign.execute(osmoClient.senderAddress, osmoMeshVault, { bond: {} }, "auto", "memo", [lockedTokens]); // Unbond 100 tokens from wasmd now that a block has passed const unbondRes = await osmoClient.sign.execute( osmoClient.senderAddress, - osmoMeshLockup, + osmoMeshVault, { unbond: { amount: "100" } }, "auto" ); diff --git a/tests/src/scripts/config.ts b/tests/src/scripts/config.ts index 7004d26..131fc69 100644 --- a/tests/src/scripts/config.ts +++ b/tests/src/scripts/config.ts @@ -1,5 +1,5 @@ export const osmoConfig = { - meshLockupAddr: "osmo1kf88a6ftgt57t2hg48jfc9679l50tq6jqwsdheuld6467jls2hxstnvnal", + meshVaultAddr: "osmo1kf88a6ftgt57t2hg48jfc9679l50tq6jqwsdheuld6467jls2hxstnvnal", meshProviderAddr: "osmo19kx57u0nrhqas34qvyhu2ydt4a9rlj6n37l88jqwfc2eesuk9tuq6c6ywj", meshProviderPort: "wasm.osmo19kx57u0nrhqas34qvyhu2ydt4a9rlj6n37l88jqwfc2eesuk9tuq6c6ywj", meshSlasherAddr: "osmo1fewayl23e89rkejx932ljxf0ylsmtqc49r4myzzsvxcpweptmu0szshpkv", diff --git a/tests/src/scripts/deploy-contracts.ts b/tests/src/scripts/deploy-contracts.ts index b333272..5664314 100644 --- a/tests/src/scripts/deploy-contracts.ts +++ b/tests/src/scripts/deploy-contracts.ts @@ -1,7 +1,7 @@ import { SigningCosmWasmClient, toBinary } from "@cosmjs/cosmwasm-stargate"; import { assert } from "@cosmjs/utils"; import { InstantiateMsg as ConsumerInitMsg } from "mesh-security/contracts/mesh-consumer/MeshConsumer.types"; -import { InstantiateMsg as LockupInitMsg } from "mesh-security/contracts/mesh-lockup/MeshLockup.types"; +import { InstantiateMsg as LockupInitMsg } from "mesh-security/contracts/mesh-vault/MeshVault.types"; import { MeshProviderClient } from "mesh-security/contracts/mesh-provider/MeshProvider.client"; import { InstantiateMsg as ProviderInitMsg } from "mesh-security/contracts/mesh-provider/MeshProvider.types"; import { Coin, InstantiateMsg as StakingInitMsg } from "mesh-security/contracts/meta-staking/MetaStaking.types"; @@ -10,7 +10,7 @@ import { connect, getMnemonic, pprint, setupContracts } from "./helpers"; import { connections, junoTestConfig, osmoTestConfig } from "./networks"; interface ProviderInfo { - meshLockupAddr: string; + meshVaultAddr: string; meshProviderAddr: string; meshProviderPort: string; meshSlasherAddr: string; @@ -34,19 +34,19 @@ async function installProvider( ): Promise { console.debug("Upload contracts to provider..."); const providerContracts = { - mesh_lockup: "./internal/mesh_lockup.wasm", + mesh_vault: "./internal/mesh_vault.wasm", mesh_provider: "./internal/mesh_provider.wasm", mesh_slasher: "./internal/mesh_slasher.wasm", }; const wasmIds = await setupContracts(client, signer, providerContracts); - console.log("Instantiate mesh_lockup on provider"); - const initMeshLockup: LockupInitMsg = { denom }; - const { contractAddress: meshLockupAddr } = await client.instantiate( + console.log("Instantiate mesh_vault on provider"); + const initMeshVault: LockupInitMsg = { denom }; + const { contractAddress: meshVaultAddr } = await client.instantiate( signer, - wasmIds.mesh_lockup, - initMeshLockup as any, - "mesh_lockup contract", + wasmIds.mesh_vault, + initMeshVault as any, + "mesh_vault contract", "auto" ); @@ -59,7 +59,7 @@ async function installProvider( code_id: wasmIds.mesh_slasher, msg: toBinary({ owner: signer }), }, - lockup: meshLockupAddr, + lockup: meshVaultAddr, // TODO: get real number somehow... look at tendermint client queries or staking? unbonding_period: 86400 * 14, rewards_ibc_denom: "d", @@ -81,7 +81,7 @@ async function installProvider( throw new Error("Can't find slasher"); } - return { meshLockupAddr, meshProviderAddr, meshProviderPort, meshSlasherAddr }; + return { meshVaultAddr, meshProviderAddr, meshProviderPort, meshSlasherAddr }; } async function installConsumer( diff --git a/typescript/contracts/mesh-lockup/MeshLockup.client.ts b/typescript/contracts/mesh-lockup/MeshLockup.client.ts index 4cc9d8b..34119b0 100644 --- a/typescript/contracts/mesh-lockup/MeshLockup.client.ts +++ b/typescript/contracts/mesh-lockup/MeshLockup.client.ts @@ -6,8 +6,8 @@ import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from "@cosmjs/cosmwasm-stargate"; import { Coin, StdFee } from "@cosmjs/amino"; -import { InstantiateMsg, ExecuteMsg, Uint128, QueryMsg, BalanceResponse, Lein } from "./MeshLockup.types"; -export interface MeshLockupReadOnlyInterface { +import { InstantiateMsg, ExecuteMsg, Uint128, QueryMsg, BalanceResponse, Lein } from "./MeshVault.types"; +export interface MeshVaultReadOnlyInterface { contractAddress: string; balance: ({ account @@ -15,7 +15,7 @@ export interface MeshLockupReadOnlyInterface { account: string; }) => Promise; } -export class MeshLockupQueryClient implements MeshLockupReadOnlyInterface { +export class MeshVaultQueryClient implements MeshVaultReadOnlyInterface { client: CosmWasmClient; contractAddress: string; @@ -37,7 +37,7 @@ export class MeshLockupQueryClient implements MeshLockupReadOnlyInterface { }); }; } -export interface MeshLockupInterface extends MeshLockupReadOnlyInterface { +export interface MeshVaultInterface extends MeshVaultReadOnlyInterface { contractAddress: string; sender: string; bond: (fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; @@ -70,7 +70,7 @@ export interface MeshLockupInterface extends MeshLockupReadOnlyInterface { owner: string; }, fee?: number | StdFee | "auto", memo?: string, funds?: Coin[]) => Promise; } -export class MeshLockupClient extends MeshLockupQueryClient implements MeshLockupInterface { +export class MeshVaultClient extends MeshVaultQueryClient implements MeshVaultInterface { client: SigningCosmWasmClient; sender: string; contractAddress: string; diff --git a/typescript/contracts/mesh-lockup/bundle.ts b/typescript/contracts/mesh-lockup/bundle.ts index 7221c03..cf6bf00 100644 --- a/typescript/contracts/mesh-lockup/bundle.ts +++ b/typescript/contracts/mesh-lockup/bundle.ts @@ -4,10 +4,10 @@ * and run the @cosmwasm/ts-codegen generate command to regenerate this file. */ -import * as _2 from "./MeshLockup.types"; -import * as _3 from "./MeshLockup.client"; +import * as _2 from "./MeshVault.types"; +import * as _3 from "./MeshVault.client"; export namespace contracts { - export const MeshLockup = { ..._2, + export const MeshVault = { ..._2, ..._3 }; } \ No newline at end of file