Skip to content

Commit

Permalink
update nft and ft adds params
Browse files Browse the repository at this point in the history
  • Loading branch information
jj committed Jul 26, 2024
1 parent 84e0293 commit c2b3626
Show file tree
Hide file tree
Showing 25 changed files with 95 additions and 92 deletions.
4 changes: 3 additions & 1 deletion bitcointx/core/atomicalsconsensus.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,9 @@ def ConsensusVerifyScriptAvmExecute(script_context: ScriptContext,
bytes(ft_balances_result)[:ft_balances_result_len.value],
bytes(ft_balances_updates)[:ft_balances_updates_len.value],
bytes(nft_withdraws)[:nft_withdraws_len.value],
bytes(ft_withdraws)[:ft_withdraws_len.value])
bytes(ft_withdraws)[:ft_withdraws_len.value],
bytes(ft_adds)[:ft_adds_len.value],
bytes(nft_puts)[:nft_puts_len.value])
return updated_reactor_context

assert execute_result == 0
Expand Down
3 changes: 1 addition & 2 deletions electrumx/lib/avm/avm.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,7 @@ def execute(self):

# Null dummy cbor context is not actually used by consensus library, but we pass in dummy data
script_context = ScriptContext(CScript(self.unlock_script), CScript(self.lock_script))
# reactor_context_null = ReactorContext(None, dumps({}), dumps({}), dumps({}))


# Sanity check that the reactor context has the defaults, the only values allowed to be set are the nft_incoming and ft_incoming
assert self.reactor_state.state_hash == bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
# Ensure the datas are empty because they will be set later
Expand Down
4 changes: 3 additions & 1 deletion electrumx/lib/avm/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ def __init__(self, unlock, lock):
self.lock_script = lock

class ReactorContext:
def __init__(self, state_hash, state, state_updates, state_deletes, nft_incoming, ft_incoming, nft_balances, nft_balances_updates, ft_balances, ft_balances_updates, nft_withdraws, ft_withdraws):
def __init__(self, state_hash, state, state_updates, state_deletes, nft_incoming, ft_incoming, nft_balances, nft_balances_updates, ft_balances, ft_balances_updates, nft_withdraws, ft_withdraws, ft_adds, nft_puts):
if state_hash == None:
self.state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
else:
Expand All @@ -310,6 +310,8 @@ def __init__(self, state_hash, state, state_updates, state_deletes, nft_incoming
self.nft_balances_updates = nft_balances_updates
self.ft_withdraws = ft_withdraws
self.nft_withdraws = nft_withdraws
self.ft_adds = ft_adds
self.nft_puts = nft_puts

class RequestBlockchainContext:
def __init__(self, headers, current_height):
Expand Down
2 changes: 1 addition & 1 deletion electrumx/server/block_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -1236,7 +1236,7 @@ def create_or_delete_contract_entry_if_requested(self, protocol_atomical_id, min
# Note atomicals_spent_at_inputs can be modified if the contract absorbs the tokens
nft_incoming, ft_incoming = avm_factory.create_token_incoming_structs(atomicals_spent_at_inputs)
# Create the initial new reactor context which has no state_hash, no state and only optionally nft_incoming and ft_incomin
new_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps(nft_incoming), dumps(ft_incoming), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
new_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps(nft_incoming), dumps(ft_incoming), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))

# We have everything we need to validate an execute call
deploy_command = avm_factory.create_deploy_command(request_tx_context, atomicals_spent_at_inputs, new_reactor_context)
Expand Down
2 changes: 1 addition & 1 deletion tests/lib/test_atomicalsconsensus_OP_DECODEBLOCKINFO.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def mock_mint_fetcher(atomical_id):
mock_blockchain_context = RequestBlockchainContext(mock_headers, 840012)
mock_rawtx = bytes.fromhex('02000000018e469f953413e8d865fcf1f47d759772aa05e8d78b1e4577a58edc8bd09344ff010000006b483045022100ce16646785907c919a1658496a85cf3f3d877d98ffca5eabd189524acc1de53b02205ac24a9e2855db3da26b840c82fddaf73a5a6eff4b5b78cadfb00584ad6bd5f3012102cbcad7b21fb5fb08ad55eb09e327b97f63e8c5e99b2faf9bb330545a5bd4602cfeffffff0203761700000000001976a91496d02c013f734a642871261324c58091a806c23188ac9ce52300000000001976a914a9a8d5aa3ec73688d0540d45be3842f4603705c588ac6e640800')
mock_tx, mock_tx_hash = coin.DESERIALIZER(mock_rawtx, 0).read_tx_and_hash()
mock_empty_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
mock_empty_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))

def test_atomicalsconsensus_OP_DECODEBLOCKINFO_fail_header_size():
mock_current_header_wrong_len = bytes.fromhex(mock_current_header) + b'01'
Expand Down
10 changes: 5 additions & 5 deletions tests/lib/test_atomicalsconsensus_OP_FT_BALANCE.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def warning(self, msg):
mock_blockchain_context = RequestBlockchainContext(mock_headers, 840012)
mock_rawtx = bytes.fromhex('02000000018e469f953413e8d865fcf1f47d759772aa05e8d78b1e4577a58edc8bd09344ff010000006b483045022100ce16646785907c919a1658496a85cf3f3d877d98ffca5eabd189524acc1de53b02205ac24a9e2855db3da26b840c82fddaf73a5a6eff4b5b78cadfb00584ad6bd5f3012102cbcad7b21fb5fb08ad55eb09e327b97f63e8c5e99b2faf9bb330545a5bd4602cfeffffff0203761700000000001976a91496d02c013f734a642871261324c58091a806c23188ac9ce52300000000001976a914a9a8d5aa3ec73688d0540d45be3842f4603705c588ac6e640800')
mock_tx, mock_tx_hash = coin.DESERIALIZER(mock_rawtx, 0).read_tx_and_hash()
mock_empty_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
mock_empty_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))

def test_atomicalsconsensus_OP_FT_BALANCE_empty_success_zero1():
payload = {}
Expand All @@ -55,7 +55,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_empty_success_zero1():
sample_token_id1_encoded = encode_op_pushdata(sample_token_id1_bytes)
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id1_encoded.hex() + '00f40087')))
updated_reactor_state = ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand All @@ -69,7 +69,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_non_zero1():
sample_token_id1_encoded = encode_op_pushdata(sample_token_id1_bytes)
balances[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
payload = {}
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
Expand All @@ -85,7 +85,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_incoming_empty_success_zero1():
sample_token_id1_encoded = encode_op_pushdata(sample_token_id1_bytes)
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id1_encoded.hex() + '00f40087')))
updated_reactor_state = ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand All @@ -99,7 +99,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_incoming_non_zero2():
sample_token_id1_encoded = encode_op_pushdata(sample_token_id1_bytes)
balances[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
payload = {}
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
Expand Down
14 changes: 7 additions & 7 deletions tests/lib/test_atomicalsconsensus_OP_FT_BALANCE_ADD.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def warning(self, msg):
mock_blockchain_context = RequestBlockchainContext(mock_headers, 840012)
mock_rawtx = bytes.fromhex('02000000018e469f953413e8d865fcf1f47d759772aa05e8d78b1e4577a58edc8bd09344ff010000006b483045022100ce16646785907c919a1658496a85cf3f3d877d98ffca5eabd189524acc1de53b02205ac24a9e2855db3da26b840c82fddaf73a5a6eff4b5b78cadfb00584ad6bd5f3012102cbcad7b21fb5fb08ad55eb09e327b97f63e8c5e99b2faf9bb330545a5bd4602cfeffffff0203761700000000001976a91496d02c013f734a642871261324c58091a806c23188ac9ce52300000000001976a914a9a8d5aa3ec73688d0540d45be3842f4603705c588ac6e640800')
mock_tx, mock_tx_hash = coin.DESERIALIZER(mock_rawtx, 0).read_tx_and_hash()
mock_empty_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
mock_empty_reactor_context = ReactorContext(None, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))

def test_atomicalsconsensus_OP_FT_BALANCE_ADD_zero_amount_fail():
with pytest.raises(AtomicalConsensusExecutionError) as exc:
Expand All @@ -62,7 +62,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_ADD_zero_amount_fail():
balances[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id2_encoded.hex() + 'd3')))
updated_reactor_state = ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand All @@ -86,7 +86,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_ADD_no_incoming_available_fail():
balances[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id2_encoded.hex() + 'd3')))
updated_reactor_state = ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand All @@ -112,7 +112,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_ADD_incoming_insufficient_fail():
balances_incoming[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id2_encoded.hex() + 'd3')))
updated_reactor_state = ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand All @@ -137,7 +137,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_ADD_incoming_new_success():
balances_incoming[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id1_encoded.hex() + 'd351')))
updated_reactor_state = ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand Down Expand Up @@ -182,7 +182,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_ADD_incoming_max_int_test():
balances_incoming[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id1_encoded.hex() + 'd351')))
updated_reactor_state = ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand Down Expand Up @@ -223,7 +223,7 @@ def test_atomicalsconsensus_OP_FT_BALANCE_ADD_incoming_multiple_adds_fail():
balances_incoming[sample_token_id1] = 1
state_hash = bytes.fromhex('0000000000000000000000000000000000000000000000000000000000000000')
request_tx_context = RequestTxContext(coin, mock_tx_hash, mock_tx, payload)
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}))
reactor_context = ReactorContext(state_hash, dumps({}), dumps({}), dumps({}), dumps({}), dumps(balances_incoming), dumps({}), dumps({}), dumps(balances), dumps({}), dumps({}), dumps({}), dumps({}), dumps({}))
blockchain_context = RequestBlockchainContext(mock_headers, 840012)
script_context = ScriptContext(CScript(), CScript(bytes.fromhex(sample_token_id1_encoded.hex() + 'd3' + sample_token_id1_encoded.hex() + 'd3')))
ConsensusVerifyScriptAvmExecute(script_context, blockchain_context, request_tx_context, reactor_context)
Expand Down
Loading

0 comments on commit c2b3626

Please sign in to comment.