Created
August 5, 2026 22:12
-
-
Save Dustin4444/8237147358bd653f861f0376d82619d5 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.34+commit.80d5c536.js&optimize=true&runs=200&gist=
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import pytest | |
| from eth_utils import to_wei | |
| def test_private_test(get_contract): | |
| private_test_code = """ | |
| @internal | |
| def a() -> int128: | |
| return 5 | |
| @external | |
| def returnten() -> int128: | |
| return self.a() * 2 | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.returnten() == 10 | |
| def test_private_with_more_vars(get_contract): | |
| private_test_code = """ | |
| @internal | |
| def afunc() -> int128: | |
| a: int128 = 4 | |
| b: int128 = 40 | |
| c: int128 = 400 | |
| return a + b + c | |
| @external | |
| def return_it() -> int128: | |
| a: int128 = 111 | |
| b: int128 = 222 | |
| c: int128 = self.afunc() | |
| assert a == 111 | |
| assert b == 222 | |
| assert c == 444 | |
| return a + b + c | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.return_it() == 777 | |
| def test_private_with_more_vars_nested(get_contract): | |
| private_test_code = """ | |
| @internal | |
| def more() -> int128: | |
| a: int128 = 50 | |
| b: int128 = 50 | |
| c: int128 = 11 | |
| return a + b + c | |
| @internal | |
| def afunc() -> int128: | |
| a: int128 = 444 | |
| a += self.more() | |
| assert a == 555 | |
| return a + self.more() | |
| @external | |
| def return_it() -> int128: | |
| a: int128 = 222 | |
| b: int128 = 111 | |
| c: int128 = self.afunc() | |
| assert a == 222 | |
| assert b == 111 | |
| return a + b + c | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.return_it() == 999 | |
| def test_private_with_args(get_contract): | |
| private_test_code = """ | |
| @internal | |
| def add_times2(a: uint256, b: uint256) -> uint256: | |
| assert a == 100 | |
| assert b == 11 | |
| return 2 * (a + b) | |
| @external | |
| def return_it() -> uint256: | |
| a: uint256 = 111 | |
| b: uint256 = 222 | |
| c: uint256 = self.add_times2(100, 11) | |
| return a + b + c | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.return_it() == 555 | |
| def test_private_with_args_nested(get_contract): | |
| private_test_code = """ | |
| @internal | |
| def multiply(a: uint256, b: uint256) -> uint256: | |
| c: uint256 = 7 | |
| d: uint256 = 8 | |
| e: uint256 = 9 | |
| return a * b | |
| @internal | |
| def add_times2(a: uint256, b: uint256) -> uint256: | |
| return self.multiply(3, (a + b)) | |
| @external | |
| def return_it() -> uint256: | |
| a: uint256 = 111 | |
| b: uint256 = 222 | |
| c: uint256 = self.add_times2(0, a) | |
| return a + b + c | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.return_it() == 666 | |
| def test_private_bytes(get_contract): | |
| private_test_code = """ | |
| greeting: public(Bytes[100]) | |
| @deploy | |
| def __init__(): | |
| self.greeting = b"Hello " | |
| @internal | |
| def construct(greet: Bytes[100]) -> Bytes[200]: | |
| return concat(self.greeting, greet) | |
| @external | |
| def hithere(name: Bytes[100]) -> Bytes[200]: | |
| d: Bytes[200] = self.construct(name) | |
| return d | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.hithere(b"bob") == b"Hello bob" | |
| assert c.hithere(b"alice") == b"Hello alice" | |
| def test_private_statement(get_contract): | |
| private_test_code = """ | |
| greeting: public(Bytes[20]) | |
| @deploy | |
| def __init__(): | |
| self.greeting = b"Hello " | |
| @internal | |
| def set_greeting(_greeting: Bytes[20]): | |
| a: uint256 = 332 | |
| b: uint256 = 333 | |
| c: uint256 = 334 | |
| d: uint256 = 335 | |
| if a + b + c + d + 3 == 1337: | |
| self.greeting = _greeting | |
| @internal | |
| @view | |
| def construct(greet: Bytes[20]) -> Bytes[40]: | |
| return concat(self.greeting, greet) | |
| @external | |
| def iprefer(_greeting: Bytes[20]): | |
| a: uint256 = 112 | |
| b: uint256 = 211 | |
| self.set_greeting(_greeting) | |
| assert a == 112 | |
| assert b == 211 | |
| @external | |
| def hithere(name: Bytes[20]) -> Bytes[40]: | |
| d: Bytes[40] = self.construct(name) | |
| return d | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.greeting() == b"Hello " | |
| assert c.hithere(b"Bob") == b"Hello Bob" | |
| c.iprefer(b"Hi there, ") | |
| assert c.hithere(b"Alice") == b"Hi there, Alice" | |
| def test_private_default_parameter(get_contract): | |
| private_test_code = """ | |
| @internal | |
| def addition(a: uint256, b: uint256 = 1) -> uint256: | |
| return a + b | |
| @external | |
| def add_one(a: uint256) -> uint256: | |
| return self.addition(a) | |
| @external | |
| def added(a: uint256, b: uint256) -> uint256: | |
| a_before: uint256 = a | |
| b_before: uint256 = b | |
| c: int128 = 333 | |
| d: uint256 = self.addition(a, b) | |
| assert c == 333 | |
| assert a_before == a | |
| assert b_before == b | |
| return d | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.add_one(20) == 21 | |
| assert c.added(10, 20) == 30 | |
| def test_private_return_bytes(get_contract): | |
| code = """ | |
| a_message: Bytes[50] | |
| @internal | |
| def _test() -> (Bytes[100]): | |
| b: Bytes[50] = b"hello 1 2" | |
| return b | |
| @internal | |
| def _test_b(a: Bytes[100]) -> (Bytes[100]): | |
| b: Bytes[50] = b"hello there" | |
| if len(a) > 1: | |
| return a | |
| else: | |
| return b | |
| @internal | |
| def get_msg() -> (Bytes[100]): | |
| return self.a_message | |
| @external | |
| def test() -> (Bytes[100]): | |
| d: Bytes[100] = b"" | |
| d = self._test() | |
| return d | |
| @external | |
| def test2() -> (Bytes[100]): | |
| d: Bytes[100] = b'xyzxyzxyzxyz' | |
| return self._test() | |
| @external | |
| def test3(a: Bytes[50]) -> (Bytes[100]): | |
| d: Bytes[100] = b'xyzxyzxyzxyz' | |
| return self._test_b(a) | |
| @external | |
| def set(a: Bytes[50]): | |
| self.a_message = a | |
| @external | |
| def test4() -> (Bytes[100]): | |
| d: Bytes[100] = b'xyzxyzxyzxyz' | |
| return self.get_msg() | |
| """ | |
| c = get_contract(code) | |
| test_str = b" 1 2" | |
| assert c.test() == b"hello" + test_str | |
| assert c.test2() == b"hello" + test_str | |
| assert c.test3(b"alice") == b"alice" | |
| c.set(b"hello daar") | |
| assert c.test4() == b"hello daar" | |
| def test_private_bytes_as_args(get_contract): | |
| code = """ | |
| @internal | |
| def _test(a: Bytes[40]) -> (Bytes[100]): | |
| b: Bytes[40] = b"hello " | |
| return concat(b, a) | |
| @external | |
| def test(a: Bytes[10]) -> Bytes[100]: | |
| b: Bytes[40] = concat(a, b", jack attack") | |
| out: Bytes[100] = self._test(b) | |
| return out | |
| @external | |
| def test2() -> Bytes[100]: | |
| c: Bytes[10] = b"alice" | |
| return self._test(c) | |
| """ | |
| c = get_contract(code) | |
| assert c.test(b"bob") == b"hello bob, jack attack" | |
| assert c.test2() == b"hello alice" | |
| def test_private_return_tuple_base_types(get_contract): | |
| code = """ | |
| @internal | |
| def _test(a: bytes32) -> (bytes32, uint256, int128): | |
| b: uint256 = 1000 | |
| return a, b, -1200 | |
| @external | |
| def test(a: bytes32) -> (bytes32, uint256, int128): | |
| b: uint256 = 1 | |
| c: int128 = 1 | |
| d: int128 = 123 | |
| f: bytes32 = empty(bytes32) | |
| f, b, c = self._test(a) | |
| assert d == 123 | |
| return f, b, c | |
| @external | |
| def test2(a: bytes32) -> (bytes32, uint256, int128): | |
| return self._test(a) | |
| """ | |
| c = get_contract(code) | |
| assert c.test(b"test" + b"\x00" * 28) == (b"test" + 28 * b"\x00", 1000, -1200) | |
| assert c.test2(b"test" + b"\x00" * 28) == (b"test" + 28 * b"\x00", 1000, -1200) | |
| def test_private_return_tuple_bytes(get_contract): | |
| code = """ | |
| @internal | |
| def _test(a: int128, b: Bytes[50]) -> (int128, Bytes[100]): | |
| return a + 2, concat(b"badabing:", b) | |
| @internal | |
| def _test_combined(a: Bytes[50], x: int128, c:Bytes[50]) -> (int128, Bytes[100], Bytes[100]): | |
| assert x == 8 | |
| return x + 2, a, concat(c, b'_two') | |
| @external | |
| def test(a: int128, b: Bytes[40]) -> (int128, Bytes[100], Bytes[50]): | |
| c: int128 = 1 | |
| x: Bytes[50] = concat(b, b"_one") | |
| d: Bytes[100] = b"" | |
| c, d = self._test(a + c, x) | |
| return c, d, x | |
| @external | |
| def test2(b: Bytes[40]) -> (int128, Bytes[100]): | |
| a: int128 = 4 | |
| x: Bytes[50] = concat(b, b"_one") | |
| d: Bytes[100] = b"" | |
| return self._test(a, x) | |
| @external | |
| def test3(a: Bytes[32]) -> (int128, Bytes[100], Bytes[100]): | |
| q: Bytes[100] = b"random data1" | |
| w: Bytes[100] = b"random data2" | |
| x: int128 = 8 | |
| b: Bytes[32] = a | |
| x, q, w = self._test_combined(a, x, b) | |
| return x, q, w | |
| @external | |
| def test4(a: Bytes[40]) -> (int128, Bytes[100], Bytes[100]): | |
| b: Bytes[50] = concat(a, b"_one") | |
| return self._test_combined(a, 8, b) | |
| """ | |
| c = get_contract(code) | |
| assert c.test(11, b"jill") == (14, b"badabing:jill_one", b"jill_one") | |
| assert c.test2(b"jack") == (6, b"badabing:jack_one") | |
| assert c.test3(b"hill") == (10, b"hill", b"hill_two") | |
| assert c.test4(b"bucket") == (10, b"bucket", b"bucket_one_two") | |
| def test_private_return_list_types(get_contract): | |
| code = """ | |
| @internal | |
| def _test(b: int128[4]) -> int128[4]: | |
| assert b[1] == 2 | |
| assert b[2] == 3 | |
| assert b[3] == 4 | |
| return [0, 1, 0, 1] | |
| @external | |
| def test() -> int128[4]: | |
| b: int128[4] = [1, 2, 3, 4] | |
| c: int128[2] = [11, 22] | |
| return self._test(b) | |
| """ | |
| c = get_contract(code) | |
| assert c.test() == [0, 1, 0, 1] | |
| def test_private_payable(env, get_contract): | |
| code = """ | |
| @internal | |
| def _send_it(a: address, _value: uint256): | |
| send(a, _value) | |
| @payable | |
| @external | |
| def test(doit: bool, a: address, _value: uint256): | |
| self._send_it(a, _value) | |
| @external | |
| @payable | |
| def __default__(): | |
| pass | |
| """ | |
| c = get_contract(code) | |
| env.set_balance(env.deployer, to_wei(1, "ether")) | |
| env.message_call(c.address, value=to_wei(1, "ether")) | |
| assert env.get_balance(c.address) == to_wei(1, "ether") | |
| a3 = env.accounts[2] | |
| env.set_balance(a3, to_wei(1000000, "ether")) | |
| c.test(True, a3, to_wei(0.05, "ether")) | |
| assert env.get_balance(a3) == to_wei(1000000.05, "ether") | |
| assert env.get_balance(c.address) == to_wei(0.95, "ether") | |
| def test_private_msg_sender(get_contract, env, get_logs): | |
| code = """ | |
| event Addr: | |
| addr: address | |
| @internal | |
| @view | |
| def _whoami() -> address: | |
| return msg.sender | |
| @external | |
| @view | |
| def i_am_me() -> bool: | |
| return msg.sender == self._whoami() | |
| @external | |
| @nonpayable | |
| def whoami() -> address: | |
| log Addr(self._whoami()) | |
| return self._whoami() | |
| """ | |
| c = get_contract(code) | |
| assert c.i_am_me() | |
| addr = env.accounts[1] | |
| c.whoami(sender=addr) | |
| (log,) = get_logs(c) | |
| assert log.args.addr == addr | |
| def test_nested_static_params_only(get_contract, tx_failed): | |
| code1 = """ | |
| @internal | |
| @view | |
| def c() -> bool: | |
| return True | |
| @internal | |
| @view | |
| def b(sender: address) -> address: | |
| assert self.c() | |
| return sender | |
| @external | |
| def a() -> bool: | |
| assert self.b(msg.sender) == msg.sender | |
| return True | |
| """ | |
| code2 = """ | |
| @internal | |
| @view | |
| def c(sender: address) -> address: | |
| return sender | |
| @internal | |
| @view | |
| def b(sender: address) -> address: | |
| return self.c(sender) | |
| @external | |
| def a() -> bool: | |
| assert self.b(msg.sender) == msg.sender | |
| return True | |
| """ | |
| c1 = get_contract(code1) | |
| c2 = get_contract(code2) | |
| assert c1.a() is True | |
| assert c2.a() is True | |
| def test_private_nested_if_return(get_contract): | |
| code = """ | |
| @internal | |
| def _test(z: int128) -> bool: | |
| y: int128 = 1 | |
| if (z <= 0): | |
| return True | |
| else: | |
| y = 2 | |
| return False | |
| @external | |
| def test(z: int128) -> bool: | |
| return self._test(z) | |
| """ | |
| c = get_contract(code) | |
| assert c.test(-1) is True | |
| assert c.test(0) is True | |
| assert c.test(1) is False | |
| def test_private_call_expr(get_contract): | |
| code = """ | |
| test: public(bool) | |
| @internal | |
| def foo(): | |
| self.test = True | |
| @external | |
| def start(): | |
| if True: | |
| self.foo() | |
| """ | |
| c = get_contract(code) | |
| assert c.test() is False | |
| c.start() | |
| assert c.test() is True | |
| def test_private_array_param(get_contract): | |
| code = """ | |
| @internal | |
| def change_arr(arr: int128[2]): | |
| pass | |
| @external | |
| def call_arr() -> int128: | |
| a: int128[2] = [0, 0] # test with zeroed arg | |
| self.change_arr(a) | |
| return 42 | |
| """ | |
| c = get_contract(code) | |
| assert c.call_arr() == 42 | |
| def test_private_zero_bytearray(get_contract): | |
| private_test_code = """ | |
| @internal | |
| def inner(xs: Bytes[256]): | |
| pass | |
| @external | |
| def outer(xs: Bytes[256] = b"") -> bool: | |
| self.inner(xs) | |
| return True | |
| """ | |
| c = get_contract(private_test_code) | |
| assert c.outer() | |
| tuple_return_sources = [ | |
| ( | |
| """ | |
| @internal | |
| def _test(a: int128) -> (int128, int128): | |
| return a + 2, 2 | |
| @external | |
| def foo(a: int128) -> (int128, int128): | |
| return self._test(a) | |
| """, | |
| (11,), | |
| (13, 2), | |
| ), | |
| ( | |
| """ | |
| struct A: | |
| one: uint8 | |
| @internal | |
| def _foo(_one: uint8) ->A: | |
| return A(one=_one) | |
| @external | |
| def foo() -> A: | |
| return self._foo(1) | |
| """, | |
| (), | |
| (1,), | |
| ), | |
| ( | |
| """ | |
| struct A: | |
| many: uint256[4] | |
| one: uint256 | |
| @internal | |
| def _foo(_many: uint256[4], _one: uint256) -> A: | |
| return A(many=_many, one=_one) | |
| @external | |
| def foo() -> A: | |
| return self._foo([1, 2, 3, 4], 5) | |
| """, | |
| (), | |
| ([1, 2, 3, 4], 5), | |
| ), | |
| ( | |
| """ | |
| struct A: | |
| many: uint256[4] | |
| one: uint256 | |
| @internal | |
| def _foo(_many: uint256[4], _one: uint256) -> A: | |
| return A(many=_many, one=_one) | |
| @external | |
| def foo() -> (uint256[4], uint256): | |
| out: A = self._foo([1, 2, 3, 4], 5) | |
| return out.many, out.one | |
| """, | |
| (), | |
| ([1, 2, 3, 4], 5), | |
| ), | |
| ( | |
| """ | |
| @internal | |
| def _foo() -> (uint256[2], uint256[2]): | |
| return [1, 2], [5, 6] | |
| @external | |
| def foo() -> (uint256[2], uint256[2], uint256[2]): | |
| return self._foo()[0], [3, 4], self._foo()[1] | |
| """, | |
| (), | |
| ([1, 2], [3, 4], [5, 6]), | |
| ), | |
| ( | |
| """ | |
| @internal | |
| def _foo(a: int128, b: int128[3], c: int128[3]) -> (int128[3], int128, int128[3]): | |
| return c, 4, [b[1], a, b[0]] | |
| @external | |
| def foo(a: int128, b: int128[3], c: int128[3]) -> (int128[3], int128, int128[3]): | |
| return self._foo(a, b, c) | |
| """, | |
| (6, [7, 5, 8], [1, 2, 3]), | |
| ([1, 2, 3], 4, [5, 6, 7]), | |
| ), | |
| ( | |
| """ | |
| @internal | |
| def _foo(a: int128, b: int128[3], c: int128[3]) -> (int128[3], int128, int128[3]): | |
| return c, 4, [b[1], a, b[0]] | |
| @external | |
| def foo(a: int128, b: int128[3], c: int128[3]) -> (int128[3], int128, int128[3]): | |
| return c, 4, self._foo(a, b, c)[2] | |
| """, | |
| (6, [7, 5, 8], [1, 2, 3]), | |
| ([1, 2, 3], 4, [5, 6, 7]), | |
| ), | |
| ] | |
| @pytest.mark.parametrize("source_code,args,expected", tuple_return_sources) | |
| def test_tuple_return_types(get_contract, source_code, args, expected): | |
| c = get_contract(source_code) | |
| assert c.foo(*args) == expected |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment