Skip to content

Commit 3219a7e

Browse files
authored
Merge pull request #261 from graphprotocol/mde/add-change-permissions-message-to-encoder
chore: add ChangePermissions message to encoder
2 parents dadf415 + dcc5b01 commit 3219a7e

File tree

13 files changed

+1681
-1894
lines changed

13 files changed

+1681
-1894
lines changed

.github/workflows/subgraph.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- name: Set up Node.js
1818
uses: actions/setup-node@v2
1919
with:
20-
node-version: '20'
20+
node-version: '22'
2121
registry-url: https://registry.npmjs.org
2222
- name: test
2323
working-directory: ./packages/subgraph

crates/encoding/src/lib.rs

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,6 @@ impl Encoder {
150150
self.networks.clear();
151151
self.compressed.push(CompressedMessage::Reset);
152152
}
153-
Message::ChangeOwnership { new_owner_address } => {
154-
self.compressed.push(CompressedMessage::ChangeOwnership {
155-
new_owner_address: *new_owner_address,
156-
});
157-
}
158153
Message::RegisterNetworksAndAliases { remove, add } => {
159154
for index in remove {
160155
self.remove_network(*index);
@@ -169,6 +164,20 @@ impl Encoder {
169164
add: add.clone(),
170165
});
171166
}
167+
Message::ChangePermissions {
168+
address,
169+
valid_through,
170+
permissions,
171+
} => {
172+
self.compressed.push(CompressedMessage::ChangePermissions {
173+
address: *address,
174+
valid_through: *valid_through,
175+
permissions: permissions
176+
.iter()
177+
.map(|x| Message::str_to_u64(x.as_str()))
178+
.collect(),
179+
});
180+
}
172181
};
173182
Ok(())
174183
}
@@ -451,4 +460,39 @@ mod tests {
451460
assert_ne!(networks_before, encoder.networks);
452461
assert_ne!(encoder.networks.last().unwrap().1.block_delta, 0);
453462
}
463+
464+
#[test]
465+
fn change_permissions_message() {
466+
let mut encoder = Encoder::new(CURRENT_ENCODING_VERSION, vec![]).unwrap();
467+
468+
let test_permissions = vec![
469+
"RegisterNetworksAndAliasesMessage".to_string(),
470+
"CorrectEpochsMessage".to_string(),
471+
];
472+
473+
let result_permissions = vec![6, 1];
474+
475+
let compressed = encoder
476+
.compress(&[Message::ChangePermissions {
477+
address: [1u8; 20],
478+
valid_through: 123u64,
479+
permissions: test_permissions.clone(),
480+
}])
481+
.unwrap();
482+
483+
assert_eq!(compressed.len(), 1);
484+
485+
match &compressed[0] {
486+
CompressedMessage::ChangePermissions {
487+
address,
488+
valid_through,
489+
permissions,
490+
} => {
491+
assert_eq!(*address, [1u8; 20]);
492+
assert_eq!(*valid_through, 123u64);
493+
assert_eq!(*permissions, result_permissions);
494+
}
495+
_ => panic!("Expected ChangePermissions message"),
496+
}
497+
}
454498
}

crates/encoding/src/messages.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,33 @@ pub enum Message {
4141
UpdateVersion {
4242
version_number: u64,
4343
},
44-
ChangeOwnership {
45-
new_owner_address: [u8; 20],
46-
},
4744
Reset,
4845
RegisterNetworksAndAliases {
4946
// Remove is by index
5047
remove: Vec<NetworkIndex>,
5148
// Add is by CAIP2 id and Alias
5249
add: Vec<(String, String)>,
5350
},
51+
ChangePermissions {
52+
address: [u8; 20],
53+
valid_through: u64,
54+
permissions: Vec<String>,
55+
},
56+
}
57+
58+
impl Message {
59+
pub fn str_to_u64(str: &str) -> u64 {
60+
match str {
61+
"SetBlockNumbersForNextEpochMessage" => 0u64,
62+
"CorrectEpochsMessage" => 1,
63+
"UpdateVersionMessage" => 2,
64+
"RegisterNetworksMessage" => 3,
65+
"ChangePermissionsMessage" => 4,
66+
"ResetStateMessage" => 5,
67+
"RegisterNetworksAndAliasesMessage" => 6,
68+
_ => 7,
69+
}
70+
}
5471
}
5572

5673
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -66,14 +83,16 @@ pub enum CompressedMessage {
6683
UpdateVersion {
6784
version_number: u64,
6885
},
69-
ChangeOwnership {
70-
new_owner_address: [u8; 20],
71-
},
7286
Reset,
7387
RegisterNetworksAndAliases {
7488
remove: Vec<u64>,
7589
add: Vec<(String, String)>,
7690
},
91+
ChangePermissions {
92+
address: [u8; 20],
93+
valid_through: u64,
94+
permissions: Vec<u64>,
95+
},
7796
}
7897

7998
impl CompressedMessage {

crates/encoding/src/serialize.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,14 @@ fn serialize_message(message: &CompressedMessage, bytes: &mut Vec<u8>) {
4141
CompressedMessage::CorrectEpochs { .. } => {
4242
todo!()
4343
}
44-
CompressedMessage::ChangeOwnership { new_owner_address } => {
45-
bytes.extend_from_slice(new_owner_address);
46-
}
4744
CompressedMessage::RegisterNetworksAndAliases { add, remove } => {
4845
serialize_register_networks_and_aliases(add, remove, bytes)
4946
}
47+
CompressedMessage::ChangePermissions {
48+
address,
49+
valid_through,
50+
permissions,
51+
} => serialize_change_permissions(address, *valid_through, permissions, bytes),
5052
}
5153
}
5254

@@ -99,6 +101,20 @@ fn serialize_register_networks_and_aliases(
99101
}
100102
}
101103

104+
fn serialize_change_permissions(
105+
address: &[u8],
106+
valid_through: u64,
107+
permissions: &[u64],
108+
bytes: &mut Vec<u8>,
109+
) {
110+
bytes.extend_from_slice(address);
111+
serialize_u64(valid_through, bytes);
112+
serialize_u64(permissions.len() as u64, bytes);
113+
for permission in permissions {
114+
serialize_u64(*permission, bytes);
115+
}
116+
}
117+
102118
fn serialize_str(value: &str, bytes: &mut Vec<u8>) {
103119
serialize_u64(value.len() as u64, bytes);
104120
bytes.extend_from_slice(value.as_bytes());
@@ -138,7 +154,7 @@ fn message_tag(m: &CompressedMessage) -> u8 {
138154
CompressedMessage::CorrectEpochs { .. } => 1,
139155
CompressedMessage::UpdateVersion { .. } => 2,
140156
CompressedMessage::RegisterNetworks { .. } => 3,
141-
CompressedMessage::ChangeOwnership { .. } => 4,
157+
CompressedMessage::ChangePermissions { .. } => 4,
142158
CompressedMessage::Reset => 5,
143159
CompressedMessage::RegisterNetworksAndAliases { .. } => 6,
144160
}

crates/json-oracle-encoder/src/lib.rs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,20 @@ fn messages_to_encoded_message_blocks(
8080
Message::RegisterNetworksAndAliases { remove, add } => {
8181
ee::CompressedMessage::RegisterNetworksAndAliases { remove, add }
8282
}
83-
Message::ChangeOwnership { new_owner_address } => {
84-
ee::CompressedMessage::ChangeOwnership {
85-
new_owner_address: new_owner_address
86-
.try_into()
87-
.map_err(|_| anyhow!("Bad owner address length; must be 20 bytes"))?,
88-
}
89-
}
83+
Message::ChangePermissions {
84+
address,
85+
valid_through,
86+
permissions,
87+
} => ee::CompressedMessage::ChangePermissions {
88+
address: address
89+
.try_into()
90+
.map_err(|_| anyhow!("Bad address length; must be 20 bytes"))?,
91+
valid_through,
92+
permissions: permissions
93+
.into_iter()
94+
.map(|x| ee::Message::str_to_u64(x.as_str()))
95+
.collect(),
96+
},
9097
Message::SetBlockNumbersForNextEpoch(SetBlockNumbersForNextEpoch::Empty {
9198
count,
9299
}) => ee::CompressedMessage::SetBlockNumbersForNextEpoch(
@@ -148,15 +155,16 @@ pub enum Message {
148155
version_number: u64,
149156
},
150157
Reset,
151-
#[serde(rename_all = "camelCase")]
152-
ChangeOwnership {
153-
#[serde(deserialize_with = "deserialize_hex")]
154-
new_owner_address: Vec<u8>,
155-
},
156158
RegisterNetworksAndAliases {
157159
remove: Vec<u64>,
158160
add: Vec<(String, String)>,
159161
},
162+
ChangePermissions {
163+
#[serde(deserialize_with = "deserialize_hex")]
164+
address: Vec<u8>,
165+
valid_through: u64,
166+
permissions: Vec<String>,
167+
},
160168
}
161169

162170
impl Message {
@@ -167,8 +175,8 @@ impl Message {
167175
Message::RegisterNetworks { .. } => "RegisterNetworks",
168176
Message::UpdateVersion { .. } => "UpdateVersion",
169177
Message::Reset => "Reset",
170-
Message::ChangeOwnership { .. } => "ChangeOwnership",
171178
Message::RegisterNetworksAndAliases { .. } => "RegisterNetworksAndAliases",
179+
Message::ChangePermissions { .. } => "ChangePermissions",
172180
}
173181
}
174182
}

crates/oracle/message-examples/jsonnet-examples/06-register-networks-and-change-ownership.jsonnet

Lines changed: 0 additions & 9 deletions
This file was deleted.

crates/xtask/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,6 @@ features = ["derive"]
2525
[dependencies.url]
2626
version = "2"
2727
features = ["serde"]
28+
29+
[lints.rust]
30+
unexpected_cfgs = { level = "allow", check-cfg = ['cfg(trick_rust_analyzer_into_highlighting_interpolated_bits)'] }

packages/subgraph/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
"scripts": {
55
"prepare": "./scripts/prepare.sh",
66
"codegen": "yarn && graph codegen",
7-
"test": "yarn && yarn prep:test && yarn codegen && graph test",
7+
"test": "yarn && yarn prep:test && yarn codegen && graph test -d",
88
"build": "yarn && yarn prepare && graph build",
9-
"deploy-mainnet": "yarn && yarn prep:mainnet && yarn codegen && graph build --network mainnet && graph deploy --studio graph-ebo-ethereum",
10-
"deploy-arbitrum": "yarn && yarn prep:arbitrum && yarn codegen && graph build --network arbitrum-one && graph deploy --studio graph-ebo-arbitrum",
11-
"deploy-sepolia": "yarn && yarn prep:sepolia && yarn codegen && graph build --network sepolia && graph deploy --studio graph-ebo-sepolia",
12-
"deploy-arbitrum-sepolia": "yarn && yarn prep:arbitrum-sepolia && yarn codegen && graph build --network arbitrum-sepolia && graph deploy --studio graph-ebo-arbitrum-sepolia",
9+
"deploy-mainnet": "yarn && yarn prep:mainnet && yarn codegen && graph build --network mainnet && graph deploy graph-ebo-ethereum",
10+
"deploy-arbitrum": "yarn && yarn prep:arbitrum && yarn codegen && graph build --network arbitrum-one && graph deploy graph-ebo-arbitrum",
11+
"deploy-sepolia": "yarn && yarn prep:sepolia && yarn codegen && graph build --network sepolia && graph deploy graph-ebo-sepolia",
12+
"deploy-arbitrum-sepolia": "yarn && yarn prep:arbitrum-sepolia && yarn codegen && graph build --network arbitrum-sepolia && graph deploy graph-ebo-arbitrum-sepolia",
1313
"create-local": "graph create --node http://127.0.0.1:8020/ edgeandnode/block-oracle",
1414
"remove-local": "graph remove --node http://127.0.0.1:8020/ edgeandnode/block-oracle",
1515
"deploy-local": "yarn codegen && graph deploy --node http://127.0.0.1:8020/ --ipfs http://localhost:${IPFS_PORT} edgeandnode/block-oracle --version-label 0.1.0",
@@ -21,8 +21,8 @@
2121
"prep:arbitrum-sepolia": "mustache ./config/arbitrum-sepolia.json subgraph.template.yaml > subgraph.yaml && mustache ./config/arbitrum-sepolia.json src/constants.template.ts > src/constants.ts"
2222
},
2323
"devDependencies": {
24-
"@graphprotocol/graph-cli": "^0.69.1",
25-
"@graphprotocol/graph-ts": "^0.34.0",
24+
"@graphprotocol/graph-cli": "^0.94.0",
25+
"@graphprotocol/graph-ts": "^0.37.0",
2626
"matchstick-as": "^0.5.0",
2727
"mustache": "^4.0.1"
2828
}

packages/subgraph/schema.graphql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ type ChangePermissionsMessage implements Message @entity {
5252
block: MessageBlock!
5353
data: Bytes
5454
address: String!
55+
validThrough: BigInt!
5556
oldPermissions: [String!]!
5657
newPermissions: [String!]!
5758
}

packages/subgraph/src/mapping.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -607,34 +607,49 @@ function executeChangePermissionsMessage(
607607
let message = cache.getChangePermissionsMessage(id);
608608
let address = reader.advance(20).toHexString(); // address should always be 20 bytes
609609

610+
// Get valid_through
611+
let validThrough = decodeU64(reader);
612+
if (!reader.ok) {
613+
return;
614+
}
615+
610616
// Get the length of the new premissions list
611617
let permissionsListLength = decodeU64(reader) as i32;
612618
if (!reader.ok) {
613619
return;
614620
}
615621

616622
let permissionEntry = cache.getPermissionListEntry(address);
623+
permissionEntry.validThrough = BigInt.fromU64(validThrough)
617624
let oldPermissionList = permissionEntry.permissions;
618625
let newPermissionList = new Array<String>();
619626

620627
for (let i = 0; i < permissionsListLength; i++) {
621628
let permission = decodeU64(reader) as i32;
622-
newPermissionList.push(MessageTag.toString(permission));
629+
if(MessageTag.isValid(permission)) {
630+
newPermissionList.push(MessageTag.toString(permission));
631+
} else {
632+
reader.fail(`Permission to add is invalid. Permission index: ${permission.toString()}`)
633+
}
623634
}
635+
permissionEntry.permissions = newPermissionList;
624636

625637
message.block = messageBlock.id;
626638
message.address = address;
639+
message.validThrough = BigInt.fromU64(validThrough);
627640
message.oldPermissions = oldPermissionList;
628641
message.newPermissions = newPermissionList;
629642
message.data = reader.diff(snapshot);
630643

631644

632645
let list = globalState.permissionList;
633-
list.push(permissionEntry.id);
646+
if(!list.includes(permissionEntry.id)) {
647+
list.push(permissionEntry.id);
648+
} else if (permissionsListLength == 0) {
649+
// this will remove the now empty permission entry from the list, preventing spam
650+
list.splice(list.indexOf(permissionEntry.id), 1)
651+
}
634652
globalState.permissionList = list;
635-
636-
// might want to remove it from the "allow list" if the new permission list length is 0
637-
// Right now the address won't be able to execute anything on that case, but it can spam
638653
}
639654

640655
function executeResetStateMessage(

0 commit comments

Comments
 (0)