# Mintacoin utils
| PK | SK |
| -------------------------------------------------------- | -------------------------------------------------------- |
| GAJRGL6OXXWGVDGRLZK777AGHHHFR7VIYOW6OLFOQMFTNL2W7ZXCHTDW | SAHGVCA37V54AACEYNDLNIB356BWV3WEALMYFOAVX2OE24SZCIBDRO4X |
| GD47D6GIIJMEDJQVQH3U2LJYB2337AWZKSA2FOZY77XUF27CSRTT2CLV | SCP6HOQYN57RWQHVDPTPDGV3FMTYL3AULW3A26S5XTB2UNMZ52IFL5FN |
| GA2YG3YULNTUEMMLN4HUQVL7B37GJTYSRZYH6HZUFLXFDCCGKLXIXMDT | SBXUGZ25PNYMPMK36M52TDPB4HSF4CZ23DJPY4ENZMGAN2D4CYFSSVIL |
## Create account
- Las Keypair de Stellar ya deberian enviarse en los params, o se generan dentro de la funcion `Stellar.Accounts.create`?
```elixir
# 1. Set the creator account
source_account =
Stellar.TxBuild.Account.new("GA2YG3YULNTUEMMLN4HUQVL7B37GJTYSRZYH6HZUFLXFDCCGKLXIXMDT")
# 2. set the next sequence number for the founder account
{:ok, seq_num} =
Stellar.Horizon.Accounts.fetch_next_sequence_number(
"GA2YG3YULNTUEMMLN4HUQVL7B37GJTYSRZYH6HZUFLXFDCCGKLXIXMDT"
)
sequence_number = Stellar.TxBuild.SequenceNumber.new(seq_num)
# 3. build the create_account operation
operation =
Stellar.TxBuild.CreateAccount.new(
destination: "GA5LAUWYGVTWLNUKQK42EJ2VHMXN5TEYTUWD4KBHVMOTQWH2IMZUUQLV",
starting_balance: 2
)
# 4. build the tx signatures
signer_key_pair =
Stellar.KeyPair.from_secret_seed("SBXUGZ25PNYMPMK36M52TDPB4HSF4CZ23DJPY4ENZMGAN2D4CYFSSVIL")
signature = Stellar.TxBuild.Signature.new(signer_key_pair)
# 5. submit the transaction to Horizon
{:ok, envelope} =
source_account
|> Stellar.TxBuild.new(sequence_number: sequence_number)
|> Stellar.TxBuild.add_operation(operation)
|> Stellar.TxBuild.sign(signature)
|> Stellar.TxBuild.envelope()
Stellar.Horizon.Transactions.create(envelope)
```
## Create payment setting trustline
```elixir
{payer_pk, _sk} =
signer_key_pair =
Stellar.KeyPair.from_secret_seed("SCP6HOQYN57RWQHVDPTPDGV3FMTYL3AULW3A26S5XTB2UNMZ52IFL5FN")
{paid_pk, _sk} =
payed_key_pair =
Stellar.KeyPair.from_secret_seed("SAHGVCA37V54AACEYNDLNIB356BWV3WEALMYFOAVX2OE24SZCIBDRO4X")
# 1. set the payer account
source_account = Stellar.TxBuild.Account.new(payer_pk)
# 2. set the next sequence number for the payer account
{:ok, seq_num} = Stellar.Horizon.Accounts.fetch_next_sequence_number(payer_pk)
sequence_number = Stellar.TxBuild.SequenceNumber.new(seq_num)
asset = [code: "MTK", issuer: "GA2YG3YULNTUEMMLN4HUQVL7B37GJTYSRZYH6HZUFLXFDCCGKLXIXMDT"]
# 3. Set trustline for the payment
trustline_operation =
Stellar.TxBuild.ChangeTrust.new(
asset: asset,
source_account: paid_pk
)
# 4. build the payment operation
operation =
Stellar.TxBuild.Payment.new(
destination: paid_pk,
asset: asset,
amount: 1000
)
# 5. build the tx signatures
payer_signature = Stellar.TxBuild.Signature.new(signer_key_pair)
payed_signature = Stellar.TxBuild.Signature.new(payed_key_pair)
# 6. submit the transaction to Horizon
{:ok, envelope} =
source_account
|> Stellar.TxBuild.new(sequence_number: sequence_number)
|> Stellar.TxBuild.add_operation(trustline_operation)
|> Stellar.TxBuild.add_operation(operation)
|> Stellar.TxBuild.sign([payed_signature, payer_signature])
|> Stellar.TxBuild.envelope()
Stellar.Horizon.Transactions.create(envelope)
```
## Create payment without trustline
```elixir
{payer_pk, _sk} =
signer_key_pair =
Stellar.KeyPair.from_secret_seed("SCP6HOQYN57RWQHVDPTPDGV3FMTYL3AULW3A26S5XTB2UNMZ52IFL5FN")
{payed_pk, _sk} =
Stellar.KeyPair.from_secret_seed("SAHGVCA37V54AACEYNDLNIB356BWV3WEALMYFOAVX2OE24SZCIBDRO4X")
# 1. set the payer account
source_account = Stellar.TxBuild.Account.new(payer_pk)
# 2. set the next sequence number for the payer account
{:ok, seq_num} = Stellar.Horizon.Accounts.fetch_next_sequence_number(payer_pk)
sequence_number = Stellar.TxBuild.SequenceNumber.new(seq_num)
asset = [code: "MTK", issuer: "GA2YG3YULNTUEMMLN4HUQVL7B37GJTYSRZYH6HZUFLXFDCCGKLXIXMDT"]
# 3. build the payment operation
operation =
Stellar.TxBuild.Payment.new(
destination: payed_pk,
asset: asset,
amount: 1000
)
# 4. build the tx signatures
payer_signature = Stellar.TxBuild.Signature.new(signer_key_pair)
# 5. submit the transaction to Horizon
{:ok, envelope} =
source_account
|> Stellar.TxBuild.new(sequence_number: sequence_number)
|> Stellar.TxBuild.add_operation(operation)
|> Stellar.TxBuild.sign(payer_signature)
|> Stellar.TxBuild.envelope()
Stellar.Horizon.Transactions.create(envelope)
```
## Create asset
```elixir
{issuer_pk, _issuer_sk} =
issuer_keypair =
Stellar.KeyPair.from_secret_seed("SBXUGZ25PNYMPMK36M52TDPB4HSF4CZ23DJPY4ENZMGAN2D4CYFSSVIL")
source_account = Stellar.TxBuild.Account.new(issuer_pk)
{distribution_pk, _sk} =
distribution_keypair =
Stellar.KeyPair.from_secret_seed("SCP6HOQYN57RWQHVDPTPDGV3FMTYL3AULW3A26S5XTB2UNMZ52IFL5FN")
asset_code = "MTK"
asset_supply = 1_000_000
# 2. set the next sequence number for the issuer account
{:ok, seq_num} = Stellar.Horizon.Accounts.fetch_next_sequence_number(issuer_pk)
sequence_number = Stellar.TxBuild.SequenceNumber.new(seq_num)
# 3. build the create_account operation
asset = [code: asset_code, issuer: issuer_pk]
trustline_operation =
Stellar.TxBuild.ChangeTrust.new(
asset: asset,
source_account: distribution_pk
)
create_payment_operation =
Stellar.TxBuild.Payment.new(
destination: distribution_pk,
asset: asset,
amount: asset_supply,
source_account: issuer_pk
)
# 4. build the tx signatures
distribution_signature = Stellar.TxBuild.Signature.new(distribution_keypair)
issuer_signature = Stellar.TxBuild.Signature.new(issuer_keypair)
# 5. submit the transaction to Horizon
{:ok, envelope} =
source_account
|> Stellar.TxBuild.new(sequence_number: sequence_number)
|> Stellar.TxBuild.add_operation(trustline_operation)
|> Stellar.TxBuild.add_operation(create_payment_operation)
|> Stellar.TxBuild.sign([issuer_signature, distribution_signature])
|> Stellar.TxBuild.envelope()
Stellar.Horizon.Transactions.create(envelope)
```
## Authorize asset
```elixir
{truster_pk, _sk} =
truster_keypair =
Stellar.KeyPair.from_secret_seed("SDG3KYI5RR6YKUECA4J6TNOAPY2XW7OFHAPKR3LII4R47W4SYZNPMPY6")
# 1. Set the truster source account
source_account = Stellar.TxBuild.Account.new(truster_pk)
# 2. set the next sequence number for the issuer account
{:ok, seq_num} = Stellar.Horizon.Accounts.fetch_next_sequence_number(truster_pk)
sequence_number = Stellar.TxBuild.SequenceNumber.new(seq_num)
# 3. build the trustline operation
trustline_operation =
Stellar.TxBuild.ChangeTrust.new(
asset: [code: "MTK", issuer: "GA2YG3YULNTUEMMLN4HUQVL7B37GJTYSRZYH6HZUFLXFDCCGKLXIXMDT"]
)
# 4. build the tx signatures
truster_signature = Stellar.TxBuild.Signature.new(truster_keypair)
# 5. submit the transaction to Horizon
{:ok, envelope} =
source_account
|> Stellar.TxBuild.new(sequence_number: sequence_number)
|> Stellar.TxBuild.add_operation(trustline_operation)
|> Stellar.TxBuild.sign(truster_signature)
|> Stellar.TxBuild.envelope()
Stellar.Horizon.Transactions.create(envelope)
```
## Reponses
```
{:ok,
%Stellar.Horizon.Transaction{
created_at: ~U[2022-06-30 16:57:55Z],
envelope_xdr: "AAAAAgAAAAD0TmCowAdQZfNEJayTp5/8IFzEYVL1zjguPDIlWU331gAAAGQAAhLHAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAGAAAAAU1USwAAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7ot//////////wAAAAAAAAABWU331gAAAEC/MisnMeYpoeP271pX5HvRmTJVoJaxww1d7CZPgvlppFyenEYyIpv8sYcZsoFMdrfyJA0k2WVWTcpyHbVKaMEH",
fee_charged: 100,
fee_meta_xdr: "AAAAAgAAAAMAAhLHAAAAAAAAAAD0TmCowAdQZfNEJayTp5/8IFzEYVL1zjguPDIlWU331gAAABdIdugAAAISxwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAhLcAAAAAAAAAAD0TmCowAdQZfNEJayTp5/8IFzEYVL1zjguPDIlWU331gAAABdIduecAAISxwAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA==",
hash: "6984326ac947fba61ab4a702e12b5550eb44f0b9811ce05889b66fe9f9fbe822",
id: "6984326ac947fba61ab4a702e12b5550eb44f0b9811ce05889b66fe9f9fbe822",
ledger: 135900,
max_fee: 100,
memo: nil,
memo_type: "none",
operation_count: 1,
paging_token: "583686055534592",
result_meta_xdr: "AAAAAgAAAAIAAAADAAIS3AAAAAAAAAAA9E5gqMAHUGXzRCWsk6ef/CBcxGFS9c44LjwyJVlN99YAAAAXSHbnnAACEscAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAIS3AAAAAAAAAAA9E5gqMAHUGXzRCWsk6ef/CBcxGFS9c44LjwyJVlN99YAAAAXSHbnnAACEscAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAhLcAAAAAGK91hMAAAAAAAAAAQAAAAMAAAAAAAIS3AAAAAEAAAAA9E5gqMAHUGXzRCWsk6ef/CBcxGFS9c44LjwyJVlN99YAAAABTVRLAAAAAAA1g28UW2dCMYtvD0hVfw7+ZM8SjnB/HzQq7lGIRlLuiwAAAAAAAAAAf/////////8AAAABAAAAAAAAAAAAAAADAAIS3AAAAAAAAAAA9E5gqMAHUGXzRCWsk6ef/CBcxGFS9c44LjwyJVlN99YAAAAXSHbnnAACEscAAAABAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAhLcAAAAAGK91hMAAAAAAAAAAQACEtwAAAAAAAAAAPROYKjAB1Bl80QlrJOnn/wgXMRhUvXOOC48MiVZTffWAAAAF0h255wAAhLHAAAAAQAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAAIS3AAAAABivdYTAAAAAAAAAAA=",
result_xdr: "AAAAAAAAAGQAAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAA=",
signatures: ["vzIrJzHmKaHj9u9aV+R70ZkyVaCWscMNXewmT4L5aaRcnpxGMiKb/LGHGbKBTHa38iQNJNllVk3Kch21SmjBBw=="],
source_account: "GD2E4YFIYADVAZPTIQS2ZE5HT76CAXGEMFJPLTRYFY6DEJKZJX35MJJE",
source_account_sequence: 583595861213185,
successful: true,
valid_after: nil,
valid_before: nil
}}
```
```
{:ok,
%Response{
successful: true,
hash: "3378da751d34b5abb6ce233b6a8dd905c461c6c21a813c1d825cd8bc64c38815",
created_at: ~U[2022-06-30 17:04:10Z],
blockchain: "stellar",
tx_json: %{
created_at: ~U[2022-06-30 17:04:10Z],
envelope_xdr:
"AAAAAgAAAAA1g28UW2dCMYtvD0hVfw7+ZM8SjnB/HzQq7lGIRlLuiwAAAMgAAc5vAAAACgAAAAAAAAAAAAAAAgAAAAEAAAAA+fH4yEJYQaYVgfdNLTgOt7+C2VSBors4/+9C6+KUZz0AAAAGAAAAAU1USwAAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7ot//////////wAAAAEAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7osAAAABAAAAAPnx+MhCWEGmFYH3TS04Dre/gtlUgaK7OP/vQuvilGc9AAAAAU1USwAAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7osAAAkYTnKgAAAAAAAAAAACRlLuiwAAAEC2abYb0wynN8CPzUJzVQr9koQAxmK4+4VPkvk91xVONGwSECQ6UwxWJiLBl60lq4LatPbiht7cXB8oXs4nhCUI4pRnPQAAAEBH5SXfAGNgiGeQ0GXvV0XpH13cS9IVjTou45AYM91cnBLwK1Mi1vPKpCgVeVAHeHbHOogbOboLNCPavL38IroA",
fee_charged: 200,
fee_meta_xdr:
"AAAAAgAAAAMAAeK5AAAAAAAAAAA1g28UW2dCMYtvD0hVfw7+ZM8SjnB/HzQq7lGIRlLuiwAAABc4XwNsAAHObwAAAAkAAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAADAAAAAAAB4rkAAAAAYrzZXQAAAAAAAAABAAITIwAAAAAAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7osAAAAXOF8CpAABzm8AAAAJAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAeK5AAAAAGK82V0AAAAA",
hash: "3378da751d34b5abb6ce233b6a8dd905c461c6c21a813c1d825cd8bc64c38815",
id: "3378da751d34b5abb6ce233b6a8dd905c461c6c21a813c1d825cd8bc64c38815",
ledger: 135_971,
max_fee: 200,
memo: nil,
memo_type: "none",
operation_count: 2,
paging_token: "583990998208512",
result_meta_xdr:
"AAAAAgAAAAIAAAADAAITIwAAAAAAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7osAAAAXOF8CpAABzm8AAAAJAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAwAAAAAAAeK5AAAAAGK82V0AAAAAAAAAAQACEyMAAAAAAAAAADWDbxRbZ0Ixi28PSFV/Dv5kzxKOcH8fNCruUYhGUu6LAAAAFzhfAqQAAc5vAAAACgAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAMAAAAAAAITIwAAAABivdeKAAAAAAAAAAIAAAACAAAAAwACD7UAAAABAAAAAPnx+MhCWEGmFYH3TS04Dre/gtlUgaK7OP/vQuvilGc9AAAAAU1USwAAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7osAAASC16JWgAAACRhOcqAAAAAAAQAAAAAAAAAAAAAAAQACEyMAAAABAAAAAPnx+MhCWEGmFYH3TS04Dre/gtlUgaK7OP/vQuvilGc9AAAAAU1USwAAAAAANYNvFFtnQjGLbw9IVX8O/mTPEo5wfx80Ku5RiEZS7osAAASC16JWgH//////////AAAAAQAAAAAAAAAAAAAAAgAAAAMAAhMjAAAAAQAAAAD58fjIQlhBphWB900tOA63v4LZVIGiuzj/70Lr4pRnPQAAAAFNVEsAAAAAADWDbxRbZ0Ixi28PSFV/Dv5kzxKOcH8fNCruUYhGUu6LAAAEgteiVoB//////////wAAAAEAAAAAAAAAAAAAAAEAAhMjAAAAAQAAAAD58fjIQlhBphWB900tOA63v4LZVIGiuzj/70Lr4pRnPQAAAAFNVEsAAAAAADWDbxRbZ0Ixi28PSFV/Dv5kzxKOcH8fNCruUYhGUu6LAAANmyYU9oB//////////wAAAAEAAAAAAAAAAAAAAAA=",
result_xdr: "AAAAAAAAAMgAAAAAAAAAAgAAAAAAAAAGAAAAAAAAAAAAAAABAAAAAAAAAAA=",
signatures: [
"tmm2G9MMpzfAj81Cc1UK/ZKEAMZiuPuFT5L5PdcVTjRsEhAkOlMMViYiwZetJauC2rT24obe3FwfKF7OJ4QlCA==",
"R+Ul3wBjYIhnkNBl71dF6R9d3EvSFY06LuOQGDPdXJwS8CtTItbzyqQoFXlQB3h2xzqIGzm6CzQj2ry9/CK6AA=="
],
source_account: "GA2YG3YULNTUEMMLN4HUQVL7B37GJTYSRZYH6HZUFLXFDCCGKLXIXMDT",
source_account_sequence: 508_451_113_402_378,
successful: true,
valid_after: nil,
valid_before: nil
}
}}
```
## Event Driven
* Plug para validar minter signature
* Estructuras de los eventos.
* Crear el EventManager para convertir las respuestas de la base de datos a eventos.
* Layer de "Core" con las funciones.
* Crear account en base de datos y crear registro de BlockchainTx.
```elixir
def create_account(changes) do
changes
|> Accounts.create()
|> handle_response() # To create the BlockchainTx if the response is successful
end
```
* Crear asset en base de datos y crear registro de BlockchainTx.
* Crear payment en base de datos y crear registro de BlockchainTx.
* Autorizar asset en base de datos (WalletAsset) y crear registro de BlockchainTx.
* Crear el Nofitier en una migracion para el BlockchainTx.
* Modificar el listener para manejar los diferentes eventos.