(*****************************************************************************) (* *) (* Open Source License *) (* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. *) (* *) (* Permission is hereby granted, free of charge, to any person obtaining a *) (* copy of this software and associated documentation files (the "Software"),*) (* to deal in the Software without restriction, including without limitation *) (* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) (* and/or sell copies of the Software, and to permit persons to whom the *) (* Software is furnished to do so, subject to the following conditions: *) (* *) (* The above copyright notice and this permission notice shall be included *) (* in all copies or substantial portions of the Software. *) (* *) (* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) (* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) (* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) (* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) (* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) (* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) (* DEALINGS IN THE SOFTWARE. *) (* *) (*****************************************************************************) open Protocol type t = { pkh : Signature.Public_key_hash.t ; pk : Signature.Public_key.t ; sk : Signature.Secret_key.t ; } type account = t let known_accounts = Signature.Public_key_hash.Table.create 17 let new_account ?seed () = let (pkh, pk, sk) = Signature.generate_key ?seed () in let account = { pkh ; pk ; sk } in Signature.Public_key_hash.Table.add known_accounts pkh account ; account let add_account ({ pkh ; _ } as account) = Signature.Public_key_hash.Table.add known_accounts pkh account let activator_account = new_account () let find pkh = try return (Signature.Public_key_hash.Table.find known_accounts pkh) with Not_found -> failwith "Missing account: %a" Signature.Public_key_hash.pp pkh let find_alternate pkh = let exception Found of t in try Signature.Public_key_hash.Table.iter (fun pkh' account -> if not (Signature.Public_key_hash.equal pkh pkh') then raise (Found account)) known_accounts ; raise Not_found with Found account -> account let dummy_account = new_account () let generate_accounts ?(initial_balances = []) n : (t * Tez_repr.t) list = Signature.Public_key_hash.Table.clear known_accounts ; let default_amount = Tez_repr.of_mutez_exn 4_000_000_000_000L in let amount i = match List.nth_opt initial_balances i with | None -> default_amount | Some a -> Tez_repr.of_mutez_exn a in List.map (fun i -> let (pkh, pk, sk) = Signature.generate_key () in let account = { pkh ; pk ; sk } in Signature.Public_key_hash.Table.add known_accounts pkh account ; account, amount i) (0--(n-1)) let commitment_secret = Blinded_public_key_hash.activation_code_of_hex "aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbb" let new_commitment ?seed () = let (pkh, pk, sk) = Signature.generate_key ?seed ~algo:Ed25519 () in let unactivated_account = { pkh; pk; sk } in let open Commitment_repr in let pkh = match pkh with Ed25519 pkh -> pkh | _ -> assert false in let bpkh = Blinded_public_key_hash.of_ed25519_pkh commitment_secret pkh in Lwt.return @@ Environment.wrap_error @@ Tez_repr.(one *? 4_000L) >>=? fun amount -> return @@ (unactivated_account, { blinded_public_key_hash = bpkh ; amount })