Skip to content

Instantly share code, notes, and snippets.

@andrew-fleming
Last active April 8, 2022 23:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save andrew-fleming/6d99d68a55be6228b0b5c1ca4c58dc90 to your computer and use it in GitHub Desktop.
Save andrew-fleming/6d99d68a55be6228b0b5c1ca4c58dc90 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
func a_increase_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(amount : felt):
let (res) = balance.read()
balance.write(res + amount)
return ()
end
func a_get_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}() -> (res : felt):
let (res) = balance.read()
return (res)
end
%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
@storage_var
func balance() -> (res : felt):
end
func b_increase_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(amount : felt):
let (res) = balance.read()
balance.write(res + amount)
return ()
end
func b_get_balance{
syscall_ptr : felt*, pedersen_ptr : HashBuiltin*,
range_check_ptr}() -> (res : felt):
let (res) = balance.read()
return (res)
end
%lang starknet
from starkware.cairo.common.cairo_builtins import HashBuiltin
from openzeppelin.a import a_get_balance, a_increase_balance
from openzeppelin.b import b_get_balance, b_increase_balance
@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