This commit is contained in:
Craig Everett 2025-03-04 20:11:11 +09:00
parent 14960d5d18
commit 2d4350fa49
3 changed files with 112 additions and 0 deletions

15
.gitignore vendored Normal file
View 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
View 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
View 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).