17 , _dgp_svc(db.dynamic_global_property_service())
18 , _account_svc(db.account_service())
26 const auto& idx =
db_impl().get_index<atomicswap_contract_index>().indices().get<by_owner_name>();
28 std::copy(idx.cbegin(), idx.cend(), std::back_inserter(ret));
38 =
db_impl().get_index<atomicswap_contract_index>().indices().get<by_owner_name>().equal_range(
owner.name);
39 for (
auto it = idx.first; it != idx.second; ++it)
41 ret.push_back(std::cref(*it));
47 const atomicswap_contract_object&
50 FC_ASSERT(!secret_hash.empty(),
"Empty secret hash.");
55 return get_by<by_contract_hash>(contract_hash);
57 FC_CAPTURE_AND_RETHROW((from.name)(to.name)(secret_hash))
61 const account_object&
owner,
62 const account_object& recipient,
64 const std::string& secret_hash,
65 const optional<std::string>& metadata)
68 FC_ASSERT(amount.
amount > 0,
"Invalid amount.");
69 FC_ASSERT(
owner.balance >= amount,
"Insufficient funds.");
70 FC_ASSERT(!secret_hash.empty(),
"Empty secret hash.");
74 FC_ASSERT((
nullptr == find_by<by_contract_hash>(contract_hash)),
75 "There is contract for '${a}' with same secret. Use another secret and try again.",
76 (
"a", recipient.name));
78 "Can't create more then ${1} contract per owner.",
80 FC_ASSERT(_contracts_per_recipient(
owner.name, recipient.name)
82 "Can't create more then ${1} contract per recipient.",
86 time_point_sec deadline = start;
89 case atomicswap_contract_initiator:
92 case atomicswap_contract_participant:
96 FC_ASSERT(
false,
"Invalid contract type.");
99 const atomicswap_contract_object& new_contract =
create([&](atomicswap_contract_object& contract) {
101 contract.owner =
owner.name;
102 contract.to = recipient.name;
103 contract.amount = amount;
104 contract.created = start;
105 contract.deadline = deadline;
106 fc::from_string(contract.secret_hash, secret_hash);
107 contract.contract_hash = contract_hash;
108 if (metadata.valid())
110 fc::from_string(contract.metadata, *metadata);
121 const account_object& to = _account_svc.
get_account(contract.to);
125 if (contract.type == atomicswap_contract_initiator)
132 update(contract, [&](atomicswap_contract_object& contract) {
133 fc::from_string(contract.secret, secret);
134 contract.amount.amount = 0;
151 return db_impl().get_index<atomicswap_contract_index>().indices().get<by_recipient_name>().count(recipient);
tracks the blockchain state in an extensible manner
virtual const atomicswap_contract_object & get_contract(const account_object &from, const account_object &to, const std::string &secret_hash) const override
virtual atomicswap_contracts_refs_type get_contracts() const override
virtual void refund_contract(const atomicswap_contract_object &contract) override
virtual const atomicswap_contract_object & create_contract(atomicswap_contract_type tp, const account_object &owner, const account_object &recipient, const asset &amount, const std::string &secret_hash, const optional< std::string > &metadata=optional< std::string >()) override
virtual void redeem_contract(const atomicswap_contract_object &contract, const std::string &secret) override
dba::db_index & db_impl()
virtual const object_type & create(const modifier_type &modifier) override
virtual void update(const modifier_type &modifier) override
virtual void remove() override
#define SCORUM_ATOMICSWAP_INITIATOR_REFUND_LOCK_SECS
#define SCORUM_ATOMICSWAP_LIMIT_REQUESTED_CONTRACTS_PER_RECIPIENT
#define SCORUM_ATOMICSWAP_LIMIT_REQUESTED_CONTRACTS_PER_OWNER
#define SCORUM_ATOMICSWAP_PARTICIPANT_REFUND_LOCK_SECS
size_t size(db_index &db_idx)
fc::fixed_string_32 hash_index_type
hash_index_type get_contract_hash(const account_name_type &from, const account_name_type &to, const std::string &secret_hash)
fc::fixed_string_16 account_name_type
virtual const account_object & get_account(const account_name_type &) const =0
virtual void increase_balance(const account_object &account, const asset &amount)=0
virtual void decrease_balance(const account_object &account, const asset &amount)=0
std::vector< std::reference_wrapper< const atomicswap_contract_object > > atomicswap_contracts_refs_type
virtual fc::time_point_sec head_block_time() const =0
asset_symbol_type symbol() const