diff --git a/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountId.java b/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountId.java index 99e433de..f1dc6ad5 100644 --- a/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountId.java +++ b/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountId.java @@ -1,18 +1,36 @@ package com.strategyobject.substrateclient.rpc.types; +import com.strategyobject.substrateclient.crypto.ss58.SS58Codec; +import com.strategyobject.substrateclient.rpc.core.MetadataRegistry; import com.strategyobject.substrateclient.scale.ScaleSelfWritable; import com.strategyobject.substrateclient.types.FixedBytes; import com.strategyobject.substrateclient.types.Size; import lombok.NonNull; +import lombok.var; + +import java.util.concurrent.atomic.AtomicReference; public class AccountId extends FixedBytes implements ScaleSelfWritable { + private final AtomicReference encoded = new AtomicReference<>(null); + protected AccountId(byte[] data) { super(data, Size.of32); } + @Override + public String toString() { + var result = encoded.get(); + if (result != null) { + return result; + } + + result = SS58Codec.encode(getData(), MetadataRegistry.getInstance().getSS58AddressFormat()); + return encoded.compareAndSet(null, result) ? result : encoded.get(); + } + public static AccountId fromBytes(byte @NonNull [] data) { return new AccountId(data); } diff --git a/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountIdEncoder.java b/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountIdEncoder.java index cd754d79..b0852a03 100644 --- a/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountIdEncoder.java +++ b/rpc/rpc-types/src/main/java/com/strategyobject/substrateclient/rpc/types/AccountIdEncoder.java @@ -1,9 +1,7 @@ package com.strategyobject.substrateclient.rpc.types; import com.google.common.base.Preconditions; -import com.strategyobject.substrateclient.crypto.ss58.SS58Codec; import com.strategyobject.substrateclient.rpc.core.EncoderPair; -import com.strategyobject.substrateclient.rpc.core.MetadataRegistry; import com.strategyobject.substrateclient.rpc.core.RpcEncoder; import com.strategyobject.substrateclient.rpc.core.annotations.AutoRegister; @@ -13,6 +11,6 @@ public class AccountIdEncoder implements RpcEncoder { public Object encode(AccountId source, EncoderPair... encoders) { Preconditions.checkArgument(encoders == null || encoders.length == 0); - return SS58Codec.encode(source.getData(), MetadataRegistry.getInstance().getSS58AddressFormat()); + return source.toString(); } }