@@ -20,7 +20,12 @@ import (
20
20
21
21
const (
22
22
USDTAssetId = "218bc6f4-7927-3f8e-8568-3a3725b74361"
23
+ SOLAssetId = "64692c23-8971-4cf4-84a7-4dd1271dd887"
23
24
testSender = "e14c1573-3aca-48b1-b437-766b4757b50d"
25
+
26
+ testWithdrawalDestination = "73yoz7kK3zgh2ScD9aTJpXCrKHETi1xyEKfMTH95ugff"
27
+ testWithdrawalAmount = "0.0049"
28
+ testWithdrawalMemo = "withdrawal-test"
24
29
)
25
30
26
31
type Node struct {
@@ -51,12 +56,13 @@ func (n *Node) ProcessOutput(ctx context.Context, a *Action) ([]*Transaction, st
51
56
return []* Transaction {}, ""
52
57
}
53
58
memo := string (b )
54
- items := strings . Split (memo , "," )
59
+ items := SplitIds (memo )
55
60
56
61
var txs []* Transaction
57
62
var storageTraceId string
58
63
for _ , tx := range items {
59
- if tx == "storage" {
64
+ switch tx {
65
+ case "storage" :
60
66
extra := []byte ("storage-memo" )
61
67
enough := a .CheckAssetBalanceForStorageAt (ctx , extra )
62
68
if ! enough {
@@ -65,7 +71,11 @@ func (n *Node) ProcessOutput(ctx context.Context, a *Action) ([]*Transaction, st
65
71
t := a .BuildStorageTransaction (ctx , extra )
66
72
storageTraceId = t .TraceId
67
73
txs = append (txs , t )
68
- } else {
74
+ case "withdrawal" :
75
+ tid := "cf0564ba-bf51-4e8c-b504-3beb6c5c65e3"
76
+ t := a .BuildWithdrawTransaction (ctx , tid , SOLAssetId , testWithdrawalAmount , testWithdrawalMemo , testWithdrawalDestination , "" )
77
+ txs = append (txs , t )
78
+ default :
69
79
amt := decimal .RequireFromString (tx )
70
80
balance := a .CheckAssetBalanceAt (ctx , a .AssetId )
71
81
if balance .Cmp (amt ) < 0 {
@@ -150,6 +160,18 @@ func TestMTGCompaction(t *testing.T) {
150
160
ts , _ , err := node .Group .store .ListTransactions (ctx , TransactionStateInitial , 0 )
151
161
require .Nil (err )
152
162
require .Len (ts , 1 )
163
+
164
+ tx := ts [0 ]
165
+ tx .consumed = node .Group .ListOutputsForTransaction (ctx , tx .TraceId , tx .Sequence )
166
+ for _ , o := range tx .consumed {
167
+ tx .consumedIds = append (tx .consumedIds , o .OutputId )
168
+ }
169
+ tsb := SerializeTransactions (ts )
170
+ require .Equal ("010154b26ff29615c93faf99f74c4c5dcdb8847201c7d7eac8374ca5ec9dcb47a38fa5e559f9bda186359d9a1aba83cc3c0fa94c7337f67eaa3fcb95ee8513140604a20a218bc6f479273f8e85683a3725b743610006302e303033370000000000000047090500000000000000000000000000000000000000024c7337f67eaa3fcb95ee8513140604a28194ae75a00338f8ab2b4ce9ffbc87f4000000b862313237626363352d353536382d333832622d383937612d3531613131356133623734612c33306139393264622d666133362d333638302d396436392d3065363939333662373837622c38333864333032642d613131392d336462382d393966352d3034386533323235653437312c32613430363437612d376337642d333331392d616464332d6366393566346237383338642c31343662323264332d393766382d333938662d383036622d39393565633134393764373503" , hex .EncodeToString (tsb ))
171
+ dts , err := DeserializeTransactions (tsb )
172
+ require .Nil (err )
173
+ require .Len (dts , 1 )
174
+ require .True (ts [0 ].Equal (dts [0 ]))
153
175
}
154
176
155
177
func TestMTGCheckTxs (t * testing.T ) {
@@ -221,6 +243,100 @@ func TestMTGStorage(t *testing.T) {
221
243
require .Equal (storage .Hash .String (), tx .references [0 ].String ())
222
244
}
223
245
246
+ func TestMTGWithdrawal (t * testing.T ) {
247
+ require := require .New (t )
248
+ ctx , node := testBuildGroup (require )
249
+ require .NotNil (node )
250
+ defer teardownTestDatabase (node .Group .store )
251
+
252
+ d , err := decimal .NewFromString ("0.005" )
253
+ require .Nil (err )
254
+ err = node .Group .store .WriteAction (ctx , & UnifiedOutput {
255
+ OutputId : "7514b939-db92-3d31-abf4-7841f035e400" ,
256
+ TransactionRequestId : "cf0564ba-bf51-4e8c-b504-3beb6c5c65e2" ,
257
+ TransactionHash : "01c43005fd06e0b8f06a0af04faf7530331603e352a11032afd0fd9dbd84e8ee" ,
258
+ OutputIndex : 0 ,
259
+ AssetId : SOLAssetId ,
260
+ Amount : d ,
261
+ SendersThreshold : int64 (1 ),
262
+ Senders : []string {testSender },
263
+ ReceiversThreshold : int64 (node .Group .GetThreshold ()),
264
+ Extra : "" ,
265
+ State : SafeUtxoStateUnspent ,
266
+ Sequence : 4655227 ,
267
+ AppId : node .Group .GroupId ,
268
+ }, ActionStateDone )
269
+ require .Nil (err )
270
+
271
+ testDrainInitialOutputs (ctx , require , node .Group , "withdrawal" )
272
+ as , err := node .Group .store .ListActions (ctx , ActionStateInitial , 0 )
273
+ require .Nil (err )
274
+ require .Len (as , 1 )
275
+ wkr := node .Group .FindWorker (as [0 ].AppId )
276
+ require .NotNil (wkr )
277
+ err = node .Group .handleActionsQueue (ctx )
278
+ require .Nil (err )
279
+
280
+ txs , _ , err := node .Group .store .ListTransactions (ctx , TransactionStateInitial , 0 )
281
+ require .Nil (err )
282
+ require .Len (txs , 1 )
283
+ tx , err := Deserialize (txs [0 ].Serialize ())
284
+ require .Nil (err )
285
+ require .Equal (testWithdrawalAmount , tx .Amount )
286
+ require .Equal (testWithdrawalMemo , tx .Memo )
287
+ require .Equal (SOLAssetId , tx .AssetId )
288
+ require .Equal (testWithdrawalDestination , tx .Destination .String )
289
+ require .Equal ("" , tx .Tag .String )
290
+ require .False (tx .WithdrawalHash .Valid )
291
+
292
+ outputs := node .Group .ListOutputsForTransaction (ctx , tx .TraceId , tx .Sequence )
293
+ require .True (len (outputs ) > 0 )
294
+ ver , consumed , err := node .Group .buildRawTransaction (ctx , tx , outputs )
295
+ require .Nil (err )
296
+ require .True (len (outputs ) == len (consumed ))
297
+ raw := hex .EncodeToString (ver .Marshal ())
298
+ require .Equal (
299
+ "77770005481360491383ebd4f0f97543f3440313b48b8fd06dcfa5a0c2cabe4252d3a8eb000101c43005fd06e0b8f06a0af04faf7530331603e352a11032afd0fd9dbd84e8ee0000000000000000000200a10003077a100000000000000000000000000000000000000000000000000000000000000000000000007777002c3733796f7a376b4b337a6768325363443961544a705843724b48455469317879454b664d544839357567666600000000000227100002f5c8b3dbb7a5b2f7e1e4640d9f61c142cda547917f227ba21ebc5d554651c50d18f71fbe1b5055f3d882a4ae2813fad315bf0dcb5a0e60f091121db882baff77f18e0e276648b1d42063f8bcf9d5a57252f4048c9939ded0999a0e263716976e0003fffe02000000000000000f7769746864726177616c2d746573740000" ,
300
+ raw ,
301
+ )
302
+ _ , err = node .Group .updateTxWithOutputs (ctx , tx , consumed , & mixin.SafeMultisigRequest {
303
+ RequestID : tx .RequestID (),
304
+ TransactionHash : "f45e51276a031a46d25998605324e8a3f1b720d33f66dc226018448f53bda4c4" ,
305
+ RawTransaction : raw ,
306
+ })
307
+ require .Nil (err )
308
+
309
+ txs , _ , err = node .Group .store .ListTransactions (ctx , TransactionStateInitial , 0 )
310
+ require .Nil (err )
311
+ require .Len (txs , 0 )
312
+ txs , _ , err = node .Group .store .ListTransactions (ctx , TransactionStateSigned , 0 )
313
+ require .Nil (err )
314
+ require .Len (txs , 1 )
315
+
316
+ err = node .Group .store .FinishTransaction (ctx , tx .TraceId )
317
+ require .Nil (err )
318
+ txs , _ , err = node .Group .store .ListTransactions (ctx , TransactionStateSigned , 0 )
319
+ require .Nil (err )
320
+ require .Len (txs , 0 )
321
+ txs , _ , err = node .Group .store .ListTransactions (ctx , TransactionStateSnapshot , 0 )
322
+ require .Nil (err )
323
+ require .Len (txs , 1 )
324
+
325
+ tx = txs [0 ]
326
+ tx .consumed = node .Group .ListOutputsForTransaction (ctx , tx .TraceId , tx .Sequence )
327
+ for _ , o := range tx .consumed {
328
+ tx .consumedIds = append (tx .consumedIds , o .OutputId )
329
+ }
330
+ tsb := SerializeTransactions (txs )
331
+ require .Equal ("0100c8cf0564babf514e8cb5043beb6c5c65e37201c7d7eac8374ca5ec9dcb47a38fa57201c7d7eac8374ca5ec9dcb47a38fa5276192fd01413e56a50ff04061a218770d64692c2389714cf484a74dd1271dd8870006302e30303439000f7769746864726177616c2d7465737400000000004708a100000000000000000000000000000000000000017514b939db923d31abf47841f035e4007777002c3733796f7a376b4b337a6768325363443961544a705843724b48455469317879454b664d54483935756766660000" , hex .EncodeToString (tsb ))
332
+ dtxs , err := DeserializeTransactions (tsb )
333
+ require .Nil (err )
334
+ require .Len (dtxs , 1 )
335
+ tx .Hash = crypto.Hash {}
336
+ tx .Raw = nil
337
+ require .True (txs [0 ].Equal (dtxs [0 ]))
338
+ }
339
+
224
340
func testHandleCompactionTransaction (ctx context.Context , require * require.Assertions , group * Group , hash string ) * UnifiedOutput {
225
341
ts , _ , err := group .store .ListTransactions (ctx , TransactionStateInitial , 0 )
226
342
require .Nil (err )
0 commit comments