From 7cad0f73997a3fac71cd9af06f84b344ddbc64f5 Mon Sep 17 00:00:00 2001 From: Ragot Geoffrey Date: Thu, 17 Nov 2022 16:09:27 +0100 Subject: [PATCH] fix(numscript): fix insufficient fund error instead of conflict error with used reference (#371) * fix(numscript): fix insufficient fund error instead of conflict error with used reference * refactor: factorize code --- .dockerignore | 3 +++ Dockerfile | 2 +- pkg/ledger/executor.go | 11 +++++++++++ pkg/ledger/executor_test.go | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..478c25bf6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +vendor +sdk +.git diff --git a/Dockerfile b/Dockerfile index 7775e3230..07793ddc7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,7 +27,7 @@ RUN --mount=type=cache,id=gomod,target=/go/pkg/mod \ -X github.com/numary/ledger/cmd.Commit=${APP_SHA} \ -X github.com/numary/ledger/cmd.DefaultSegmentWriteKey=${SEGMENT_WRITE_KEY}" ./ -FROM ubuntu:jammy +FROM ubuntu:jammy as app RUN apt update && apt install -y ca-certificates wget && rm -rf /var/lib/apt/lists/* COPY --from=builder /go/src/github.com/numary/ledger/numary /usr/local/bin/numary EXPOSE 3068 diff --git a/pkg/ledger/executor.go b/pkg/ledger/executor.go index 38ca6d04c..57fbac316 100644 --- a/pkg/ledger/executor.go +++ b/pkg/ledger/executor.go @@ -13,6 +13,15 @@ import ( ) func (l *Ledger) execute(ctx context.Context, script core.Script) (*core.TransactionData, error) { + if script.Reference != "" { + txs, err := l.GetTransactions(ctx, *NewTransactionsQuery().WithReferenceFilter(script.Reference)) + if err != nil { + return nil, err + } + if len(txs.Data) > 0 { + return nil, NewConflictError() + } + } if script.Plain == "" { return nil, NewScriptError(ScriptErrorNoScript, "no script to execute") } @@ -123,6 +132,7 @@ func (l *Ledger) execute(ctx context.Context, script core.Script) (*core.Transac } func (l *Ledger) Execute(ctx context.Context, script core.Script) (*core.ExpandedTransaction, error) { + t, err := l.execute(ctx, script) if err != nil { return nil, err @@ -137,6 +147,7 @@ func (l *Ledger) Execute(ctx context.Context, script core.Script) (*core.Expande } func (l *Ledger) ExecutePreview(ctx context.Context, script core.Script) (*core.ExpandedTransaction, error) { + t, err := l.execute(ctx, script) if err != nil { return nil, err diff --git a/pkg/ledger/executor_test.go b/pkg/ledger/executor_test.go index 571f78277..1d291f7c4 100644 --- a/pkg/ledger/executor_test.go +++ b/pkg/ledger/executor_test.go @@ -409,3 +409,37 @@ func TestScriptSetReference(t *testing.T) { assert.Equal(t, script.Reference, last.Reference) }) } +func TestScriptReferenceConflict(t *testing.T) { + runOnLedger(func(l *ledger.Ledger) { + defer func(l *ledger.Ledger, ctx context.Context) { + require.NoError(t, l.Close(ctx)) + }(l, context.Background()) + + _, err := l.Execute(context.Background(), core.Script{ + ScriptCore: core.ScriptCore{ + Plain: ` + send [USD/2 99] ( + source=@world + destination=@user:001 + )`, + Vars: map[string]json.RawMessage{}, + }, + Reference: "tx_ref", + }) + require.NoError(t, err) + + _, err = l.Execute(context.Background(), core.Script{ + ScriptCore: core.ScriptCore{ + Plain: ` + send [USD/2 99] ( + source=@unexists + destination=@user:001 + )`, + Vars: map[string]json.RawMessage{}, + }, + Reference: "tx_ref", + }) + require.Error(t, err) + require.True(t, ledger.IsConflictError(err)) + }) +}