Skip to content

Instantly share code, notes, and snippets.

@koloz193

koloz193/a.cairo Secret

Forked from andrew-fleming/a.cairo
Last active April 8, 2022 23:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koloz193/18cb491167e844e9a28ac69825f68975 to your computer and use it in GitHub Desktop.
Save koloz193/18cb491167e844e9a28ac69825f68975 to your computer and use it in GitHub Desktop.
Storage variable clashing
%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
@storage_var
func balance() -> (res : felt):
end
namespace A:
func increase_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(amount : felt):
let (res) = balance.read()
balance.write(res + amount)
return ()
end
func get_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}() -> (res : felt):
let (res) = balance.read()
return (res)
end
end
%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
@storage_var
func balance() -> (res : felt):
end
namespace B:
func increase_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(amount : felt):
let (res) = balance.read()
balance.write(res + amount)
return ()
end
func get_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}() -> (res : felt):
let (res) = balance.read()
return (res)
end
end
%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
from openzeppelin.a import A
from openzeppelin.b import B
@external
func increase_balance_a{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(amount : felt):
A.increase_balance(amount)
return ()
end
@external
func increase_balance_b{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(amount : felt):
B.increase_balance(amount)
return ()
end
@view
func get_balance_a{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}() -> (res : felt):
let (res) = A.get_balance()
return (res)
end
@view
func get_balance_b{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}() -> (res : felt):
let (res) = B.get_balance()
return (res)
end
import pytest
from starkware.starknet.testing.starknet import Starknet
from utils import contract_path
@pytest.mark.asyncio
async def test_clash():
starknet = await Starknet.empty()
public_contract = await starknet.deploy(
contract_path("openzeppelin/c.cairo")
)
await public_contract.increase_balance_a(99).invoke()
await public_contract.increase_balance_b(100).invoke()
balance_one = await public_contract.get_balance_a().call()
print("Should be 99: ", balance_one.result.res) # prints 199
balance_two = await public_contract.get_balance_b().call()
print("Should be 100: ", balance_two.result.res). # prints 199
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment