Contract con_otc002


Contract Code


  
1 random.seed()
2 I = importlib
3 fee = Variable()
4 data = Hash()
5 owners = Variable()
6 owner_perc = Hash()
7 payout = Hash(default_value=0)
8
9
10 @construct
11 def init():
12 owners.set(['ae7d14d6d9b8443f881ba6244727b69b681010e782d4fe482dbfb0b6aca02d5d', ctx.caller])
13 owner_perc['endo'] = decimal('0.5')
14 owner_perc['marvin'] = decimal('0.5')
15 fee.set(decimal('0.8'))
16
17 @export
18 def make_offer(offer_token: str, offer_amount: float, take_token: str,
19 take_amount: float):
20 assert offer_amount > 0, 'Negative offer_amount not allowed'
21 assert take_amount > 0, 'Negative take_amount not allowed'
22 offer_id = hashlib.sha256(str(now) + str(random.randrange(99)))
23 assert not data[offer_id], 'Generated ID not unique. Try again'
24 maker_fee = offer_amount / 100 * fee.get()
25 I.import_module(offer_token).transfer_from(amount=offer_amount +
26 maker_fee, to=ctx.this, main_account=ctx.caller)
27 data[offer_id] = {'maker': ctx.caller, 'taker': None, 'offer_token':
28 offer_token, 'offer_amount': offer_amount, 'take_token': take_token,
29 'take_amount': take_amount, 'fee': fee.get(), 'state': 'OPEN'}
30 return offer_id
31
32 @export
33 def take_offer(offer_id: str):
34 assert data[offer_id], 'Offer ID does not exist'
35 offer = data[offer_id]
36 assert offer['state'] == 'OPEN', 'Offer not available'
37 maker_fee = offer['offer_amount'] / 100 * offer['fee']
38 taker_fee = offer['take_amount'] / 100 * offer['fee']
39 #transfer take_token amount + taker_fee to this contract from taker
40 I.import_module(offer['take_token']).transfer_from(amount=offer[
41 'take_amount'] + taker_fee, to=ctx.this, main_account=ctx.caller)
42 #transfer take_token amount to maker
43 I.import_module(offer['take_token']).transfer(amount=offer[
44 'take_amount'], to=offer['maker'])
45 #transfer offer_token amount to taker
46 I.import_module(offer['offer_token']).transfer(amount=offer[
47 'offer_amount'], to=ctx.caller)
48 payout[offer['offer_token']] += maker_fee
49 payout[offer['take_token']] += taker_fee
50 offer['state'] = 'EXECUTED'
51 offer['taker'] = ctx.caller
52 data[offer_id] = offer
53
54 @export
55 def cancel_offer(offer_id: str):
56 assert data[offer_id], 'Offer ID does not exist'
57 offer = data[offer_id]
58 assert offer['state'] == 'OPEN', 'Offer can not be canceled'
59 assert offer['maker'] == ctx.caller, 'Only maker can cancel offer'
60 maker_fee = offer['offer_amount'] / 100 * offer['fee']
61 I.import_module(offer['offer_token']).transfer(amount=offer[
62 'offer_amount'] + maker_fee, to=ctx.caller)
63 offer['state'] = 'CANCELED'
64 data[offer_id] = offer
65
66 @export
67 def adjust_fee(trading_fee: str):
68 assert_owner()
69 assert trading_fee >= 0 and trading_fee <= 10, 'Wrong fee value'
70 fee.set(trading_fee)
71
72 @export
73 def payout_owners(token_list: list):
74 assert_owner()
75
76 for token in token_list:
77 if payout[token] > 0:
78 token_balances = ForeignHash(foreign_contract=token, foreign_name='balances')
79 otc_balance_1 = token_balances[ctx.this]
80 for owner in owners.get():
81 payout_amount = owner_perc[owner] * payout[token]
82 I.import_module(token).transfer(amount=payout_amount, to=owner)
83
84 otc_balance_2 = token_balances[ctx.this]
85 pay_out_sum = otc_balance_1 - otc_balance_2
86 payout[token] -= pay_out_sum
87
88
89 def assert_owner():
90 assert ctx.caller in owners.get(), 'Only owner can call this method!'

Byte Code

e3000000000000000000000000060000004000000073d200000065006a018300010065025a0365046400640164028d025a0565066400640364028d025a0765046400640464028d025a0865066400640564028d025a09650664066400640764088d035a0a6409640a84005a0b650c64008301650d650e650d650e640b9c04640c640d840483015a0f650c64008301650d640e9c01640f6410840483015a10650c64008301650d640e9c0164116412840483015a11650c64008301650d64139c0164146415840483015a12650c64008301651364169c0164176418840483015a146419641a84005a15641b5300291cda0a636f6e5f6f7463303032da036665652902da08636f6e7472616374da046e616d65da0464617461da066f776e657273da0a6f776e65725f70657263e900000000da067061796f75742903da0d64656661756c745f76616c756572030000007204000000630000000000000000000000000300000043000000733a00000074006a01640174026a03670283010100740464028301740564033c00740464028301740564043c0074066a01740464058301830101006400530029064eda40616537643134643664396238343433663838316261363234343732376236396236383130313065373832643466653438326462666230623661636130326435647a03302e35da04656e646fda066d617276696e7a03302e382907da085f5f6f776e657273da03736574da03637478da0663616c6c6572da07646563696d616cda0c5f5f6f776e65725f70657263da055f5f666565a90072150000007215000000da00da045f5f5f5f0a000000730c0000000001040102010a010c010c0172170000002904da0b6f666665725f746f6b656eda0c6f666665725f616d6f756e74da0a74616b655f746f6b656eda0b74616b655f616d6f756e7463040000000000000006000000090000004300000073a00000007c0164016b04731074006402830182017c0364016b047320740064038301820174016a02740374048301740374056a06640483018301170083017d0474077c0419000c00734e74006405830182017c0164061b0074086a09830014007d05740a6a0b7c0083016a0c7c017c051700740d6a0e740d6a0f64078d030100740d6a0f64007c007c017c027c0374086a098300640864099c0874077c043c007c045300290a4e72080000007a214e65676174697665206f666665725f616d6f756e74206e6f7420616c6c6f7765647a204e656761746976652074616b655f616d6f756e74206e6f7420616c6c6f776564e9630000007a2247656e657261746564204944206e6f7420756e697175652e2054727920616761696ee9640000002903da06616d6f756e74da02746fda0c6d61696e5f6163636f756e74da044f50454e2908da056d616b6572da0574616b657272180000007219000000721a000000721b0000007202000000da0573746174652910da0e417373657274696f6e4572726f72da07686173686c6962da06736861323536da03737472da036e6f77da0672616e646f6dda0972616e6472616e6765da065f5f646174617214000000da03676574da0149da0d696d706f72745f6d6f64756c65da0d7472616e736665725f66726f6d7210000000da04746869737211000000290672180000007219000000721a000000721b000000da086f666665725f6964da096d616b65725f666565721500000072150000007216000000da0a6d616b655f6f666665721300000073160000000003100110011c01120110010c01120106010601140172340000002901723200000063010000000000000004000000050000004300000073fe00000074007c0019007310740164018301820174007c0019007d017c016402190064036b02732c74016404830182017c016405190064061b007c016407190014007d027c016408190064061b007c016407190014007d0374026a037c016409190083016a047c01640819007c03170074056a0674056a07640a8d03010074026a037c016409190083016a087c01640819007c01640b1900640c8d02010074026a037c01640d190083016a087c016405190074056a07640c8d02010074097c01640d1900050019007c02370003003c0074097c0164091900050019007c03370003003c00640e7c0164023c0074056a077c01640f3c007c0174007c003c006400530029104e7a174f6666657220494420646f6573206e6f74206578697374722400000072210000007a134f66666572206e6f7420617661696c61626c657219000000721d0000007202000000721b000000721a0000002903721e000000721f000000722000000072220000002902721e000000721f0000007218000000da0845584543555445447223000000290a722c0000007225000000722e000000722f0000007230000000721000000072310000007211000000da087472616e73666572da085f5f7061796f757429047232000000da056f666665727233000000da0974616b65725f666565721500000072150000007216000000da0a74616b655f6f66666572230000007320000000000210010801140114011401100116011001100110010e011401140108010a01723a000000630100000000000000030000000400000043000000738c00000074007c0019007310740164018301820174007c0019007d017c016402190064036b02732c74016404830182017c016405190074026a036b02734274016406830182017c016407190064081b007c016409190014007d0274046a057c01640a190083016a067c01640719007c02170074026a03640b8d020100640c7c0164023c007c0174007c003c0064005300290d4e7a174f6666657220494420646f6573206e6f74206578697374722400000072210000007a194f666665722063616e206e6f742062652063616e63656c656472220000007a1b4f6e6c79206d616b65722063616e2063616e63656c206f666665727219000000721d000000720200000072180000002902721e000000721f000000da0843414e43454c45442907722c000000722500000072100000007211000000722e000000722f00000072360000002903723200000072380000007233000000721500000072150000007216000000da0c63616e63656c5f6f66666572370000007312000000000210010801140116011401100112010801723c0000002901da0b74726164696e675f666565630100000000000000010000000200000043000000732c0000007400830001007c0064016b0572167c0064026b01731e740164038301820174026a037c00830101006400530029044e7208000000e90a0000007a0f57726f6e67206665652076616c75652904da0e5f5f6173736572745f6f776e657272250000007214000000720f0000002901723d000000721500000072150000007216000000da0a61646a7573745f66656544000000730600000000020601180172400000002901da0a746f6b656e5f6c6973746301000000000000000800000007000000430000007396000000740083000100788a7c0044005d827d0174017c01190064016b04720c74027c0164026403640464058d047d027c0274036a0419007d03783474056a06830044005d287d0474077c04190074017c01190014007d0574086a097c0183016a0a7c057c0464068d020100714057007c0274036a0419007d067c037c0618007d0774017c01050019007c07380003003c00710c57006400530029074e7208000000da0862616c616e6365737201000000da0e746f6b656e5f62616c616e6365732904da10666f726569676e5f636f6e7472616374da0c666f726569676e5f6e616d65720300000072040000002902721e000000721f000000290b723f0000007237000000da0b466f726569676e4861736872100000007231000000720e000000722d0000007213000000722e000000722f000000723600000029087241000000da05746f6b656eda105f5f746f6b656e5f62616c616e636573da0d6f74635f62616c616e63655f31da056f776e6572da0d7061796f75745f616d6f756e74da0d6f74635f62616c616e63655f32da0b7061795f6f75745f73756d721500000072150000007216000000da0d7061796f75745f6f776e6572734b000000731a000000000206010a010c010401040108010a010e01100118010a010801724e000000630000000000000000000000000200000043000000731a00000074006a0174026a0383006b06731674046401830182016400530029024e7a204f6e6c79206f776e65722063616e2063616c6c2074686973206d6574686f6421290572100000007211000000720e000000722d00000072250000007215000000721500000072150000007216000000723f0000005c00000073020000000001723f0000004e2916722a000000da0473656564da09696d706f72746c6962722e000000da085661726961626c657214000000da0448617368722c000000720e000000721300000072370000007217000000da085f5f6578706f72747228000000da05666c6f61747234000000723a000000723c0000007240000000da046c697374724e000000723f0000007215000000721500000072150000007216000000da083c6d6f64756c653e010000007326000000080104010c010c010c010c010e03080906010601100e060110130601100c0601100606011010