Finance (Transactions)
transfer()¶
Transfers an amount from one account to another securely under encryption.
This cell verifies the transfer function mathematically against its cleartext counterpart, using a dynamically generated input set that covers positive, negative, zero, and array edge cases while respecting the [-7, 7] FHE RAM constraints.
In [ ]:
Copied!
from concrete import fhe
from concrete_fhe_toolkit.finance.transactions import transfer
def test_transfer(sender_balance, receiver_balance, amount):
import numpy as np
res = transfer(sender_balance, receiver_balance, amount)
return fhe.array(res) if isinstance(res, list) else res
compiler = fhe.Compiler(test_transfer, {'sender_balance': 'encrypted', 'receiver_balance': 'encrypted', 'amount': 'encrypted'})
inputset = [(3, 2, 1), (-2, -2, 3), (0, 0, 0), (2, -2, 2), (10, 5, -2)]
circuit = compiler.compile(inputset)
_successes = 0
for inp in inputset:
try:
expected = transfer(inp[0], inp[1], inp[2])
import numpy as np
if isinstance(expected, (list, tuple)) or type(expected).__name__ == 'ndarray':
np.testing.assert_array_equal(circuit.encrypt_run_decrypt(*inp), expected)
else:
assert int(circuit.encrypt_run_decrypt(*inp)) == int(expected), f"Failed at {inp}"
except AssertionError:
raise
except Exception as e:
print(f"Skipping {inp} due to bounds or other error: {e}")
else:
_successes += 1
assert _successes > 0, "transfer: all inputs were skipped — test is broken"
print(f"transfer tests passed! ({_successes}/{len(inputset)})")
from concrete import fhe
from concrete_fhe_toolkit.finance.transactions import transfer
def test_transfer(sender_balance, receiver_balance, amount):
import numpy as np
res = transfer(sender_balance, receiver_balance, amount)
return fhe.array(res) if isinstance(res, list) else res
compiler = fhe.Compiler(test_transfer, {'sender_balance': 'encrypted', 'receiver_balance': 'encrypted', 'amount': 'encrypted'})
inputset = [(3, 2, 1), (-2, -2, 3), (0, 0, 0), (2, -2, 2), (10, 5, -2)]
circuit = compiler.compile(inputset)
_successes = 0
for inp in inputset:
try:
expected = transfer(inp[0], inp[1], inp[2])
import numpy as np
if isinstance(expected, (list, tuple)) or type(expected).__name__ == 'ndarray':
np.testing.assert_array_equal(circuit.encrypt_run_decrypt(*inp), expected)
else:
assert int(circuit.encrypt_run_decrypt(*inp)) == int(expected), f"Failed at {inp}"
except AssertionError:
raise
except Exception as e:
print(f"Skipping {inp} due to bounds or other error: {e}")
else:
_successes += 1
assert _successes > 0, "transfer: all inputs were skipped — test is broken"
print(f"transfer tests passed! ({_successes}/{len(inputset)})")