# 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.