From 420ad853ccc659a86b5077beee3883354ed094a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= Date: Tue, 28 Mar 2023 09:17:13 +0100 Subject: [PATCH] core/types/address: order addresses by their string (bech32m) format --- core/src/types/address.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/core/src/types/address.rs b/core/src/types/address.rs index ae96842f8cf..f3956064ca3 100644 --- a/core/src/types/address.rs +++ b/core/src/types/address.rs @@ -100,15 +100,7 @@ pub type Result = std::result::Result; /// An account's address #[derive( - Clone, - BorshSerialize, - BorshDeserialize, - BorshSchema, - PartialEq, - Eq, - PartialOrd, - Ord, - Hash, + Clone, BorshSerialize, BorshDeserialize, BorshSchema, PartialEq, Eq, Hash, )] pub enum Address { /// An established address is generated on-chain @@ -119,6 +111,21 @@ pub enum Address { Internal(InternalAddress), } +// We're using the string format of addresses (bech32m) for ordering to ensure +// that addresses as strings, storage keys and storage keys asa strings preserve +// the order. +impl PartialOrd for Address { + fn partial_cmp(&self, other: &Self) -> Option { + self.encode().partial_cmp(&other.encode()) + } +} + +impl Ord for Address { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.encode().cmp(&other.encode()) + } +} + impl Address { /// Encode an address with Bech32m encoding pub fn encode(&self) -> String {