#pragma once #include "vm/cells.h" #include "SmartContract.h" #include "Ed25519.h" #include namespace ton { class MultisigWallet : public ton::SmartContract { public: MultisigWallet(State state) : SmartContract(std::move(state)) { } using Mask = std::bitset<128>; struct QueryState { enum State { Unknown, NotReady, Sent } state = Unknown; Mask mask; }; class QueryBuilder { public: QueryBuilder(td::uint32 wallet_id, td::int64 query_id, td::Ref msg, int mode = 3); void sign(td::int32 id, td::Ed25519::PrivateKey& pk); td::Ref create_inner() const; td::Ref create(td::int32 id, td::Ed25519::PrivateKey& pk) const; Mask get_mask() const { return mask_; } private: vm::Ref dict_; td::Ref msg_; Mask mask_; }; MultisigWallet* make_copy() const override { return new MultisigWallet{state_}; } // creation static td::Ref create(td::Ref data = {}); td::Ref create_init_data(td::uint32 wallet_id, std::vector public_keys, int k) const; static td::Ref create_init_data_fast(td::uint32 wallet_id, std::vector public_keys, int k); // get methods int processed(td::uint64 query_id) const; QueryState get_query_state(td::uint64 query_id) const; std::vector get_public_keys() const; td::Ref merge_queries(td::Ref a, td::Ref b) const; std::pair check_query_signatures(td::Ref a) const; std::pair get_n_k() const; Mask to_mask(td::RefInt256 mask) const; struct Message { td::uint64 query_id; Mask signed_by; td::Ref message; }; std::vector get_unsigned_messaged(int id = -1) const; }; } // namespace ton