Transaction #18598

Hash 816c8305992740f4b53fcfbabeaf908a287cea1abf7517a625e6d0fd70ede9c4
Status Success
Timestamp 251 days ago - 8/20/2023, 8:31:58 AM UTC+0
Block 18598
Stamps Used 384
Burned Fee 0.02272189 TAU
From c674a8a398fb81765277f77fc11464496dae94632de18eea1d69bf0c7894ad03 
Contract Name submission
Function Name submit_contract

Additional Info
Nonce 0
Processor c674a8a398fb81765277f77fc11464496dae94632de18eea1d69bf0c7894ad03
Signature 4a9c42f9d39b0514af3a07867ca466cacb289c69efbffa5b097ea1fe63255fbdea51bacd545e91d8a166c8fff834cebb6d35af765d5aa173a9dc1154386d1101
Stamps Supplied 777
Stamps per TAU 169

Kwargs

code I = importlib token_interface = [I.Func('transfer', args=('amount', 'to')), I.Func( 'approve', args=('amount', 'to')), I.Func('transfer_from', args=( 'amount', 'to', 'main_account'))] pools = Hash(default_value=0) lp_points = Hash(default_value=0) config = Hash(default_value=0) fee_rewards = Hash(default_value=0) @construct def seed(): config['owner'] = ctx.caller @export def create_pool(tokens: list, fee: float): assert len(tokens) == 2, 'You need to have 2 tokens in a pool' for i in range(len(tokens)): token = tokens[i] token_module = I.import_module(token['contract']) assert I.enforce_interface(token_module, token_interface ), 'Invalid token interface!' assert token['amount'] > 0, 'Amount must be greater than 0' token_module.transfer_from(amount=token['amount'], to=ctx.this, main_account=ctx.caller) pool_id = len(pools) pool = {'tokens': tokens, 'total_lp_points': 100, 'fee': fee, 'price': tokens[0]['amount'] / tokens[1]['amount']} pools[pool_id] = pool lp_points[pool_id, ctx.caller] = 100 return pool_id @export def add_liquidity(pool_id: int, tokens: list): pool = pools[pool_id] assert len(tokens) == 2, 'You need to have 2 tokens in a pool' for i in range(len(tokens)): token = tokens[i] assert pool['tokens'][i]['contract'] == token['contract'], 'Invalid token contract' assert token['amount'] > 0, 'Amount must be greater than 0' token_module = I.import_module(token['contract']) token_module.transfer_from(amount=token['amount'], to=ctx.this, main_account=ctx.caller) pool['tokens'][i]['amount'] += token['amount'] pool['total_lp_points'] += tokens[0]['amount'] / pool['price'] * pool['total_lp_points'] / pool['tokens'][0]['amount'] lp_points[pool_id, ctx.caller] += tokens[0]['amount'] / pool['price'] * pool['total_lp_points'] / pool['tokens'][0]['amount'] pools[pool_id] = pool return tokens[0]['amount'] / pool['price'] * pool['total_lp_points'] / pool['tokens'][0]['amount'] @export def remove_liquidity(pool_id: int, amount: float): pool = pools[pool_id] assert amount > 0, 'Amount must be greater than 0' lp_points[pool_id, ctx.caller] -= amount pool['total_lp_points'] -= amount for i in range(len(pool['tokens'])): token = pool['tokens'][i] token_module = I.import_module(token['contract']) token_module.transfer(amount=amount * token['amount'] / pool['total_lp_points'], to=ctx.caller) pool['tokens'][i]['amount'] -= amount * token['amount'] / pool['total_lp_points'] pools[pool_id] = pool return amount @export def swap(pool_id: int, token_from: str, token_to: str, amount: float, max_slippage: float=10): # 1/5 of fee goes to the config owner and 4/5 goes to the liquidity providers of the pool # the fee is taken from the output amount # loop though all the liquidity providers and add the fee to fee_rewards fee_rewards[pool_id, account] += fee # assert if max_slippage is exceeded pool = pools[pool_id] assert token_from in [token['contract'] for token in pool['tokens']], 'Invalid token_from' assert token_to in [token['contract'] for token in pool['tokens']], 'Invalid token_to' assert amount > 0, 'Amount must be greater than 0' assert max_slippage > 0, 'Max slippage must be greater than 0' assert max_slippage < 50, 'Max slippage must be less than 50' token_from_index = None token_to_index = None for i in range(len(pool['tokens'])): if pool['tokens'][i]['contract'] == token_from: token_from_index = i if pool['tokens'][i]['contract'] == token_to: token_to_index = i token_module_from = I.import_module(token_from) token_module_to = I.import_module(token_to) token_amount_from = amount token_amount_to = amount * pool['tokens'][token_to_index]['amount'] / pool['tokens'][token_from_index]['amount'] # Calculate the fee fee = token_amount_to * pool['fee'] / 100 fee_owner = fee / 5 fee_liquidity_providers = fee - fee_owner # Transfer tokens from the caller to the contract token_module_from.transfer_from(amount=token_amount_from, to=ctx.this, main_account=ctx.caller) # Calculate slippage expected_token_amount_to = token_amount_to - fee_liquidity_providers min_token_amount_to = expected_token_amount_to * (100 - max_slippage) / 100 # Transfer tokens to the caller token_module_to.transfer(amount=token_amount_to - fee_liquidity_providers, to=ctx.caller) # Distribute fee to the owner and liquidity providers fee_rewards[pool_id, config['owner']] += fee_owner for account in lp_points.keys(): if account[0] == pool_id: fee_rewards[pool_id, account[1]] += fee_liquidity_providers / pool['total_lp_points'] * lp_points[account] return token_amount_to - fee_liquidity_providers @export def get_pool(pool_id: int): return pools[pool_id] @export def get_lp_points(pool_id: int, account: str): return lp_points[pool_id, account] @export def get_config(): return config
name con_test_swap1

State Changes

Contract con_test_swap1
Variable __code__
New Value I = importlib token_interface = [I.Func('transfer', args=('amount', 'to')), I.Func( 'approve', args=('amount', 'to')), I.Func('transfer_from', args=( 'amount', 'to', 'main_account'))] __pools = Hash(default_value=0, contract='con_test_swap1', name='pools') __lp_points = Hash(default_value=0, contract='con_test_swap1', name='lp_points' ) __config = Hash(default_value=0, contract='con_test_swap1', name='config') __fee_rewards = Hash(default_value=0, contract='con_test_swap1', name= 'fee_rewards') def ____(): __config['owner'] = ctx.caller @__export('con_test_swap1') def create_pool(tokens: list, fee: float): assert len(tokens) == 2, 'You need to have 2 tokens in a pool' for i in range(len(tokens)): token = tokens[i] token_module = I.import_module(token['contract']) assert I.enforce_interface(token_module, token_interface ), 'Invalid token interface!' assert token['amount'] > 0, 'Amount must be greater than 0' token_module.transfer_from(amount=token['amount'], to=ctx.this, main_account=ctx.caller) pool_id = len(__pools) pool = {'tokens': tokens, 'total_lp_points': 100, 'fee': fee, 'price': tokens[0]['amount'] / tokens[1]['amount']} __pools[pool_id] = pool __lp_points[pool_id, ctx.caller] = 100 return pool_id @__export('con_test_swap1') def add_liquidity(pool_id: int, tokens: list): pool = __pools[pool_id] assert len(tokens) == 2, 'You need to have 2 tokens in a pool' for i in range(len(tokens)): token = tokens[i] assert pool['tokens'][i]['contract'] == token['contract' ], 'Invalid token contract' assert token['amount'] > 0, 'Amount must be greater than 0' token_module = I.import_module(token['contract']) token_module.transfer_from(amount=token['amount'], to=ctx.this, main_account=ctx.caller) pool['tokens'][i]['amount'] += token['amount'] pool['total_lp_points'] += tokens[0]['amount'] / pool['price'] * pool[ 'total_lp_points'] / pool['tokens'][0]['amount'] __lp_points[pool_id, ctx.caller] += tokens[0]['amount'] / pool['price' ] * pool['total_lp_points'] / pool['tokens'][0]['amount'] __pools[pool_id] = pool return tokens[0]['amount'] / pool['price'] * pool['total_lp_points' ] / pool['tokens'][0]['amount'] @__export('con_test_swap1') def remove_liquidity(pool_id: int, amount: float): pool = __pools[pool_id] assert amount > 0, 'Amount must be greater than 0' __lp_points[pool_id, ctx.caller] -= amount pool['total_lp_points'] -= amount for i in range(len(pool['tokens'])): token = pool['tokens'][i] token_module = I.import_module(token['contract']) token_module.transfer(amount=amount * token['amount'] / pool[ 'total_lp_points'], to=ctx.caller) pool['tokens'][i]['amount'] -= amount * token['amount'] / pool[ 'total_lp_points'] __pools[pool_id] = pool return amount @__export('con_test_swap1') def swap(pool_id: int, token_from: str, token_to: str, amount: float, max_slippage: float=10): pool = __pools[pool_id] assert token_from in [token['contract'] for token in pool['tokens'] ], 'Invalid token_from' assert token_to in [token['contract'] for token in pool['tokens'] ], 'Invalid token_to' assert amount > 0, 'Amount must be greater than 0' assert max_slippage > 0, 'Max slippage must be greater than 0' assert max_slippage < 50, 'Max slippage must be less than 50' token_from_index = None token_to_index = None for i in range(len(pool['tokens'])): if pool['tokens'][i]['contract'] == token_from: token_from_index = i if pool['tokens'][i]['contract'] == token_to: token_to_index = i token_module_from = I.import_module(token_from) token_module_to = I.import_module(token_to) token_amount_from = amount token_amount_to = amount * pool['tokens'][token_to_index]['amount'] / pool[ 'tokens'][token_from_index]['amount'] fee = token_amount_to * pool['fee'] / 100 fee_owner = fee / 5 fee_liquidity_providers = fee - fee_owner token_module_from.transfer_from(amount=token_amount_from, to=ctx.this, main_account=ctx.caller) expected_token_amount_to = token_amount_to - fee_liquidity_providers min_token_amount_to = expected_token_amount_to * (100 - max_slippage) / 100 token_module_to.transfer(amount=token_amount_to - fee_liquidity_providers, to=ctx.caller) __fee_rewards[pool_id, __config['owner']] += fee_owner for account in __lp_points.keys(): if account[0] == pool_id: __fee_rewards[pool_id, account[1] ] += fee_liquidity_providers / pool['total_lp_points' ] * __lp_points[account] return token_amount_to - fee_liquidity_providers @__export('con_test_swap1') def get_pool(pool_id: int): return __pools[pool_id] @__export('con_test_swap1') def get_lp_points(pool_id: int, account: str): return __lp_points[pool_id, account] @__export('con_test_swap1') def get_config(): return __config
 
Contract con_test_swap1
Variable __compiled__
New Value e30000000000000000000000000800000040000000731601000065005a0165016a026400642664038d0265016a026404642764038d0265016a026405642864038d0267035a036504640764086409640a8d035a05650464076408640b640a8d035a06650464076408640c640a8d035a07650464076408640d640a8d035a08640e640f84005a09650a64088301650b650c64109c0264116412840483015a0d650a64088301650e650b64139c0264146415840483015a0f650a64088301650e650c64169c0264176418840483015a10650a640883016429650e65116511650c650c641a9c05641b641c840583015a12650a64088301650e641d9c01641e641f840483015a13650a64088301650e651164209c0264216422840483015a14650a6408830164236424840083015a1564255300292ada087472616e73666572da06616d6f756e74da02746f2901da0461726773da07617070726f7665da0d7472616e736665725f66726f6dda0c6d61696e5f6163636f756e74e900000000da0e636f6e5f746573745f7377617031da05706f6f6c732903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da096c705f706f696e7473da06636f6e666967da0b6665655f72657761726473630000000000000000000000000300000043000000730e00000074006a01740264013c006400530029024eda056f776e65722903da03637478da0663616c6c6572da085f5f636f6e666967a90072150000007215000000da00da045f5f5f5f0d0000007302000000000172170000002902da06746f6b656e73da0366656563020000000000000007000000060000004300000073c400000074007c00830164016b0273147401640283018201786a740274007c008301830144005d5a7d027c007c0219007d0374036a047c036403190083017d0474036a057c0474068302735074016404830182017c036405190064066b04736474016407830182017c046a077c036405190074086a0974086a0a64088d030100712257007400740b83017d057c0064097c017c0064061900640519007c00640a1900640519001b00640b9c047d067c06740b7c053c006409740c7c0574086a0a66023c007c055300290c4ee9020000007a23596f75206e65656420746f2068617665203220746f6b656e7320696e206120706f6f6c720c0000007a18496e76616c696420746f6b656e20696e7465726661636521720200000072080000007a1d416d6f756e74206d7573742062652067726561746572207468616e20302903720200000072030000007207000000e964000000e90100000029047218000000da0f746f74616c5f6c705f706f696e74737219000000da057072696365290dda036c656eda0e417373657274696f6e4572726f72da0572616e6765da0149da0d696d706f72745f6d6f64756c65da11656e666f7263655f696e74657266616365da0f746f6b656e5f696e7465726661636572060000007212000000da04746869737213000000da075f5f706f6f6c73da0b5f5f6c705f706f696e7473290772180000007219000000da0169da05746f6b656eda0c746f6b656e5f6d6f64756c65da07706f6f6c5f6964da04706f6f6c721500000072150000007216000000da0b6372656174655f706f6f6c11000000731e00000000021401120108010e010e01060114010e010e01080106011c0108010e01722e0000002902722c0000007218000000630200000000000000060000000600000043000000735a01000074007c0019007d0274017c01830164016b02731c74026402830182017892740374017c018301830144005d827d037c017c0319007d047c02640319007c031900640419007c04640419006b02735674026405830182017c046406190064076b04736a740264088301820174046a057c046404190083017d057c056a067c046406190074076a0874076a0964098d0301007c02640319007c0319006406050019007c0464061900370003003c00712a57007c02640a050019007c0164071900640619007c02640b19001b007c02640a190014007c026403190064071900640619001b00370003003c00740a7c0074076a096602050019007c0164071900640619007c02640b19001b007c02640a190014007c026403190064071900640619001b00370003003c007c0274007c003c007c0164071900640619007c02640b19001b007c02640a190014007c026403190064071900640619001b005300290c4e721a0000007a23596f75206e65656420746f2068617665203220746f6b656e7320696e206120706f6f6c7218000000720c0000007a16496e76616c696420746f6b656e20636f6e7472616374720200000072080000007a1d416d6f756e74206d7573742062652067726561746572207468616e20302903720200000072030000007207000000721d000000721e000000290b7227000000721f0000007220000000722100000072220000007223000000720600000072120000007226000000721300000072280000002906722c0000007218000000722d0000007229000000722a000000722b000000721500000072150000007216000000da0d6164645f6c6971756964697479240000007322000000000208011401120108011a01060114010e010e010a012001080130010e0130010802722f0000002902722c000000720200000063020000000000000006000000070000004300000073c600000074007c0019007d027c0164016b047318740164028301820174027c0074036a046602050019007c01380003003c007c026403050019007c01380003003c00787a740574067c02640419008301830144005d667d037c02640419007c0319007d0474076a087c046405190083017d057c056a097c017c046406190014007c02640319001b0074036a0464078d0201007c02640419007c0319006406050019007c017c046406190014007c02640319001b00380003003c00715057007c0274007c003c007c01530029084e72080000007a1d416d6f756e74206d7573742062652067726561746572207468616e2030721d0000007218000000720c0000007202000000290272020000007203000000290a722700000072200000007228000000721200000072130000007221000000721f0000007222000000722300000072010000002906722c0000007202000000722d0000007229000000722a000000722b000000721500000072150000007216000000da1072656d6f76655f6c69717569646974793a000000731a0000000002080110011601100116010c010e01100110011c01100108017230000000e90a0000002905722c000000da0a746f6b656e5f66726f6dda08746f6b656e5f746f7202000000da0c6d61785f736c69707061676563050000000000000013000000070000004300000073cc01000074007c0019007d057c016401640284007c0564031900440083016b06732674016404830182017c026405640284007c0564031900440083016b06734474016406830182017c0364076b04735474016408830182017c0464076b04736474016409830182017c04640a6b0073747401640b8301820164007d0664007d077848740274037c05640319008301830144005d347d087c05640319007c081900640c19007c016b0272aa7c087d067c05640319007c081900640c19007c026b02728e7c087d07718e570074046a057c0183017d0974046a057c0283017d0a7c037d0b7c037c05640319007c071900640d190014007c05640319007c061900640d19001b007d0c7c0c7c05640e19001400640f1b007d0d7c0d64101b007d0e7c0d7c0e18007d0f7c096a067c0b74076a0874076a0964118d0301007c0c7c0f18007d107c10640f7c0418001400640f1b007d117c0a6a0a7c0c7c0f180074076a0964128d020100740b7c00740c641319006602050019007c0e370003003c007848740d6a0e830044005d3c7d127c12640719007c006b0290017284740b7c007c12641419006602050019007c0f7c05641519001b00740d7c1219001400370003003c009001718457007c0c7c0f1800530029164e630100000000000000020000000400000053000000731400000067007c005d0c7d017c01640019009102710453002901720c00000072150000002902da022e30722a000000721500000072150000007216000000fa0a3c6c697374636f6d703e4f000000730200000006007a18737761702e3c6c6f63616c733e2e3c6c697374636f6d703e72180000007a12496e76616c696420746f6b656e5f66726f6d630100000000000000020000000400000053000000731400000067007c005d0c7d017c01640019009102710453002901720c000000721500000029027235000000722a000000721500000072150000007216000000723600000051000000730200000006007a10496e76616c696420746f6b656e5f746f72080000007a1d416d6f756e74206d7573742062652067726561746572207468616e20307a234d617820736c697070616765206d7573742062652067726561746572207468616e2030e9320000007a214d617820736c697070616765206d757374206265206c657373207468616e203530720c00000072020000007219000000721b000000e90500000029037202000000720300000072070000002902720200000072030000007211000000721c000000721d000000290f722700000072200000007221000000721f0000007222000000722300000072060000007212000000722600000072130000007201000000da0d5f5f6665655f7265776172647372140000007228000000da046b6579732913722c0000007232000000723300000072020000007234000000722d000000da10746f6b656e5f66726f6d5f696e646578da0e746f6b656e5f746f5f696e6465787229000000da11746f6b656e5f6d6f64756c655f66726f6dda0f746f6b656e5f6d6f64756c655f746fda11746f6b656e5f616d6f756e745f66726f6dda0f746f6b656e5f616d6f756e745f746f7219000000da096665655f6f776e6572da176665655f6c69717569646974795f70726f766964657273da1865787065637465645f746f6b656e5f616d6f756e745f746fda136d696e5f746f6b656e5f616d6f756e745f746fda076163636f756e74721500000072150000007216000000da04737761704b000000734600000000030801180106011801060110011001100104010401160114010401140108010a010a010401140110011001080108010a010a010801100106010e0118010e010e0110021e0172460000002901722c000000630100000000000000010000000200000043000000730800000074007c001900530029014e290172270000002901722c000000721500000072150000007216000000da086765745f706f6f6c740000007302000000000272470000002902722c0000007245000000630200000000000000020000000300000043000000730c00000074007c007c0166021900530029014e290172280000002902722c0000007245000000721500000072150000007216000000da0d6765745f6c705f706f696e74737900000073020000000002724800000063000000000000000000000000010000004300000073040000007400530029014e290172140000007215000000721500000072150000007216000000da0a6765745f636f6e6669677e0000007302000000000272490000004e2902720200000072030000002902720200000072030000002903720200000072030000007207000000290172310000002916da09696d706f72746c69627222000000da0446756e637225000000da044861736872270000007228000000721400000072390000007217000000da085f5f6578706f7274da046c697374da05666c6f6174722e000000da03696e74722f0000007230000000da0373747272460000007247000000724800000072490000007215000000721500000072150000007216000000da083c6d6f64756c653e01000000732c000000040110010e010a010e010e020e0106010803080406011212060112150601121006021a270601100406011204
 
Contract con_test_swap1
Variable __developer__
New Value c674a8a398fb81765277f77fc11464496dae94632de18eea1d69bf0c7894ad03
 
Contract con_test_swap1
Variable __owner__
New Value null
 
Contract con_test_swap1
Variable __submitted__
New Value 2023,8,20,8,31,59,0
 
Contract con_test_swap1
Variable config
Key owner
New Value c674a8a398fb81765277f77fc11464496dae94632de18eea1d69bf0c7894ad03
 
Contract currency
Variable balances
Key c674a8a398fb81765277f77fc11464496dae94632de18eea1d69bf0c7894ad03
New Value 972.7568836282840236214792899407