101 lines
3.0 KiB
Python
101 lines
3.0 KiB
Python
import sys
|
|
import time
|
|
import json
|
|
import logging
|
|
import binascii
|
|
from testsupport import *
|
|
|
|
|
|
@fanout_input(0)
|
|
def test_basic_spend(inp):
|
|
spend0 = {
|
|
'inputs': [inp],
|
|
"outputs": [
|
|
{"amount": 500, "script": {"condition": cond_alice}},
|
|
{"amount": 500, "script": {"address": notary_addr}}
|
|
]
|
|
}
|
|
spend0_txid = submit(sign(spend0))
|
|
spend1 = {
|
|
'inputs': [
|
|
{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}},
|
|
{'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}}
|
|
],
|
|
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
|
}
|
|
spend1_txid = submit(sign(spend1))
|
|
assert rpc.getrawtransaction(spend1_txid)
|
|
|
|
|
|
@fanout_input(1)
|
|
def test_fulfillment_wrong_signature(inp):
|
|
spend0 = {
|
|
'inputs': [inp],
|
|
"outputs": [{"amount": 1000, "script": {"condition": cond_bob}}]
|
|
}
|
|
spend0_txid = submit(sign(spend0))
|
|
spend1 = {
|
|
'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}],
|
|
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
|
}
|
|
|
|
signed = sign(spend1)
|
|
# Set the correct pubkey, signature is wrong
|
|
signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk
|
|
|
|
try:
|
|
assert not submit(sign(spend1)), 'should raise an error'
|
|
except RPCError as e:
|
|
assert '16: mandatory-script-verify-flag-failed' in str(e), str(e)
|
|
|
|
|
|
@fanout_input(2)
|
|
def test_fulfillment_wrong_pubkey(inp):
|
|
spend0 = {
|
|
'inputs': [inp],
|
|
"outputs": [{"amount": 1000, "script": {"condition": cond_alice}}]
|
|
}
|
|
spend0_txid = submit(sign(spend0))
|
|
spend1 = {
|
|
'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}],
|
|
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
|
}
|
|
|
|
signed = sign(spend1)
|
|
# Set the wrong pubkey, signature is correct
|
|
signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk
|
|
|
|
try:
|
|
assert not submit(signed), 'should raise an error'
|
|
except RPCError as e:
|
|
assert '16: mandatory-script-verify-flag-failed' in str(e), str(e)
|
|
|
|
|
|
@fanout_input(3)
|
|
def test_fulfillment_invalid_fulfillment(inp):
|
|
spend0 = {
|
|
'inputs': [inp],
|
|
"outputs": [{"amount": 1000, "script": {"condition": cond_alice}}]
|
|
}
|
|
spend0_txid = submit(sign(spend0))
|
|
|
|
# Create a valid script with an invalid fulfillment payload
|
|
script = binascii.hexlify(b"\007invalid").decode('utf-8')
|
|
|
|
spend1 = {
|
|
'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': script}],
|
|
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
|
}
|
|
|
|
try:
|
|
assert not submit({'tx': spend1}), 'should raise an error'
|
|
except RPCError as e:
|
|
assert 'Crypto-Condition payload is invalid' in str(e), str(e)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
for name, f in globals().items():
|
|
if name.startswith('test_'):
|
|
logging.info("Running test: %s" % name)
|
|
f()
|