Skip to content

Commit

Permalink
feat: covers new transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
wregulski committed Jul 9, 2023
1 parent 2a50ac0 commit cd5d50b
Show file tree
Hide file tree
Showing 10 changed files with 343 additions and 9 deletions.
13 changes: 9 additions & 4 deletions actions/transactions/new.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/BuxOrg/bux"
buxmodels "github.com/BuxOrg/bux-models"
"github.com/BuxOrg/bux-server/actions"
"github.com/BuxOrg/bux-server/mappings"
"github.com/julienschmidt/httprouter"
apirouter "github.com/mrz1836/go-api-router"
)
Expand Down Expand Up @@ -52,8 +53,8 @@ func (a *Action) newTransaction(w http.ResponseWriter, req *http.Request, _ http
return
}

txConfig := buxmodels.TransactionConfig{}
if err = json.Unmarshal(configBytes, &txConfig); err != nil {
txContract := buxmodels.TransactionConfig{}
if err = json.Unmarshal(configBytes, &txContract); err != nil {
apirouter.ReturnResponse(w, req, http.StatusBadRequest, actions.ErrBadTxConfig.Error())
return
}
Expand All @@ -64,18 +65,22 @@ func (a *Action) newTransaction(w http.ResponseWriter, req *http.Request, _ http
opts = append(opts, bux.WithMetadatas(metadata))
}

txConfig := mappings.MapToTransactionConfigBux(&txContract)

// Record a new transaction (get the hex from parameters)
var transaction *bux.DraftTransaction
if transaction, err = a.Services.Bux.NewTransaction(
req.Context(),
xPub.RawXpub(),
&txConfig,
txConfig,
opts...,
); err != nil {
apirouter.ReturnResponse(w, req, http.StatusUnprocessableEntity, err.Error())
return
}

contract := mappings.MapToDraftTransactionContract(transaction)

// Return response
apirouter.ReturnResponse(w, req, http.StatusCreated, bux.DisplayModels(transaction))
apirouter.ReturnResponse(w, req, http.StatusCreated, bux.DisplayModels(contract))
}
2 changes: 1 addition & 1 deletion go.mod

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions mappings/admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ func MapToAdminStatsContract(s *bux.AdminStats) *buxmodels.AdminStats {
return &buxmodels.AdminStats{
Balance: s.Balance,
Destinations: s.Destinations,
PaymailAddress: s.PaymailAddresses,
PaymailAddresses: s.PaymailAddresses,
Transactions: s.Transactions,
TransactionsPerDay: s.TransactionsPerDay,
Utxos: s.Utxos,
UtxosPerType: s.UtxosPerType,
Xpubs: s.XPubs,
XPubs: s.XPubs,
}
}
20 changes: 20 additions & 0 deletions mappings/fee_unit.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package mappings

import (
buxmodels "github.com/BuxOrg/bux-models"
"github.com/BuxOrg/bux/utils"
)

func MapToFeeUnitContract(fu *utils.FeeUnit) (fc *buxmodels.FeeUnit) {
return &buxmodels.FeeUnit{
Satoshis: fu.Satoshis,
Bytes: fu.Bytes,
}
}

func MapToFeeUnitBux(fu *buxmodels.FeeUnit) (fc *utils.FeeUnit) {
return &utils.FeeUnit{
Satoshis: fu.Satoshis,
Bytes: fu.Bytes,
}
}
26 changes: 26 additions & 0 deletions mappings/paymail_address.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,29 @@ func MapToPaymailContract(pa *bux.PaymailAddress) *buxmodels.PaymailAddress {
ExternalXpubKey: pa.ExternalXpubKey,
}
}

func MapToPaymailP4Contract(p *bux.PaymailP4) *buxmodels.PaymailP4 {
return &buxmodels.PaymailP4{
Alias: p.Alias,
Domain: p.Domain,
FromPaymail: p.FromPaymail,
Note: p.Note,
PubKey: p.PubKey,
ReceiveEndpoint: p.ReceiveEndpoint,
ReferenceID: p.ReferenceID,
ResolutionType: p.ResolutionType,
}
}

func MapToPaymailP4Bux(p *buxmodels.PaymailP4) *bux.PaymailP4 {
return &bux.PaymailP4{
Alias: p.Alias,
Domain: p.Domain,
FromPaymail: p.FromPaymail,
Note: p.Note,
PubKey: p.PubKey,
ReceiveEndpoint: p.ReceiveEndpoint,
ReferenceID: p.ReferenceID,
ResolutionType: p.ResolutionType,
}
}
24 changes: 24 additions & 0 deletions mappings/script_output.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package mappings

import (
"github.com/BuxOrg/bux"
buxmodels "github.com/BuxOrg/bux-models"
)

func MapToScriptOutputContract(so *bux.ScriptOutput) (sc *buxmodels.ScriptOutput) {
return &buxmodels.ScriptOutput{
Address: so.Address,
Satoshis: so.Satoshis,
Script: so.Script,
ScriptType: so.ScriptType,
}
}

func MapToScriptOutputBux(so *buxmodels.ScriptOutput) (sc *bux.ScriptOutput) {
return &bux.ScriptOutput{
Address: so.Address,
Satoshis: so.Satoshis,
Script: so.Script,
ScriptType: so.ScriptType,
}
}
24 changes: 24 additions & 0 deletions mappings/sync_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package mappings

import (
"github.com/BuxOrg/bux"
buxmodels "github.com/BuxOrg/bux-models"
)

func MapToSyncConfigContract(sc *bux.SyncConfig) *buxmodels.SyncConfig {
return &buxmodels.SyncConfig{
Broadcast: sc.Broadcast,
BroadcastInstant: sc.BroadcastInstant,
PaymailP2P: sc.PaymailP2P,
SyncOnChain: sc.SyncOnChain,
}
}

func MapToSyncConfigBux(sc *buxmodels.SyncConfig) *bux.SyncConfig {
return &bux.SyncConfig{
Broadcast: sc.Broadcast,
BroadcastInstant: sc.BroadcastInstant,
PaymailP2P: sc.PaymailP2P,
SyncOnChain: sc.SyncOnChain,
}
}
190 changes: 189 additions & 1 deletion mappings/transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,201 @@ func MapToTransactionContract(t *bux.Transaction) *buxmodels.Transaction {
}
}

func MapToTransactionBux(t *buxmodels.Transaction) *bux.Transaction {
return &bux.Transaction{
Model: *common.MapToModel(&t.Model),
TransactionBase: bux.TransactionBase{ID: t.ID, Hex: t.Hex},
XpubInIDs: t.XpubInIDs,
XpubOutIDs: t.XpubOutIDs,
BlockHash: t.BlockHash,
BlockHeight: t.BlockHeight,
Fee: t.Fee,
NumberOfInputs: t.NumberOfInputs,
NumberOfOutputs: t.NumberOfOutputs,
DraftID: t.DraftID,
TotalValue: t.TotalValue,
OutputValue: t.OutputValue,
Status: bux.SyncStatus(t.Status),
Direction: bux.TransactionDirection(t.TransactionDirection),
}
}

func MapToTransactionConfigBux(tx *buxmodels.TransactionConfig) *bux.TransactionConfig {
destinations := make([]*bux.Destination, 0)
for _, destination := range tx.ChangeDestinations {
destinations = append(destinations, MapToDestinationBux(destination))
}

fromUtxos := make([]*bux.UtxoPointer, 0)
for _, utxo := range tx.FromUtxos {
fromUtxos = append(fromUtxos, MapToUtxoPointerBux(utxo))
}

includeUtxos := make([]*bux.UtxoPointer, 0)
for _, utxo := range tx.IncludeUtxos {
includeUtxos = append(includeUtxos, MapToUtxoPointerBux(utxo))
}

inputs := make([]*bux.TransactionInput, 0)
for _, input := range tx.Inputs {
inputs = append(inputs, MapToTransactionInputBux(input))
}

outputs := make([]*bux.TransactionOutput, 0)
for _, output := range tx.Outputs {
outputs = append(outputs, MapToTransactionOutputBux(output))
}

return &bux.TransactionConfig{
ChangeDestinations: destinations,
ChangeDestinations: destinations,
ChangeDestinationsStrategy: bux.ChangeStrategy(tx.ChangeStrategy),
ChangeMinimumSatoshis: tx.ChangeMinimumSatoshis,
ChangeNumberOfDestinations: tx.ChangeNumberOfDestinations,
ChangeSatoshis: tx.ChangeSatoshis,
ExpiresIn: tx.ExpiresIn,
Fee: tx.Fee,
FeeUnit: MapToFeeUnitBux(tx.FeeUnit),
FromUtxos: fromUtxos,
IncludeUtxos: includeUtxos,
Inputs: inputs,
Outputs: outputs,
SendAllTo: MapToTransactionOutputBux(tx.SendAllTo),
Sync: MapToSyncConfigBux(tx.Sync),
}
}

func MapToTransactionConfigContract(tx *bux.TransactionConfig) *buxmodels.TransactionConfig {
destinations := make([]*buxmodels.Destination, 0)
for _, destination := range tx.ChangeDestinations {
destinations = append(destinations, MapToDestinationContract(destination))
}

fromUtxos := make([]*buxmodels.UtxoPointer, 0)
for _, utxo := range tx.FromUtxos {
fromUtxos = append(fromUtxos, MapToUtxoPointer(utxo))
}

includeUtxos := make([]*buxmodels.UtxoPointer, 0)
for _, utxo := range tx.IncludeUtxos {
includeUtxos = append(includeUtxos, MapToUtxoPointer(utxo))
}

inputs := make([]*buxmodels.TransactionInput, 0)
for _, input := range tx.Inputs {
inputs = append(inputs, MapToTransactionInputContract(input))
}

outputs := make([]*buxmodels.TransactionOutput, 0)
for _, output := range tx.Outputs {
outputs = append(outputs, MapToTransactionOutputContract(output))
}

return &buxmodels.TransactionConfig{
ChangeDestinations: destinations,
ChangeStrategy: string(tx.ChangeDestinationsStrategy),
ChangeMinimumSatoshis: tx.ChangeMinimumSatoshis,
ChangeNumberOfDestinations: tx.ChangeNumberOfDestinations,
ChangeSatoshis: tx.ChangeSatoshis,
ExpiresIn: tx.ExpiresIn,
FeeUnit: MapToFeeUnitContract(tx.FeeUnit),
FromUtxos: fromUtxos,
IncludeUtxos: includeUtxos,
Inputs: inputs,
Outputs: outputs,
SendAllTo: MapToTransactionOutputContract(tx.SendAllTo),
Sync: MapToSyncConfigContract(tx.Sync),
}
}

func MapToDraftTransactionContract(tx *bux.DraftTransaction) *buxmodels.DraftTransaction {
return &buxmodels.DraftTransaction{
Model: *common.MapToContract(&tx.Model),
ID: tx.ID,
Hex: tx.Hex,
XpubID: tx.XpubID,
ExpiresAt: tx.ExpiresAt,
Configuration: *MapToTransactionConfigContract(&tx.Configuration),
}
}

func MapToTransactionInputContract(inp *bux.TransactionInput) *buxmodels.TransactionInput {
return &buxmodels.TransactionInput{
Utxo: *MapToUtxoContract(&inp.Utxo),
Destination: *MapToDestinationContract(&inp.Destination),
}
}

func MapToTransactionInputBux(inp *buxmodels.TransactionInput) *bux.TransactionInput {
return &bux.TransactionInput{
Utxo: *MapToUtxoBux(&inp.Utxo),
Destination: *MapToDestinationBux(&inp.Destination),
}
}

func MapToTransactionOutputContract(out *bux.TransactionOutput) *buxmodels.TransactionOutput {
scriptOutputs := make([]*buxmodels.ScriptOutput, 0)
for _, scriptOutput := range out.Scripts {
scriptOutputs = append(scriptOutputs, MapToScriptOutputContract(scriptOutput))
}

return &buxmodels.TransactionOutput{
OpReturn: MapToOpReturnContract(out.OpReturn),
PaymailP4: MapToPaymailP4Contract(out.PaymailP4),
Satoshis: out.Satoshis,
Script: out.Script,
Scripts: scriptOutputs,
To: out.To,
UseForChange: out.UseForChange,
}
}

func MapToTransactionOutputBux(out *buxmodels.TransactionOutput) *bux.TransactionOutput {
scriptOutputs := make([]*bux.ScriptOutput, 0)
for _, scriptOutput := range out.Scripts {
scriptOutputs = append(scriptOutputs, MapToScriptOutputBux(scriptOutput))
}

return &bux.TransactionOutput{
OpReturn: MapToOpReturnBux(out.OpReturn),
PaymailP4: MapToPaymailP4Bux(out.PaymailP4),
Satoshis: out.Satoshis,
Script: out.Script,
Scripts: scriptOutputs,
To: out.To,
UseForChange: out.UseForChange,
}
}

func MapToMapProtocolContract(mp *bux.MapProtocol) *buxmodels.MapProtocol {
return &buxmodels.MapProtocol{
App: mp.App,
Keys: mp.Keys,
Type: mp.Type,
}
}

func MapToMapProtocolBux(mp *buxmodels.MapProtocol) *bux.MapProtocol {
return &bux.MapProtocol{
App: mp.App,
Keys: mp.Keys,
Type: mp.Type,
}
}

func MapToOpReturnContract(op *bux.OpReturn) *buxmodels.OpReturn {
return &buxmodels.OpReturn{
Hex: op.Hex,
HexParts: op.HexParts,
Map: MapToMapProtocolContract(op.Map),
StringParts: op.StringParts,
}
}

func MapToOpReturnBux(op *buxmodels.OpReturn) *bux.OpReturn {
return &bux.OpReturn{
Hex: op.Hex,
HexParts: op.HexParts,
Map: MapToMapProtocolBux(op.Map),
StringParts: op.StringParts,
}
}
Loading

0 comments on commit cd5d50b

Please sign in to comment.