-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path29_upgradable_contract.py
More file actions
92 lines (76 loc) · 3.92 KB
/
29_upgradable_contract.py
File metadata and controls
92 lines (76 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import smartpy as sp
@sp.module
def main():
class DataEndlessWall(sp.Contract):
def __init__(self, owner):
self.data.wall_content = sp.big_map({})
self.data.nb_calls = 0
self.data.owner = owner
@sp.entrypoint
def write_message(self, message, user):
sp.cast(user, sp.address)
assert self.data.owner == sp.sender
data = sp.record(text = "", timestamp = sp.timestamp(0))
if self.data.wall_content.contains(user):
data = self.data.wall_content[user]
data.text += "," + message
else:
data.text = message
data.timestamp = sp.now
self.data.wall_content[user] = data
@sp.entrypoint
def update_owner(self, new_owner):
assert sp.sender == self.data.owner, "not the owner"
self.data.owner = new_owner
class UpgradableEndlessWall(sp.Contract):
def __init__(self, wall_contract, owner):
self.data.owner = owner
self.data.wall_contract = wall_contract
@sp.entrypoint
def write_message(self, message):
wall_write_message = sp.contract(sp.record(message = sp.string, user = sp.address),
self.data.wall_contract,
entrypoint="write_message").unwrap_some()
sp.transfer(sp.record(message = message, user = sp.sender), sp.tez(0), wall_write_message)
@sp.entrypoint
def upgrade(self, new_contract):
assert sp.sender == self.data.owner
wall_update_owner = sp.contract(sp.address,
self.data.wall_contract,
entrypoint="update_owner").unwrap_some()
sp.transfer(new_contract, sp.tez(0), wall_update_owner)
class UpgradableEndlessWallV2(sp.Contract):
def __init__(self, wall_contract, owner):
self.data.owner = owner
self.data.wall_contract = wall_contract
@sp.entrypoint
def write_message(self, message):
assert sp.len(message) <= 30, "Wall v2 requires message lengths under 30"
wall_write_message = sp.contract(sp.record(message = sp.string, user = sp.address),
self.data.wall_contract,
entrypoint="write_message").unwrap_some()
sp.transfer(sp.record(message = message, user = sp.sender), sp.tez(0), wall_write_message)
@sp.entrypoint
def upgrade(self, new_contract):
assert sp.sender == self.data.owner
wall_update_owner = sp.contract(sp.address,
self.data.wall_contract,
entrypoint="update_owner").unwrap_some()
sp.transfer(new_contract, sp.tez(0), wall_update_owner)
@sp.add_test()
def test():
alice=sp.test_account("Alice")
bob=sp.test_account("Bob")
eve=sp.test_account("Eve")
sc = sp.test_scenario("Test", main)
innerWall = main.DataEndlessWall(alice.address)
sc += innerWall
endlessWallV1 = main.UpgradableEndlessWall(wall_contract = innerWall.address, owner = alice.address)
sc += endlessWallV1
innerWall.update_owner(endlessWallV1.address, _sender = alice)
endlessWallV1.write_message("Message with the old version can be very long", _sender = bob)
endlessWallV2 = main.UpgradableEndlessWallV2(wall_contract = innerWall.address, owner = alice.address)
sc += endlessWallV2
endlessWallV1.upgrade(endlessWallV2.address, _sender = alice)
endlessWallV2.write_message("Long messages aren't allowed anymore", _sender = eve, _valid = False)
endlessWallV2.write_message("Short messages are ok", _sender = eve)