@@ -388,9 +388,9 @@ public void OpenLimitOrder(Address from, Address provider, string baseSymbol, st
388
388
OpenOrder ( from , provider , baseSymbol , quoteSymbol , side , IoC ? ImmediateOrCancel : Limit , orderSize , price ) ;
389
389
}
390
390
391
- public void OpenOTCOrder ( Address from , Address provider , string baseSymbol , string quoteSymbol , BigInteger ammount , BigInteger price )
391
+ public void OpenOTCOrder ( Address from , string baseSymbol , string quoteSymbol , BigInteger ammount , BigInteger price )
392
392
{
393
- OpenOrder ( from , provider , baseSymbol , quoteSymbol , ExchangeOrderSide . Sell , ExchangeOrderType . OTC , ammount , price ) ;
393
+ OpenOrder ( from , Address . Null , baseSymbol , quoteSymbol , ExchangeOrderSide . Sell , ExchangeOrderType . OTC , ammount , price ) ;
394
394
}
395
395
396
396
public void CancelOrder ( BigInteger uid )
@@ -531,6 +531,22 @@ private void CreateOTC(Address from, string baseSymbol, string quoteSymbol, BigI
531
531
{
532
532
var uid = Runtime . GenerateUID ( ) ;
533
533
534
+ var count = _otcBook . Count ( ) ;
535
+ ExchangeOrder lockUpOrder ;
536
+ for ( int i = 0 ; i < count ; i ++ )
537
+ {
538
+ lockUpOrder = _otcBook . Get < ExchangeOrder > ( i ) ;
539
+ if ( lockUpOrder . Creator == from )
540
+ {
541
+ throw new Exception ( "Already have an offer created" ) ;
542
+ return ;
543
+ }
544
+ }
545
+
546
+ var baseBalance = Runtime . GetBalance ( baseSymbol , from ) ;
547
+ Runtime . Expect ( baseBalance >= amount , "invalid seller amount" ) ;
548
+ Runtime . TransferTokens ( baseSymbol , from , this . Address , price ) ;
549
+
534
550
var order = new ExchangeOrder ( uid , Runtime . Time , from , this . Address , amount , baseSymbol , price , quoteSymbol , ExchangeOrderSide . Sell , ExchangeOrderType . OTC ) ;
535
551
_otcBook . Add < ExchangeOrder > ( order ) ;
536
552
}
@@ -545,15 +561,46 @@ public void TakeOrder(Address from, BigInteger uid)
545
561
var order = _otcBook . Get < ExchangeOrder > ( i ) ;
546
562
if ( order . Uid == uid )
547
563
{
548
- throw new NotImplementedException ( ) ;
564
+ var baseBalance = Runtime . GetBalance ( order . BaseSymbol , this . Address ) ;
565
+ Runtime . Expect ( baseBalance >= order . Price , "invalid seller amount" ) ;
566
+
567
+ var quoteBalance = Runtime . GetBalance ( order . QuoteSymbol , from ) ;
568
+ Runtime . Expect ( quoteBalance >= order . Amount , "invalid buyer amount" ) ;
549
569
570
+ Runtime . TransferTokens ( order . BaseSymbol , this . Address , from , order . Price ) ;
571
+ Runtime . TransferTokens ( order . QuoteSymbol , from , order . Creator , order . Amount ) ;
572
+ _otcBook . RemoveAt ( i ) ;
550
573
return ;
551
574
}
552
575
}
553
576
554
577
Runtime . Expect ( false , "order not found" ) ;
555
578
}
556
579
580
+ public void CancelOTCOrder ( Address from , BigInteger uid )
581
+ {
582
+ var count = _otcBook . Count ( ) ;
583
+ ExchangeOrder order ;
584
+ for ( int i = 0 ; i < count ; i ++ )
585
+ {
586
+ order = _otcBook . Get < ExchangeOrder > ( i ) ;
587
+ if ( order . Uid == uid )
588
+ {
589
+ Runtime . Expect ( Runtime . IsWitness ( from ) , "invalid witness" ) ;
590
+ Runtime . Expect ( Runtime . IsWitness ( order . Creator ) , "invalid witness" ) ;
591
+ Runtime . Expect ( from == order . Creator , "invalid owner" ) ;
592
+ _otcBook . RemoveAt ( i ) ;
593
+
594
+ Runtime . TransferTokens ( order . BaseSymbol , this . Address , order . Creator , order . Price ) ;
595
+ Runtime . Notify ( EventKind . TokenReceive , order . Creator , new TokenEventData ( order . BaseSymbol , order . Amount , Runtime . Chain . Name ) ) ;
596
+ return ;
597
+ }
598
+ }
599
+
600
+ // if it reaches here, it means it not found nothing in previous part
601
+ throw new Exception ( "order not found" ) ;
602
+ }
603
+
557
604
/*public void SwapTokens(Address buyer, Address seller, string baseSymbol, string quoteSymbol, BigInteger amount, BigInteger price, byte[] signature)
558
605
{
559
606
Runtime.Expect(Runtime.IsWitness(buyer), "invalid witness");
0 commit comments