Limit the number of calls to delegate
diff --git a/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes.java b/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes.java
index 8f4a2f5..e8d9376 100644
--- a/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes.java
+++ b/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes.java
@@ -12,11 +12,7 @@
  */
 package org.apache.tuweni.bytes;
 
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import java.security.MessageDigest;
 
-import io.vertx.core.buffer.Buffer;
 
 /**
  * A class that holds and delegates all operations to its inner bytes field.
@@ -24,7 +20,7 @@
  * <p>
  * This class may be used to create more types that represent bytes, but need a different name for business logic.
  */
-public class DelegatingBytes implements Bytes {
+public class DelegatingBytes extends AbstractBytes implements Bytes {
 
   private final Bytes delegate;
 
@@ -43,116 +39,6 @@
   }
 
   @Override
-  public int getInt(int i) {
-    return delegate.getInt(i);
-  }
-
-  @Override
-  public int toInt() {
-    return delegate.toInt();
-  }
-
-  @Override
-  public long getLong(int i) {
-    return delegate.getLong(i);
-  }
-
-  @Override
-  public long toLong() {
-    return delegate.toLong();
-  }
-
-  @Override
-  public BigInteger toBigInteger() {
-    return delegate.toBigInteger();
-  }
-
-  @Override
-  public BigInteger toUnsignedBigInteger() {
-    return delegate.toUnsignedBigInteger();
-  }
-
-  @Override
-  public boolean isZero() {
-    return delegate.isZero();
-  }
-
-  @Override
-  public int numberOfLeadingZeros() {
-    return delegate.numberOfLeadingZeros();
-  }
-
-  @Override
-  public int numberOfLeadingZeroBytes() {
-    return delegate.numberOfLeadingZeroBytes();
-  }
-
-  @Override
-  public boolean hasLeadingZeroByte() {
-    return delegate.hasLeadingZeroByte();
-  }
-
-  @Override
-  public boolean hasLeadingZero() {
-    return delegate.hasLeadingZero();
-  }
-
-  @Override
-  public int bitLength() {
-    return delegate.bitLength();
-  }
-
-  @Override
-  public Bytes and(Bytes other) {
-    return delegate.and(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T and(Bytes other, T result) {
-    return delegate.and(other, result);
-  }
-
-  @Override
-  public Bytes or(Bytes other) {
-    return delegate.or(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T or(Bytes other, T result) {
-    return delegate.or(other, result);
-  }
-
-  @Override
-  public Bytes xor(Bytes other) {
-    return delegate.xor(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T xor(Bytes other, T result) {
-    return delegate.xor(other, result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T not(T result) {
-    return delegate.not(result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T shiftRight(int distance, T result) {
-    return delegate.shiftRight(distance, result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T shiftLeft(int distance, T result) {
-    return delegate.shiftLeft(distance, result);
-  }
-
-  @Override
-  public Bytes slice(int index) {
-    return delegate.slice(index);
-  }
-
-  @Override
   public Bytes slice(int index, int length) {
     return delegate.slice(index, length);
   }
@@ -166,74 +52,4 @@
   public MutableBytes mutableCopy() {
     return MutableBytes.wrap(toArray());
   }
-
-  @Override
-  public void copyTo(MutableBytes destination) {
-    delegate.copyTo(destination);
-  }
-
-  @Override
-  public void copyTo(MutableBytes destination, int destinationOffset) {
-    delegate.copyTo(destination, destinationOffset);
-  }
-
-  @Override
-  public void appendTo(ByteBuffer byteBuffer) {
-    delegate.appendTo(byteBuffer);
-  }
-
-  @Override
-  public void appendTo(Buffer buffer) {
-    delegate.appendTo(buffer);
-  }
-
-  @Override
-  public int commonPrefixLength(Bytes other) {
-    return delegate.commonPrefixLength(other);
-  }
-
-  @Override
-  public Bytes commonPrefix(Bytes other) {
-    return delegate.commonPrefix(other);
-  }
-
-  @Override
-  public void update(MessageDigest digest) {
-    delegate.update(digest);
-  }
-
-  @Override
-  public byte[] toArray() {
-    return delegate.toArray();
-  }
-
-  @Override
-  public byte[] toArrayUnsafe() {
-    return delegate.toArrayUnsafe();
-  }
-
-  @Override
-  public String toString() {
-    return delegate.toString();
-  }
-
-  @Override
-  public String toHexString() {
-    return delegate.toHexString();
-  }
-
-  @Override
-  public String toShortHexString() {
-    return delegate.toShortHexString();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    return delegate.equals(obj);
-  }
-
-  @Override
-  public int hashCode() {
-    return delegate.hashCode();
-  }
 }
diff --git a/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes32.java b/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes32.java
index 0e2f36e..999b8b3 100644
--- a/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes32.java
+++ b/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes32.java
@@ -12,11 +12,7 @@
  */
 package org.apache.tuweni.bytes;
 
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import java.security.MessageDigest;
 
-import io.vertx.core.buffer.Buffer;
 
 /**
  * A class that holds and delegates all operations to its inner bytes field.
@@ -24,7 +20,7 @@
  * <p>
  * This class may be used to create more types that represent 32 bytes, but need a different name for business logic.
  */
-public class DelegatingBytes32 implements Bytes32 {
+public class DelegatingBytes32 extends AbstractBytes implements Bytes32 {
 
   private final Bytes delegate;
 
@@ -43,116 +39,6 @@
   }
 
   @Override
-  public int getInt(int i) {
-    return delegate.getInt(i);
-  }
-
-  @Override
-  public int toInt() {
-    return delegate.toInt();
-  }
-
-  @Override
-  public long getLong(int i) {
-    return delegate.getLong(i);
-  }
-
-  @Override
-  public long toLong() {
-    return delegate.toLong();
-  }
-
-  @Override
-  public BigInteger toBigInteger() {
-    return delegate.toBigInteger();
-  }
-
-  @Override
-  public BigInteger toUnsignedBigInteger() {
-    return delegate.toUnsignedBigInteger();
-  }
-
-  @Override
-  public boolean isZero() {
-    return delegate.isZero();
-  }
-
-  @Override
-  public int numberOfLeadingZeros() {
-    return delegate.numberOfLeadingZeros();
-  }
-
-  @Override
-  public int numberOfLeadingZeroBytes() {
-    return delegate.numberOfLeadingZeroBytes();
-  }
-
-  @Override
-  public boolean hasLeadingZeroByte() {
-    return delegate.hasLeadingZeroByte();
-  }
-
-  @Override
-  public boolean hasLeadingZero() {
-    return delegate.hasLeadingZero();
-  }
-
-  @Override
-  public int bitLength() {
-    return delegate.bitLength();
-  }
-
-  @Override
-  public Bytes and(Bytes other) {
-    return delegate.and(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T and(Bytes other, T result) {
-    return delegate.and(other, result);
-  }
-
-  @Override
-  public Bytes or(Bytes other) {
-    return delegate.or(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T or(Bytes other, T result) {
-    return delegate.or(other, result);
-  }
-
-  @Override
-  public Bytes xor(Bytes other) {
-    return delegate.xor(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T xor(Bytes other, T result) {
-    return delegate.xor(other, result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T not(T result) {
-    return delegate.not(result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T shiftRight(int distance, T result) {
-    return delegate.shiftRight(distance, result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T shiftLeft(int distance, T result) {
-    return delegate.shiftLeft(distance, result);
-  }
-
-  @Override
-  public Bytes slice(int index) {
-    return delegate.slice(index);
-  }
-
-  @Override
   public Bytes slice(int index, int length) {
     return delegate.slice(index, length);
   }
@@ -166,74 +52,4 @@
   public MutableBytes32 mutableCopy() {
     return MutableBytes32.wrap(toArray());
   }
-
-  @Override
-  public void copyTo(MutableBytes destination) {
-    delegate.copyTo(destination);
-  }
-
-  @Override
-  public void copyTo(MutableBytes destination, int destinationOffset) {
-    delegate.copyTo(destination, destinationOffset);
-  }
-
-  @Override
-  public void appendTo(ByteBuffer byteBuffer) {
-    delegate.appendTo(byteBuffer);
-  }
-
-  @Override
-  public void appendTo(Buffer buffer) {
-    delegate.appendTo(buffer);
-  }
-
-  @Override
-  public int commonPrefixLength(Bytes other) {
-    return delegate.commonPrefixLength(other);
-  }
-
-  @Override
-  public Bytes commonPrefix(Bytes other) {
-    return delegate.commonPrefix(other);
-  }
-
-  @Override
-  public void update(MessageDigest digest) {
-    delegate.update(digest);
-  }
-
-  @Override
-  public byte[] toArray() {
-    return delegate.toArray();
-  }
-
-  @Override
-  public byte[] toArrayUnsafe() {
-    return delegate.toArrayUnsafe();
-  }
-
-  @Override
-  public String toString() {
-    return delegate.toString();
-  }
-
-  @Override
-  public String toHexString() {
-    return delegate.toHexString();
-  }
-
-  @Override
-  public String toShortHexString() {
-    return delegate.toShortHexString();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    return delegate.equals(obj);
-  }
-
-  @Override
-  public int hashCode() {
-    return delegate.hashCode();
-  }
 }
diff --git a/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes48.java b/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes48.java
index 1441f73..497b4e6 100644
--- a/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes48.java
+++ b/bytes/src/main/java/org/apache/tuweni/bytes/DelegatingBytes48.java
@@ -13,11 +13,6 @@
 package org.apache.tuweni.bytes;
 
 
-import java.math.BigInteger;
-import java.nio.ByteBuffer;
-import java.security.MessageDigest;
-
-import io.vertx.core.buffer.Buffer;
 
 /**
  * A class that holds and delegates all operations to its inner bytes field.
@@ -25,7 +20,7 @@
  * <p>
  * This class may be used to create more types that represent 48 bytes, but need a different name for business logic.
  */
-public class DelegatingBytes48 implements Bytes48 {
+public class DelegatingBytes48 extends AbstractBytes implements Bytes48 {
 
   private final Bytes delegate;
 
@@ -44,116 +39,6 @@
   }
 
   @Override
-  public int getInt(int i) {
-    return delegate.getInt(i);
-  }
-
-  @Override
-  public int toInt() {
-    return delegate.toInt();
-  }
-
-  @Override
-  public long getLong(int i) {
-    return delegate.getLong(i);
-  }
-
-  @Override
-  public long toLong() {
-    return delegate.toLong();
-  }
-
-  @Override
-  public BigInteger toBigInteger() {
-    return delegate.toBigInteger();
-  }
-
-  @Override
-  public BigInteger toUnsignedBigInteger() {
-    return delegate.toUnsignedBigInteger();
-  }
-
-  @Override
-  public boolean isZero() {
-    return delegate.isZero();
-  }
-
-  @Override
-  public int numberOfLeadingZeros() {
-    return delegate.numberOfLeadingZeros();
-  }
-
-  @Override
-  public int numberOfLeadingZeroBytes() {
-    return delegate.numberOfLeadingZeroBytes();
-  }
-
-  @Override
-  public boolean hasLeadingZeroByte() {
-    return delegate.hasLeadingZeroByte();
-  }
-
-  @Override
-  public boolean hasLeadingZero() {
-    return delegate.hasLeadingZero();
-  }
-
-  @Override
-  public int bitLength() {
-    return delegate.bitLength();
-  }
-
-  @Override
-  public Bytes and(Bytes other) {
-    return delegate.and(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T and(Bytes other, T result) {
-    return delegate.and(other, result);
-  }
-
-  @Override
-  public Bytes or(Bytes other) {
-    return delegate.or(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T or(Bytes other, T result) {
-    return delegate.or(other, result);
-  }
-
-  @Override
-  public Bytes xor(Bytes other) {
-    return delegate.xor(other);
-  }
-
-  @Override
-  public <T extends MutableBytes> T xor(Bytes other, T result) {
-    return delegate.xor(other, result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T not(T result) {
-    return delegate.not(result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T shiftRight(int distance, T result) {
-    return delegate.shiftRight(distance, result);
-  }
-
-  @Override
-  public <T extends MutableBytes> T shiftLeft(int distance, T result) {
-    return delegate.shiftLeft(distance, result);
-  }
-
-  @Override
-  public Bytes slice(int index) {
-    return delegate.slice(index);
-  }
-
-  @Override
   public Bytes slice(int index, int length) {
     return delegate.slice(index, length);
   }
@@ -168,73 +53,4 @@
     return MutableBytes48.wrap(toArray());
   }
 
-  @Override
-  public void copyTo(MutableBytes destination) {
-    delegate.copyTo(destination);
-  }
-
-  @Override
-  public void copyTo(MutableBytes destination, int destinationOffset) {
-    delegate.copyTo(destination, destinationOffset);
-  }
-
-  @Override
-  public void appendTo(ByteBuffer byteBuffer) {
-    delegate.appendTo(byteBuffer);
-  }
-
-  @Override
-  public void appendTo(Buffer buffer) {
-    delegate.appendTo(buffer);
-  }
-
-  @Override
-  public int commonPrefixLength(Bytes other) {
-    return delegate.commonPrefixLength(other);
-  }
-
-  @Override
-  public Bytes commonPrefix(Bytes other) {
-    return delegate.commonPrefix(other);
-  }
-
-  @Override
-  public void update(MessageDigest digest) {
-    delegate.update(digest);
-  }
-
-  @Override
-  public byte[] toArray() {
-    return delegate.toArray();
-  }
-
-  @Override
-  public byte[] toArrayUnsafe() {
-    return delegate.toArrayUnsafe();
-  }
-
-  @Override
-  public String toString() {
-    return delegate.toString();
-  }
-
-  @Override
-  public String toHexString() {
-    return delegate.toHexString();
-  }
-
-  @Override
-  public String toShortHexString() {
-    return delegate.toShortHexString();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    return delegate.equals(obj);
-  }
-
-  @Override
-  public int hashCode() {
-    return delegate.hashCode();
-  }
 }