Skip to content

Commit 5771bdd

Browse files
committed
Restructure project
- merged `types` and `rpc-types` - moved `storage` to `pallet` - moved all crypto deps to `crypto`
1 parent 338ebdc commit 5771bdd

File tree

369 files changed

+1590
-1444
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

369 files changed

+1590
-1444
lines changed

api/build.gradle

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
dependencies {
22
implementation project(':common')
3+
implementation project(':crypto')
34
implementation project(':pallet')
45
implementation project(':rpc')
5-
implementation project(':rpc:rpc-core')
6-
implementation project(':rpc:rpc-sections')
7-
implementation project(':rpc:rpc-types')
86
implementation project(':scale')
9-
implementation project(':storage')
107
implementation project(':transport')
118
implementation project(':types')
129

10+
annotationProcessor project(':pallet:pallet-codegen')
11+
annotationProcessor project(':rpc:rpc-codegen')
12+
1313
testImplementation project(':tests')
1414

15+
testAnnotationProcessor project(':pallet:pallet-codegen')
16+
17+
testImplementation 'ch.qos.logback:logback-classic:1.2.11'
1518
testImplementation 'org.testcontainers:testcontainers:1.17.1'
1619
testImplementation 'org.testcontainers:junit-jupiter:1.17.1'
17-
18-
testAnnotationProcessor project(':pallet:pallet-codegen')
20+
testImplementation 'org.awaitility:awaitility:4.2.0'
1921
}
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,65 @@
11
package com.strategyobject.substrateclient.api;
22

3+
import com.strategyobject.substrateclient.api.rpc.State;
34
import com.strategyobject.substrateclient.pallet.GeneratedPalletResolver;
4-
import com.strategyobject.substrateclient.rpc.Rpc;
5-
import com.strategyobject.substrateclient.rpc.RpcImpl;
5+
import com.strategyobject.substrateclient.pallet.PalletResolver;
6+
import com.strategyobject.substrateclient.rpc.RpcGeneratedSectionFactory;
67
import com.strategyobject.substrateclient.transport.ProviderInterface;
8+
import lombok.NonNull;
79
import lombok.val;
810

11+
import java.util.Map;
12+
import java.util.concurrent.ConcurrentHashMap;
13+
914
/**
1015
* Provides the ability to query a node and interact with the Polkadot or Substrate chains.
1116
* It allows interacting with blockchain in various ways: using RPC's queries directly or
1217
* accessing Pallets and its APIs, such as storages, transactions, etc.
1318
*/
14-
public interface Api {
15-
static DefaultApi with(ProviderInterface provider) {
16-
val rpc = RpcImpl.with(provider);
19+
public class Api implements AutoCloseable {
20+
private final @NonNull ProviderInterface providerInterface;
21+
private final @NonNull PalletResolver palletResolver;
22+
private final Map<Class<?>, Object> resolvedCache = new ConcurrentHashMap<>();
23+
24+
private Api(@NonNull ProviderInterface providerInterface) {
25+
this.providerInterface = providerInterface;
1726

18-
return DefaultApi.with(rpc, GeneratedPalletResolver.with(rpc));
27+
val stateProvider = RpcGeneratedSectionFactory.create(State.class, providerInterface);
28+
this.palletResolver = GeneratedPalletResolver.with(stateProvider);
1929
}
2030

2131
/**
22-
* @return the instance that provides a proper API for querying the RPC's methods.
32+
* Resolves the instance of a rpc by its definition.
33+
*
34+
* @param clazz the class of the rpc
35+
* @param <T> the type of the rpc
36+
* @return appropriate instance of the rpc
2337
*/
24-
Rpc rpc();
38+
public <T> T rpc(Class<T> clazz) {
39+
return clazz.cast(resolvedCache
40+
.computeIfAbsent(clazz, x -> RpcGeneratedSectionFactory.create(x, providerInterface)));
41+
}
2542

2643
/**
2744
* Resolves the instance of a pallet by its definition.
45+
*
2846
* @param clazz the class of the pallet
29-
* @param <T> the type of the pallet
47+
* @param <T> the type of the pallet
3048
* @return appropriate instance of the pallet
3149
*/
32-
<T> T pallet(Class<T> clazz);
33-
}
50+
public <T> T pallet(@NonNull Class<T> clazz) {
51+
return clazz.cast(resolvedCache
52+
.computeIfAbsent(clazz, palletResolver::resolve));
53+
}
54+
55+
public static Api with(ProviderInterface providerInterface) {
56+
return new Api(providerInterface);
57+
}
58+
59+
@Override
60+
public void close() throws Exception {
61+
if (providerInterface instanceof AutoCloseable) {
62+
((AutoCloseable) providerInterface).close();
63+
}
64+
}
65+
}

api/src/main/java/com/strategyobject/substrateclient/api/DefaultApi.java

-34
This file was deleted.

rpc/rpc-sections/src/main/java/com/strategyobject/substrateclient/rpc/sections/Author.java api/src/main/java/com/strategyobject/substrateclient/api/rpc/Author.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package com.strategyobject.substrateclient.rpc.sections;
1+
package com.strategyobject.substrateclient.api.rpc;
22

3-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcCall;
4-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcInterface;
5-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcSubscription;
6-
import com.strategyobject.substrateclient.rpc.types.Extrinsic;
7-
import com.strategyobject.substrateclient.rpc.types.ExtrinsicStatus;
8-
import com.strategyobject.substrateclient.rpc.types.Hash;
9-
import com.strategyobject.substrateclient.scale.annotations.Scale;
10-
import com.strategyobject.substrateclient.types.PublicKey;
3+
import com.strategyobject.substrateclient.crypto.PublicKey;
4+
import com.strategyobject.substrateclient.rpc.annotation.RpcCall;
5+
import com.strategyobject.substrateclient.rpc.annotation.RpcInterface;
6+
import com.strategyobject.substrateclient.rpc.annotation.RpcSubscription;
7+
import com.strategyobject.substrateclient.scale.annotation.Scale;
8+
import com.strategyobject.substrateclient.types.Extrinsic;
9+
import com.strategyobject.substrateclient.types.ExtrinsicStatus;
10+
import com.strategyobject.substrateclient.types.Hash;
1111

1212
import java.util.concurrent.CompletableFuture;
1313
import java.util.function.BiConsumer;

rpc/rpc-sections/src/main/java/com/strategyobject/substrateclient/rpc/sections/Chain.java api/src/main/java/com/strategyobject/substrateclient/api/rpc/Chain.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
package com.strategyobject.substrateclient.rpc.sections;
1+
package com.strategyobject.substrateclient.api.rpc;
22

3-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcCall;
4-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcInterface;
5-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcSubscription;
6-
import com.strategyobject.substrateclient.rpc.types.BlockHash;
7-
import com.strategyobject.substrateclient.rpc.types.Header;
8-
import com.strategyobject.substrateclient.rpc.types.SignedBlock;
9-
import com.strategyobject.substrateclient.scale.annotations.Scale;
3+
import com.strategyobject.substrateclient.rpc.annotation.RpcCall;
4+
import com.strategyobject.substrateclient.rpc.annotation.RpcInterface;
5+
import com.strategyobject.substrateclient.rpc.annotation.RpcSubscription;
6+
import com.strategyobject.substrateclient.scale.annotation.Scale;
7+
import com.strategyobject.substrateclient.types.BlockHash;
8+
import com.strategyobject.substrateclient.types.Header;
9+
import com.strategyobject.substrateclient.types.SignedBlock;
1010

1111
import java.util.concurrent.CompletableFuture;
1212
import java.util.function.BiConsumer;

rpc/rpc-sections/src/main/java/com/strategyobject/substrateclient/rpc/sections/State.java api/src/main/java/com/strategyobject/substrateclient/api/rpc/State.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
package com.strategyobject.substrateclient.rpc.sections;
1+
package com.strategyobject.substrateclient.api.rpc;
22

3-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcCall;
4-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcInterface;
5-
import com.strategyobject.substrateclient.rpc.core.annotations.RpcSubscription;
6-
import com.strategyobject.substrateclient.rpc.types.*;
7-
import com.strategyobject.substrateclient.scale.annotations.Scale;
3+
import com.strategyobject.substrateclient.pallet.storage.StateProvider;
4+
import com.strategyobject.substrateclient.rpc.annotation.RpcCall;
5+
import com.strategyobject.substrateclient.rpc.annotation.RpcInterface;
6+
import com.strategyobject.substrateclient.rpc.annotation.RpcSubscription;
7+
import com.strategyobject.substrateclient.scale.annotation.Scale;
8+
import com.strategyobject.substrateclient.types.*;
89

910
import java.util.List;
1011
import java.util.concurrent.CompletableFuture;
1112
import java.util.function.BiConsumer;
1213
import java.util.function.Supplier;
1314

1415
@RpcInterface("state")
15-
public interface State {
16+
public interface State extends StateProvider {
1617
@RpcCall("getRuntimeVersion")
1718
CompletableFuture<RuntimeVersion> getRuntimeVersion();
1819

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.strategyobject.substrateclient.api.rpc;
2+
3+
import com.strategyobject.substrateclient.rpc.annotation.RpcCall;
4+
import com.strategyobject.substrateclient.rpc.annotation.RpcInterface;
5+
import com.strategyobject.substrateclient.types.AccountId;
6+
7+
import java.util.concurrent.CompletableFuture;
8+
9+
@RpcInterface("system")
10+
public interface System {
11+
@RpcCall("accountNextIndex")
12+
CompletableFuture<Integer> accountNextIndex(AccountId accountId);
13+
}

api/src/test/java/com/strategyobject/substrateclient/api/ApiTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
import static org.junit.jupiter.api.Assertions.assertNotNull;
1616

1717
@Testcontainers
18-
public class ApiTests {
18+
class ApiTests {
1919
private static final int WAIT_TIMEOUT = 1000;
2020

2121
@Container
2222
private final TestSubstrateContainer substrate = new TestSubstrateContainer(SubstrateVersion.V3_0_0);
2323

2424
@Test
25-
public void getSystemPalletAndCall() throws Exception { // TODO move the test out of the project
25+
void getSystemPalletAndCall() throws Exception { // TODO move the test out of the project
2626
val wsProvider = WsProvider.builder()
2727
.setEndpoint(substrate.getWsAddress())
2828
.build();

api/src/test/java/com/strategyobject/substrateclient/api/SystemPallet.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.strategyobject.substrateclient.api;
22

3-
import com.strategyobject.substrateclient.pallet.annotations.Pallet;
4-
import com.strategyobject.substrateclient.pallet.annotations.Storage;
5-
import com.strategyobject.substrateclient.pallet.annotations.StorageHasher;
6-
import com.strategyobject.substrateclient.pallet.annotations.StorageKey;
7-
import com.strategyobject.substrateclient.rpc.types.BlockHash;
8-
import com.strategyobject.substrateclient.scale.annotations.Scale;
9-
import com.strategyobject.substrateclient.storage.StorageNMap;
3+
import com.strategyobject.substrateclient.pallet.annotation.Pallet;
4+
import com.strategyobject.substrateclient.pallet.annotation.Storage;
5+
import com.strategyobject.substrateclient.pallet.annotation.StorageHasher;
6+
import com.strategyobject.substrateclient.pallet.annotation.StorageKey;
7+
import com.strategyobject.substrateclient.scale.annotation.Scale;
8+
import com.strategyobject.substrateclient.pallet.storage.StorageNMap;
9+
import com.strategyobject.substrateclient.types.BlockHash;
1010

1111
@Pallet("System")
1212
public interface SystemPallet {
@@ -15,7 +15,7 @@ public interface SystemPallet {
1515
keys = {
1616
@StorageKey(
1717
type = @Scale(Integer.class),
18-
hasher = StorageHasher.TwoX64Concat
18+
hasher = StorageHasher.TWOX_64_CONCAT
1919
)
2020
})
2121
StorageNMap<BlockHash> blockHash();

rpc/rpc-sections/src/test/java/com/strategyobject/substrateclient/rpc/sections/AuthorTests.java api/src/test/java/com/strategyobject/substrateclient/api/rpc/AuthorTests.java

+16-28
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1-
package com.strategyobject.substrateclient.rpc.sections;
1+
package com.strategyobject.substrateclient.api.rpc;
22

3+
import com.strategyobject.substrateclient.api.rpc.substitutes.BalanceTransfer;
4+
import com.strategyobject.substrateclient.common.types.Size;
35
import com.strategyobject.substrateclient.common.utils.HexConverter;
4-
import com.strategyobject.substrateclient.crypto.KeyRing;
5-
import com.strategyobject.substrateclient.rpc.core.RpcGeneratedSectionFactory;
6-
import com.strategyobject.substrateclient.rpc.core.RpcInterfaceInitializationException;
7-
import com.strategyobject.substrateclient.rpc.sections.substitutes.BalanceTransfer;
8-
import com.strategyobject.substrateclient.rpc.types.*;
6+
import com.strategyobject.substrateclient.crypto.*;
7+
import com.strategyobject.substrateclient.rpc.RpcGeneratedSectionFactory;
98
import com.strategyobject.substrateclient.tests.containers.SubstrateVersion;
109
import com.strategyobject.substrateclient.tests.containers.TestSubstrateContainer;
1110
import com.strategyobject.substrateclient.transport.ws.WsProvider;
12-
import com.strategyobject.substrateclient.types.KeyPair;
13-
import com.strategyobject.substrateclient.types.PublicKey;
14-
import com.strategyobject.substrateclient.types.Signable;
11+
import com.strategyobject.substrateclient.types.*;
1512
import lombok.val;
1613
import lombok.var;
17-
import org.bouncycastle.crypto.digests.Blake2bDigest;
14+
import org.junit.jupiter.api.Assertions;
1815
import org.junit.jupiter.api.Test;
1916
import org.testcontainers.containers.Network;
2017
import org.testcontainers.junit.jupiter.Container;
@@ -27,12 +24,12 @@
2724
import java.util.concurrent.atomic.AtomicInteger;
2825
import java.util.concurrent.atomic.AtomicReference;
2926

27+
import static org.junit.jupiter.api.Assertions.*;
3028
import static org.awaitility.Awaitility.await;
3129
import static org.hamcrest.Matchers.greaterThan;
32-
import static org.junit.jupiter.api.Assertions.*;
3330

3431
@Testcontainers
35-
public class AuthorTests {
32+
class AuthorTests {
3633
private static final int WAIT_TIMEOUT = 10;
3734
private static final Network network = Network.newNetwork();
3835
private static final AtomicInteger NONCE = new AtomicInteger(0);
@@ -41,17 +38,8 @@ public class AuthorTests {
4138
static final TestSubstrateContainer substrate = new TestSubstrateContainer(SubstrateVersion.V3_0_0)
4239
.withNetwork(network);
4340

44-
private static byte[] blake2(byte[] value) {
45-
val digest = new Blake2bDigest(256);
46-
digest.update(value, 0, value.length);
47-
48-
val result = new byte[32];
49-
digest.doFinal(result, 0);
50-
return result;
51-
}
52-
5341
@Test
54-
void hasKey() throws ExecutionException, InterruptedException, TimeoutException, RpcInterfaceInitializationException {
42+
void hasKey() throws ExecutionException, InterruptedException, TimeoutException {
5543
try (WsProvider wsProvider = WsProvider.builder()
5644
.setEndpoint(substrate.getWsAddress())
5745
.disableAutoConnect()
@@ -75,7 +63,7 @@ void hasKey() throws ExecutionException, InterruptedException, TimeoutException,
7563
}
7664

7765
@Test
78-
void insertKey() throws ExecutionException, InterruptedException, TimeoutException, RpcInterfaceInitializationException {
66+
void insertKey() throws ExecutionException, InterruptedException, TimeoutException {
7967
try (WsProvider wsProvider = WsProvider.builder()
8068
.setEndpoint(substrate.getWsAddress())
8169
.disableAutoConnect()
@@ -84,7 +72,7 @@ void insertKey() throws ExecutionException, InterruptedException, TimeoutExcepti
8472

8573
Author rpcSection = RpcGeneratedSectionFactory.create(Author.class, wsProvider);
8674

87-
assertDoesNotThrow(() -> rpcSection.insertKey("aura",
75+
Assertions.assertDoesNotThrow(() -> rpcSection.insertKey("aura",
8876
"alice",
8977
PublicKey.fromBytes(
9078
HexConverter.toBytes("0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d")))
@@ -93,7 +81,7 @@ void insertKey() throws ExecutionException, InterruptedException, TimeoutExcepti
9381
}
9482

9583
@Test
96-
void submitExtrinsic() throws ExecutionException, InterruptedException, TimeoutException, RpcInterfaceInitializationException {
84+
void submitExtrinsic() throws ExecutionException, InterruptedException, TimeoutException {
9785
try (WsProvider wsProvider = WsProvider.builder()
9886
.setEndpoint(substrate.getWsAddress())
9987
.disableAutoConnect()
@@ -105,13 +93,13 @@ void submitExtrinsic() throws ExecutionException, InterruptedException, TimeoutE
10593
val genesis = chainSection.getBlockHash(0).get(WAIT_TIMEOUT, TimeUnit.SECONDS);
10694
Author authorSection = RpcGeneratedSectionFactory.create(Author.class, wsProvider);
10795

108-
assertDoesNotThrow(() -> authorSection.submitExtrinsic(createBalanceTransferExtrinsic(genesis, NONCE.getAndIncrement()))
96+
Assertions.assertDoesNotThrow(() -> authorSection.submitExtrinsic(createBalanceTransferExtrinsic(genesis, NONCE.getAndIncrement()))
10997
.get(WAIT_TIMEOUT, TimeUnit.SECONDS));
11098
}
11199
}
112100

113101
@Test
114-
void submitAndWatchExtrinsic() throws ExecutionException, InterruptedException, TimeoutException, RpcInterfaceInitializationException {
102+
void submitAndWatchExtrinsic() throws ExecutionException, InterruptedException, TimeoutException {
115103
try (WsProvider wsProvider = WsProvider.builder()
116104
.setEndpoint(substrate.getWsAddress())
117105
.disableAutoConnect()
@@ -169,7 +157,7 @@ void submitAndWatchExtrinsic() throws ExecutionException, InterruptedException,
169157

170158
private Signature sign(KeyRing keyRing, Signable payload) {
171159
var signed = payload.getBytes();
172-
val signature = signed.length > 256 ? blake2(signed) : signed;
160+
val signature = signed.length > 256 ? Hasher.blake2(Size.of256, signed) : signed;
173161

174162
return Sr25519Signature.from(keyRing.sign(() -> signature));
175163
}

0 commit comments

Comments
 (0)