Initial
This commit is contained in:
parent
14960d5d18
commit
2d4350fa49
15
.gitignore
vendored
Normal file
15
.gitignore
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
.eunit
|
||||
deps
|
||||
*.o
|
||||
*.beam
|
||||
*.plt
|
||||
*.swp
|
||||
erl_crash.dump
|
||||
ebin/*.beam
|
||||
doc/*.html
|
||||
doc/*.css
|
||||
doc/edoc-info
|
||||
doc/erlang.png
|
||||
rel/example_project
|
||||
.concrete/DEV_MODE
|
||||
.rebar
|
13
counter.aes
Normal file
13
counter.aes
Normal file
@ -0,0 +1,13 @@
|
||||
@compiler >= 9.0.0
|
||||
|
||||
contract Counter =
|
||||
record state = {value : int}
|
||||
|
||||
stateful entrypoint init() =
|
||||
{value = 1}
|
||||
|
||||
stateful entrypoint increment() =
|
||||
put({value = state.value + 1})
|
||||
|
||||
entrypoint value() =
|
||||
state.value
|
84
toy_caller.erl
Normal file
84
toy_caller.erl
Normal file
@ -0,0 +1,84 @@
|
||||
-module(toy_caller).
|
||||
|
||||
-export([new_keys/0, get_source/0, deploy/3]).
|
||||
|
||||
|
||||
new_keys() ->
|
||||
#{public := PubKey, secret := SecKey = <<K:32/binary, _/binary>>} = ecu_eddsa:sign_keypair(),
|
||||
Phrase = gd_key_master:encode(K),
|
||||
ID = gmser_api_encoder:encode(account_pubkey, PubKey),
|
||||
{ID, SecKey, Phrase}.
|
||||
|
||||
get_source() ->
|
||||
file:read_file("counter.aes").
|
||||
|
||||
|
||||
deploy(Source, PubKey, SecKey) ->
|
||||
case compile(Source) of
|
||||
{ok, Build} -> deploy2(Build, PubKey, SecKey);
|
||||
Error -> Error
|
||||
end.
|
||||
|
||||
deploy2(Build, PubKey, SecKey) ->
|
||||
ChainID = <<"groot.testnet">>, % NOTE: This obviously should come from the chain
|
||||
{ok, Height} = hz:top_height(),
|
||||
{ok, Nonce} = hz:next_nonce(PubKey),
|
||||
TTL = Height + 10000,
|
||||
GasPrice = hz:min_gas_price(),
|
||||
Gas = 5000000,
|
||||
Amount = 0,
|
||||
InitArgs = [], % NOTE: This would be a list of strings, had this contract arguments
|
||||
case hz:contract_create_built(PubKey,
|
||||
Nonce, Amount, TTL, Gas, GasPrice,
|
||||
Build, InitArgs) of
|
||||
{ok, CreateTX} -> deploy3(SecKey, CreateTX, ChainID);
|
||||
Error -> gmc_v_devman:trouble(Error)
|
||||
end.
|
||||
|
||||
deploy3(SecKey, CreateTX, ChainID) ->
|
||||
SignedTX = sign_tx_hash(CreateTX, SecKey, ChainID),
|
||||
case hz:post_tx(SignedTX) of
|
||||
{ok, Data = #{"tx_hash" := TXHash}} ->
|
||||
ok = io:format("The transaction hash is: ~p", [TXHash]),
|
||||
deploy4(Data);
|
||||
{ok, WTF} ->
|
||||
gmc_v_devman:trouble({error, WTF});
|
||||
Error ->
|
||||
gmc_v_devman:trouble(Error)
|
||||
end.
|
||||
|
||||
deploy4(#{"tx_hash" := TXHash}) ->
|
||||
case hz:tx_info(TXHash) of
|
||||
{ok, #{"call_info" := #{"return_type" := "ok", "contract_id" := ConID}}} ->
|
||||
gmc_v_devman:open_contract(ConID);
|
||||
{error, "Tx not mined"} ->
|
||||
gmc_v_devman:trouble({tx_hash, TXHash});
|
||||
{ok, Reason = #{"call_info" := #{"return_type" := "revert"}}} ->
|
||||
gmc_v_devman:trouble({error, Reason});
|
||||
Error ->
|
||||
gmc_v_devman:trouble(Error)
|
||||
end.
|
||||
|
||||
|
||||
|
||||
compile(Source) ->
|
||||
Options = [{aci, json}],
|
||||
so_compiler:from_string(Source, Options).
|
||||
|
||||
|
||||
|
||||
sign_tx_hash(Unsigned, SecKey, NetworkID) ->
|
||||
{ok, TX_Data} = gmser_api_encoder:safe_decode(transaction, Unsigned),
|
||||
{ok, Hash} = eblake2:blake2b(32, TX_Data),
|
||||
NetworkHash = <<NetworkID/binary, Hash/binary>>,
|
||||
Signature = ecu_eddsa:sign_detached(NetworkHash, SecKey),
|
||||
SigTxType = signed_tx,
|
||||
SigTxVsn = 1,
|
||||
SigTemplate =
|
||||
[{signatures, [binary]},
|
||||
{transaction, binary}],
|
||||
TX =
|
||||
[{signatures, [Signature]},
|
||||
{transaction, TX_Data}],
|
||||
SignedTX = gmser_chain_objects:serialize(SigTxType, SigTxVsn, SigTemplate, TX),
|
||||
gmser_api_encoder:encode(transaction, SignedTX).
|
Loading…
x
Reference in New Issue
Block a user