From be3787e9f008a2c7dc953111d309d408f2f7f12b Mon Sep 17 00:00:00 2001 From: wc117 Date: Wed, 27 Dec 2023 23:43:58 +0800 Subject: [PATCH] add twap create bot --- Cargo.lock | 115 ++++++++++++----------- Cargo.toml | 8 +- src/contract.rs | 241 +++++++++++++++++++++++++++++++++++++++++------- src/error.rs | 3 + src/msg.rs | 46 +++++++-- src/state.rs | 8 +- 6 files changed, 325 insertions(+), 96 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 73f6aed..9d93d7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -90,9 +90,9 @@ dependencies = [ [[package]] name = "bnum" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128a44527fc0d6abf05f9eda748b9027536e12dff93f5acc8449f51583309350" +checksum = "ab9008b6bb9fc80b5277f2fe481c09e828743d9151203e804583eb4c9e15b31d" [[package]] name = "byte-slice-cast" @@ -210,9 +210,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", "rand_core 0.6.4", @@ -261,16 +261,17 @@ dependencies = [ [[package]] name = "cw-multi-test" -version = "0.17.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d818f5323c80ed4890db7f89d65eda3f0261fe21878e628c27ea2d8de4b7ba4" +checksum = "561604d987be2ef3e34db1f01f0c98544106d84d8be2af92c0737bb199af452c" dependencies = [ "anyhow", + "bech32", "cosmwasm-std", "cw-storage-plus", "cw-utils", "derivative", - "itertools", + "itertools 0.12.0", "prost", "schemars", "serde", @@ -291,9 +292,9 @@ dependencies = [ [[package]] name = "cw-utils" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9f351a4e4d81ef7c890e44d903f8c0bdcdc00f094fd3a181eaf70c0eec7a3a" +checksum = "1c4a657e5caacc3a0d00ee96ca8618745d050b8f757c709babafb81208d4239c" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -306,14 +307,15 @@ dependencies = [ [[package]] name = "cw2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9431d14f64f49e41c6ef5561ed11a5391c417d0cb16455dea8cdcb9037a8d197" +checksum = "c6c120b24fbbf5c3bedebb97f2cc85fbfa1c3287e09223428e7e597b5293c1fa" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus", "schemars", + "semver", "serde", "thiserror", ] @@ -368,9 +370,9 @@ checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" -version = "0.16.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", "digest 0.10.7", @@ -403,9 +405,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.6" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -548,9 +550,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "hex" @@ -612,7 +614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] @@ -624,6 +626,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -632,9 +643,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "k256" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" dependencies = [ "cfg-if", "ecdsa", @@ -667,9 +678,9 @@ checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -679,9 +690,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", "bitvec", @@ -693,9 +704,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -734,28 +745,28 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" dependencies = [ - "once_cell", + "toml_datetime", "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] [[package]] name = "prost" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", "prost-derive", @@ -763,12 +774,12 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.39", @@ -932,9 +943,9 @@ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -950,9 +961,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -1017,9 +1028,9 @@ dependencies = [ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -1027,9 +1038,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -1106,15 +1117,15 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ "indexmap", "toml_datetime", @@ -1159,9 +1170,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" dependencies = [ "memchr", ] @@ -1177,6 +1188,6 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/Cargo.toml b/Cargo.toml index 69b1663..2da4287 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,19 +36,19 @@ library = [] optimize = """docker run --rm -v "$(pwd)":/code \ --mount type=volume,source="$(basename "$(pwd)")_cache",target=/target \ --mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \ - cosmwasm/rust-optimizer:0.14.0 + cosmwasm/rust-optimizer:0.15.0 """ [dependencies] cosmwasm-schema = "1.5.0" cosmwasm-std = { version = "1.5.0"} cw-storage-plus = "1.2.0" -cw2 = "1.1.1" +cw2 = "1.1.2" ethabi = "18.0.0" schemars = "0.8.16" -serde = { version = "1.0.192", default-features = false, features = ["derive"] } +serde = { version = "1.0.193", default-features = false, features = ["derive"] } thiserror = { version = "1.0.50" } getrandom = { version = "0.2.11", features = ["custom"] } [dev-dependencies] -cw-multi-test = "0.17.0" +cw-multi-test = "0.19.0" diff --git a/src/contract.rs b/src/contract.rs index 0c11c27..ea3955d 100644 --- a/src/contract.rs +++ b/src/contract.rs @@ -4,7 +4,7 @@ use cosmwasm_std::{to_json_binary, Binary, Deps, DepsMut, Env, MessageInfo, Resp use cw2::set_contract_version; use crate::error::ContractError; -use crate::msg::{ExecuteMsg, GetJobIdResponse, InstantiateMsg, PalomaMsg, QueryMsg}; +use crate::msg::{ExecuteMsg, GetJobIdResponse, InstantiateMsg, Metadata, PalomaMsg, QueryMsg}; use crate::state::{State, STATE}; use cosmwasm_std::CosmosMsg; use ethabi::{Contract, Function, Param, ParamType, StateMutability, Token, Uint}; @@ -23,8 +23,13 @@ pub fn instantiate( msg: InstantiateMsg, ) -> Result { let state = State { + retry_delay: msg.retry_delay, job_id: msg.job_id.clone(), owner: info.sender.clone(), + metadata: Metadata { + creator: msg.creator, + signers: msg.signers, + }, }; set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?; STATE.save(deps.storage, &state)?; @@ -37,12 +42,26 @@ pub fn instantiate( #[cfg_attr(not(feature = "library"), entry_point)] pub fn execute( deps: DepsMut, - _env: Env, + env: Env, info: MessageInfo, msg: ExecuteMsg, ) -> Result, ContractError> { match msg { - ExecuteMsg::RepayBot { bot_info } => execute::repay_bot(deps, info, bot_info), + ExecuteMsg::RepayBot { bot_info } => execute::repay_bot(deps, env, info, bot_info), + ExecuteMsg::CreateNextBot { + bot_id, + callbacker, + callback_args, + remaining_count, + } => execute::create_next_bot( + deps, + env, + info, + bot_id, + callbacker, + callback_args, + remaining_count, + ), ExecuteMsg::SetPaloma {} => execute::set_paloma(deps, info), ExecuteMsg::UpdateCompass { new_compass } => { execute::update_compass(deps, info, new_compass) @@ -68,12 +87,131 @@ pub fn execute( pub mod execute { use super::*; use crate::msg::BotInfo; - use crate::ContractError::Unauthorized; + use crate::state::WITHDRAW_TIMESTAMP; + use crate::ContractError::{AllPending, Unauthorized}; use cosmwasm_std::Uint256; use ethabi::Address; + pub fn create_next_bot( + deps: DepsMut, + env: Env, + info: MessageInfo, + bot_id: Uint256, + callbacker: String, + callback_args: Vec, + remaining_count: Uint256, + ) -> Result, ContractError> { + let state = STATE.load(deps.storage)?; + if state.owner != info.sender { + return Err(Unauthorized {}); + } + #[allow(deprecated)] + let contract: Contract = Contract { + constructor: None, + functions: BTreeMap::from_iter(vec![( + "create_next_bot".to_string(), + vec![Function { + name: "create_next_bot".to_string(), + inputs: vec![ + Param { + name: "bot_id".to_string(), + kind: ParamType::Array(Box::new(ParamType::Address)), + internal_type: None, + }, + Param { + name: "callbacker".to_string(), + kind: ParamType::Array(Box::new(ParamType::Address)), + internal_type: None, + }, + Param { + name: "callback_args".to_string(), + kind: ParamType::Array(Box::new(ParamType::Array(Box::new( + ParamType::Uint(256), + )))), + internal_type: None, + }, + Param { + name: "remaining_count".to_string(), + kind: ParamType::Array(Box::new(ParamType::Array(Box::new( + ParamType::Uint(256), + )))), + internal_type: None, + }, + ], + outputs: Vec::new(), + constant: None, + state_mutability: StateMutability::NonPayable, + }], + )]), + events: BTreeMap::new(), + errors: BTreeMap::new(), + receive: false, + fallback: false, + }; + let mut tokens: Vec = vec![]; + let retry_delay: u64 = state.retry_delay; + if let Some(timestamp) = WITHDRAW_TIMESTAMP.may_load( + deps.storage, + (bot_id.to_string(), remaining_count.to_string()), + )? { + if timestamp.plus_seconds(retry_delay).lt(&env.block.time) { + tokens.push(Token::Uint(Uint::from_big_endian(&bot_id.to_be_bytes()))); + tokens.push(Token::Address( + Address::from_str(callbacker.as_str()).unwrap(), + )); + let mut tokens_callback_args: Vec = vec![]; + for callback_arg in callback_args { + tokens_callback_args.push(Token::Uint(Uint::from_big_endian( + &callback_arg.to_be_bytes(), + ))) + } + tokens.push(Token::Array(tokens_callback_args)); + WITHDRAW_TIMESTAMP.save( + deps.storage, + (bot_id.to_string(), remaining_count.to_string()), + &env.block.time, + )?; + } + } else { + tokens.push(Token::Uint(Uint::from_big_endian(&bot_id.to_be_bytes()))); + tokens.push(Token::Address( + Address::from_str(callbacker.as_str()).unwrap(), + )); + let mut tokens_callback_args: Vec = vec![]; + for callback_arg in callback_args { + tokens_callback_args.push(Token::Uint(Uint::from_big_endian( + &callback_arg.to_be_bytes(), + ))) + } + tokens.push(Token::Array(tokens_callback_args)); + WITHDRAW_TIMESTAMP.save( + deps.storage, + (bot_id.to_string(), remaining_count.to_string()), + &env.block.time, + )?; + } + if tokens.is_empty() { + Err(AllPending {}) + } else { + Ok(Response::new() + .add_message(CosmosMsg::Custom(PalomaMsg { + job_id: state.job_id, + payload: Binary( + contract + .function("create_next_bot") + .unwrap() + .encode_input(tokens.as_slice()) + .unwrap(), + ), + metadata: state.metadata, + })) + .add_attribute("action", "create_next_bot")) + } + } + pub fn repay_bot( deps: DepsMut, + env: Env, info: MessageInfo, bot_info: Vec, ) -> Result, ContractError> { @@ -121,36 +259,70 @@ pub mod execute { let mut token_bots: Vec = vec![]; let mut token_callbackers: Vec = vec![]; let mut token_callback_args: Vec = vec![]; + let retry_delay: u64 = state.retry_delay; for bot in bot_info { - token_bots.push(Token::Address(Address::from_str(bot.bot.as_str()).unwrap())); - token_callbackers.push(Token::Address( - Address::from_str(bot.callbacker.as_str()).unwrap(), - )); - let mut callback_args: Vec = vec![]; - for callback_arg in bot.callback_args { - callback_args.push(Token::Uint(Uint::from_big_endian( - &callback_arg.to_be_bytes(), - ))) + if let Some(timestamp) = WITHDRAW_TIMESTAMP + .may_load(deps.storage, (bot.bot.to_owned(), "repay".to_string()))? + { + if timestamp.plus_seconds(retry_delay).lt(&env.block.time) { + token_bots.push(Token::Address(Address::from_str(bot.bot.as_str()).unwrap())); + token_callbackers.push(Token::Address( + Address::from_str(bot.callbacker.as_str()).unwrap(), + )); + let mut callback_args: Vec = vec![]; + for callback_arg in bot.callback_args { + callback_args.push(Token::Uint(Uint::from_big_endian( + &callback_arg.to_be_bytes(), + ))) + } + token_callback_args.push(Token::Array(callback_args)); + WITHDRAW_TIMESTAMP.save( + deps.storage, + (bot.bot.to_owned(), "repay".to_string()), + &env.block.time, + )?; + } + } else { + token_bots.push(Token::Address(Address::from_str(bot.bot.as_str()).unwrap())); + token_callbackers.push(Token::Address( + Address::from_str(bot.callbacker.as_str()).unwrap(), + )); + let mut callback_args: Vec = vec![]; + for callback_arg in bot.callback_args { + callback_args.push(Token::Uint(Uint::from_big_endian( + &callback_arg.to_be_bytes(), + ))) + } + token_callback_args.push(Token::Array(callback_args)); + WITHDRAW_TIMESTAMP.save( + deps.storage, + (bot.bot.to_owned(), "repay".to_string()), + &env.block.time, + )?; } - token_callback_args.push(Token::Array(callback_args)); } - let tokens = vec![ - Token::Array(token_bots), - Token::Array(token_callbackers), - Token::Array(token_callback_args), - ]; - Ok(Response::new() - .add_message(CosmosMsg::Custom(PalomaMsg { - job_id: state.job_id, - payload: Binary( - contract - .function("repay_bot") - .unwrap() - .encode_input(tokens.as_slice()) - .unwrap(), - ), - })) - .add_attribute("action", "repay_bot")) + if token_bots.is_empty() { + Err(AllPending {}) + } else { + let tokens = vec![ + Token::Array(token_bots), + Token::Array(token_callbackers), + Token::Array(token_callback_args), + ]; + Ok(Response::new() + .add_message(CosmosMsg::Custom(PalomaMsg { + job_id: state.job_id, + payload: Binary( + contract + .function("repay_bot") + .unwrap() + .encode_input(tokens.as_slice()) + .unwrap(), + ), + metadata: state.metadata, + })) + .add_attribute("action", "repay_bot")) + } } pub fn set_paloma( @@ -189,6 +361,7 @@ pub mod execute { .encode_input(&[]) .unwrap(), ), + metadata: state.metadata, })) .add_attribute("action", "set_paloma")) } @@ -236,6 +409,7 @@ pub mod execute { .encode_input(&[Token::Address(new_compass_address)]) .unwrap(), ), + metadata: state.metadata, })) .add_attribute("action", "update_compass")) } @@ -283,6 +457,7 @@ pub mod execute { .encode_input(&[Token::Address(new_blueprint_address)]) .unwrap(), ), + metadata: state.metadata, })) .add_attribute("action", "update_blueprint")) } @@ -331,6 +506,7 @@ pub mod execute { .encode_input(&[Token::Address(update_refund_wallet_address)]) .unwrap(), ), + metadata: state.metadata, })) .add_attribute("action", "update_refund_wallet")) } @@ -379,6 +555,7 @@ pub mod execute { ))]) .unwrap(), ), + metadata: state.metadata, })) .add_attribute("action", "update_gas_fee")) } @@ -427,6 +604,7 @@ pub mod execute { .encode_input(&[Token::Address(new_service_fee_collector_address)]) .unwrap(), ), + metadata: state.metadata, })) .add_attribute("action", "update_service_fee_collector")) } @@ -475,6 +653,7 @@ pub mod execute { ))]) .unwrap(), ), + metadata: state.metadata, })) .add_attribute("action", "update_service_fee")) } diff --git a/src/error.rs b/src/error.rs index 4a69d8f..b18e47a 100644 --- a/src/error.rs +++ b/src/error.rs @@ -8,6 +8,9 @@ pub enum ContractError { #[error("Unauthorized")] Unauthorized {}, + + #[error("AllPending")] + AllPending {}, // Add any other custom errors you like here. // Look at https://docs.rs/thiserror/1.0.21/thiserror/ for details. } diff --git a/src/msg.rs b/src/msg.rs index d2971f2..bfd8721 100644 --- a/src/msg.rs +++ b/src/msg.rs @@ -3,7 +3,10 @@ use cosmwasm_std::{Binary, CustomMsg, Uint256}; #[cw_serde] pub struct InstantiateMsg { + pub retry_delay: u64, pub job_id: String, + pub creator: String, + pub signers: Vec, } #[cw_serde] @@ -15,14 +18,41 @@ pub struct BotInfo { #[cw_serde] pub enum ExecuteMsg { - RepayBot { bot_info: Vec }, + CreateNextBot { + bot_id: Uint256, + callbacker: String, + callback_args: Vec, + remaining_count: Uint256, + }, + RepayBot { + bot_info: Vec, + }, SetPaloma {}, - UpdateCompass { new_compass: String }, - UpdateBlueprint { new_blueprint: String }, - UpdateRefundWallet { new_refund_wallet: String }, - UpdateGasFee { new_gas_fee: Uint256 }, - UpdateServiceFeeCollector { new_service_fee_collector: String }, - UpdateServiceFee { new_service_fee: Uint256 }, + UpdateCompass { + new_compass: String, + }, + UpdateBlueprint { + new_blueprint: String, + }, + UpdateRefundWallet { + new_refund_wallet: String, + }, + UpdateGasFee { + new_gas_fee: Uint256, + }, + UpdateServiceFeeCollector { + new_service_fee_collector: String, + }, + UpdateServiceFee { + new_service_fee: Uint256, + }, +} + +#[cw_serde] +#[derive(Eq)] +pub struct Metadata { + pub creator: String, + pub signers: Vec, } /// Message struct for cross-chain calls. @@ -32,6 +62,8 @@ pub struct PalomaMsg { pub job_id: String, /// The payload, ABI encoded for the target chain. pub payload: Binary, + /// Metadata + pub metadata: Metadata, } #[cw_serde] diff --git a/src/state.rs b/src/state.rs index 9210f73..2709ec6 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,13 +1,17 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use cosmwasm_std::Addr; -use cw_storage_plus::Item; +use crate::msg::Metadata; +use cosmwasm_std::{Addr, Timestamp}; +use cw_storage_plus::{Item, Map}; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)] pub struct State { + pub retry_delay: u64, pub job_id: String, pub owner: Addr, + pub metadata: Metadata, } +pub const WITHDRAW_TIMESTAMP: Map<(String, String), Timestamp> = Map::new("withdraw_timestamp"); pub const STATE: Item = Item::new("state");