Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

move block explorer implementations out #15

Merged
merged 1 commit into from
Sep 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package onlydust.com.marketplace.kernel.model;

public enum Environment {
MAINNET, TESTNET
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
package onlydust.com.marketplace.kernel.model.blockchain;


import onlydust.com.marketplace.kernel.model.blockchain.aptos.AptoScan;
import onlydust.com.marketplace.kernel.model.blockchain.aptos.AptosAccountAddress;
import onlydust.com.marketplace.kernel.model.blockchain.aptos.AptosCoinType;
import onlydust.com.marketplace.kernel.model.blockchain.aptos.AptosTransaction;

public interface Aptos {
BlockExplorer<AptosTransaction.Hash> BLOCK_EXPLORER = new AptoScan();

static AptosTransaction.Hash transactionHash(String value) {
return new AptosTransaction.Hash(value);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package onlydust.com.marketplace.kernel.model.blockchain;

import java.math.BigDecimal;
import java.net.URI;
import java.time.ZonedDateTime;
import java.util.Optional;

Expand Down Expand Up @@ -41,14 +40,4 @@ public interface TransferTransaction extends Transaction {

Optional<String> contractAddress();
}

public URI getBlockExplorerUrl(final String reference) {
return switch (this) {
case ETHEREUM -> Ethereum.BLOCK_EXPLORER.url(Ethereum.transactionHash(reference));
case OPTIMISM -> Optimism.BLOCK_EXPLORER.url(Optimism.transactionHash(reference));
case STARKNET -> StarkNet.BLOCK_EXPLORER.url(StarkNet.transactionHash(reference));
case APTOS -> Aptos.BLOCK_EXPLORER.url(Aptos.transactionHash(reference));
case STELLAR -> Stellar.BLOCK_EXPLORER.url(Stellar.transactionHash(reference));
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,10 @@
import onlydust.com.marketplace.kernel.model.blockchain.evm.EvmAccountAddress;
import onlydust.com.marketplace.kernel.model.blockchain.evm.EvmContractAddress;
import onlydust.com.marketplace.kernel.model.blockchain.evm.EvmTransaction;
import onlydust.com.marketplace.kernel.model.blockchain.evm.ethereum.EtherScan;
import onlydust.com.marketplace.kernel.model.blockchain.evm.ethereum.Name;
import onlydust.com.marketplace.kernel.model.blockchain.evm.ethereum.WalletLocator;

public interface Ethereum {
BlockExplorer<EvmTransaction.Hash> BLOCK_EXPLORER = new EtherScan();

static EvmTransaction.Hash transactionHash(String value) {
return new EvmTransaction.Hash(value);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package onlydust.com.marketplace.kernel.model.blockchain;

import lombok.AllArgsConstructor;
import lombok.NonNull;
import onlydust.com.marketplace.kernel.model.blockchain.aptos.AptosTransaction;
import onlydust.com.marketplace.kernel.model.blockchain.evm.EvmTransaction;
import onlydust.com.marketplace.kernel.model.blockchain.starknet.StarknetTransaction;
import onlydust.com.marketplace.kernel.model.blockchain.stellar.StellarTransaction;

import java.net.URI;

@AllArgsConstructor
public class MetaBlockExplorer {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"FacebookBlockExplorer" ^^

private final BlockExplorer<AptosTransaction.Hash> aptosBlockExplorer;
private final BlockExplorer<EvmTransaction.Hash> ethereumBlockExplorer;
private final BlockExplorer<EvmTransaction.Hash> optimismBlockExplorer;
private final BlockExplorer<StarknetTransaction.Hash> starknetBlockExplorer;
private final BlockExplorer<StellarTransaction.Hash> stellarBlockExplorer;

public URI url(final @NonNull Blockchain blockchain, final @NonNull String reference) {
return switch (blockchain) {
case APTOS -> aptosBlockExplorer.url(Aptos.transactionHash(reference));
case ETHEREUM -> ethereumBlockExplorer.url(Ethereum.transactionHash(reference));
case OPTIMISM -> optimismBlockExplorer.url(Ethereum.transactionHash(reference));
case STARKNET -> starknetBlockExplorer.url(StarkNet.transactionHash(reference));
case STELLAR -> stellarBlockExplorer.url(Stellar.transactionHash(reference));
};
}

public URI url(final @NonNull Blockchain.Transaction transaction) {
return url(transaction.blockchain(), transaction.reference());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,8 @@
import onlydust.com.marketplace.kernel.model.blockchain.evm.EvmAccountAddress;
import onlydust.com.marketplace.kernel.model.blockchain.evm.EvmContractAddress;
import onlydust.com.marketplace.kernel.model.blockchain.evm.EvmTransaction;
import onlydust.com.marketplace.kernel.model.blockchain.evm.optimism.EtherScan;

public interface Optimism {
BlockExplorer<EvmTransaction.Hash> BLOCK_EXPLORER = new EtherScan();

static EvmTransaction.Hash transactionHash(String value) {
return new EvmTransaction.Hash(value);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package onlydust.com.marketplace.kernel.model.blockchain;

import onlydust.com.marketplace.kernel.model.blockchain.starknet.StarkScan;
import onlydust.com.marketplace.kernel.model.blockchain.starknet.StarknetAccountAddress;
import onlydust.com.marketplace.kernel.model.blockchain.starknet.StarknetContractAddress;
import onlydust.com.marketplace.kernel.model.blockchain.starknet.StarknetTransaction;

public interface StarkNet {
BlockExplorer<StarknetTransaction.Hash> BLOCK_EXPLORER = new StarkScan();

static StarknetTransaction.Hash transactionHash(String value) {
return new StarknetTransaction.Hash(value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@

import onlydust.com.marketplace.kernel.model.blockchain.stellar.StellarAccountId;
import onlydust.com.marketplace.kernel.model.blockchain.stellar.StellarContractAddress;
import onlydust.com.marketplace.kernel.model.blockchain.stellar.StellarExpert;
import onlydust.com.marketplace.kernel.model.blockchain.stellar.StellarTransaction;

public interface Stellar {
BlockExplorer<StellarTransaction.Hash> BLOCK_EXPLORER = new StellarExpert();

static StellarTransaction.Hash transactionHash(String value) {
return new StellarTransaction.Hash(value);
}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,13 @@

class AptosTest {
@ParameterizedTest()
@ValueSource(strings = {
"",
"02937",
"0x",
"0x0asdf",
"0x12345678901234567890123456789012345678901234567890123456789012345"
})
@ValueSource(strings = {"", "02937", "0x", "0x0asdf", "0x12345678901234567890123456789012345678901234567890123456789012345"})
void should_reject_invalid_address(String value) {
assertThatThrownBy(() -> Aptos.accountAddress(value))
.isInstanceOf(OnlyDustException.class);
assertThatThrownBy(() -> Aptos.accountAddress(value)).isInstanceOf(OnlyDustException.class);
}

@ParameterizedTest()
@ValueSource(strings = {
"0x00000000219ab540356cBB839Cbe05303d7705Fa",
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"0xDA9dfA130Df4dE4673b89022EE50ff26f6EA73Cf",
"0x40B38765696e3d5d8d9d834D8AaD4bB6e418E489"
})
@ValueSource(strings = {"0x00000000219ab540356cBB839Cbe05303d7705Fa", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8", "0xDA9dfA130Df4dE4673b89022EE50ff26f6EA73Cf", "0x40B38765696e3d5d8d9d834D8AaD4bB6e418E489"})
void should_accept_valid_address(String value) {
assertDoesNotThrow(() -> Aptos.accountAddress(value));
}
Expand All @@ -44,32 +31,14 @@ void should_sanitize_value() {
}

@ParameterizedTest()
@ValueSource(strings = {
"",
"02937",
"0x",
"0x0asdf",
"0x01234567890123456789012345678901234567890123456789012345678901234"
})
@ValueSource(strings = {"", "02937", "0x", "0x0asdf", "0x01234567890123456789012345678901234567890123456789012345678901234"})
void should_reject_invalid_hash(String value) {
assertThrows(OnlyDustException.class, () -> Aptos.transactionHash(value));
}

@ParameterizedTest()
@ValueSource(strings = {
"0x655cc112b1beaee11d5da8ea53cb9fe9ac315827e0ffed5ae746176a585d4fb4",
"0x024b05cdec5467c2ea102ceedda219f6c75f3710317ba51d3864873381607407",
"0xccc370c2edd90ec64574a1cbc631a194f3cfd5dd6dfce9432860a497a025e090",
"0x4906e5e67af366789ce5568c6573e256a82863b9e901bb3b51d07674bacfeb23"
})
@ValueSource(strings = {"0x655cc112b1beaee11d5da8ea53cb9fe9ac315827e0ffed5ae746176a585d4fb4", "0x024b05cdec5467c2ea102ceedda219f6c75f3710317ba51d3864873381607407", "0xccc370c2edd90ec64574a1cbc631a194f3cfd5dd6dfce9432860a497a025e090", "0x4906e5e67af366789ce5568c6573e256a82863b9e901bb3b51d07674bacfeb23"})
void should_accept_valid_hash(String value) {
assertDoesNotThrow(() -> Aptos.transactionHash(value));
}

@Test
void should_generate_transaction_url() {
assertThat(Aptos.BLOCK_EXPLORER.url(Aptos.transactionHash(
"0x4906e5e67af366789ce5568c6573e256a82863b9e901bb3b51d07674bacfeb23")).toString())
.isEqualTo("https://aptoscan.com/transaction/0x4906e5e67af366789ce5568c6573e256a82863b9e901bb3b51d07674bacfeb23");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,13 @@

class EthereumTest {
@ParameterizedTest()
@ValueSource(strings = {
"",
"02937",
"0x",
"0x0asdf",
"0x12345678901234567890123456789012345678901"
})
@ValueSource(strings = {"", "02937", "0x", "0x0asdf", "0x12345678901234567890123456789012345678901"})
void should_reject_invalid_address(String value) {
assertThatThrownBy(() -> Ethereum.accountAddress(value))
.isInstanceOf(OnlyDustException.class);
assertThatThrownBy(() -> Ethereum.accountAddress(value)).isInstanceOf(OnlyDustException.class);
}

@ParameterizedTest()
@ValueSource(strings = {
"0x00000000219ab540356cBB839Cbe05303d7705Fa",
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
"0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8",
"0xDA9dfA130Df4dE4673b89022EE50ff26f6EA73Cf",
"0x40B38765696e3d5d8d9d834D8AaD4bB6e418E489"
})
@ValueSource(strings = {"0x00000000219ab540356cBB839Cbe05303d7705Fa", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0xBE0eB53F46cd790Cd13851d5EFf43D12404d33E8", "0xDA9dfA130Df4dE4673b89022EE50ff26f6EA73Cf", "0x40B38765696e3d5d8d9d834D8AaD4bB6e418E489"})
void should_accept_valid_address(String value) {
assertDoesNotThrow(() -> Ethereum.accountAddress(value));
}
Expand All @@ -46,56 +33,32 @@ void should_sanitize_value() {
}

@ParameterizedTest()
@ValueSource(strings = {
"",
"02937",
"0x",
"0x0asdf",
"0x01234567890123456789012345678901234567890123456789012345678901234"
})
@ValueSource(strings = {"", "02937", "0x", "0x0asdf", "0x01234567890123456789012345678901234567890123456789012345678901234"})
void should_reject_invalid_hash(String value) {
assertThrows(OnlyDustException.class, () -> Ethereum.transactionHash(value));
}

@ParameterizedTest()
@ValueSource(strings = {
"0xe39906d57d0803f9af7d0d6e0b86c68e6662d26e4a8915c132d50d72869dcc0e",
"0x1ad38e48099d649b36b6357364a175ed186418fb07a0fd8865b27dec28b24a53",
"0xee7421645bda3d6ec073bf91a8ea9efe27a6aa62f640ec01e28411553f6199b7",
"0x019cf81d9b6b0277869b550072365a86b3aa8f41438c084c3d767c215b54f9e2",
"0x19cf81d9b6b0277869b550072365a86b3aa8f41438c084c3d767c215b54f9e2"
})
@ValueSource(strings = {"0xe39906d57d0803f9af7d0d6e0b86c68e6662d26e4a8915c132d50d72869dcc0e", "0x1ad38e48099d649b36b6357364a175ed186418fb07a0fd8865b27dec28b24a53", "0xee7421645bda3d6ec073bf91a8ea9efe27a6aa62f640ec01e28411553f6199b7", "0x019cf81d9b6b0277869b550072365a86b3aa8f41438c084c3d767c215b54f9e2", "0x19cf81d9b6b0277869b550072365a86b3aa8f41438c084c3d767c215b54f9e2"})
void should_accept_valid_hash(String value) {
assertDoesNotThrow(() -> Ethereum.transactionHash(value));
}

@Test
void should_generate_transaction_url() {
assertThat(Ethereum.BLOCK_EXPLORER.url(Ethereum.transactionHash("0x1")).toString())
.isEqualTo("https://etherscan.io/tx/0x01");
}

@Test
void should_create_wallet_from_address() {
assertThat(Ethereum.wallet("0x00000000219ab540356cBB839Cbe05303d7705Fa").asString())
.isEqualTo("0x00000000219ab540356cBB839Cbe05303d7705Fa");
assertThat(Ethereum.wallet("0x00000000219ab540356cBB839Cbe05303d7705Fa").asString()).isEqualTo("0x00000000219ab540356cBB839Cbe05303d7705Fa");

assertThat(Ethereum.wallet("0x00000000219ab540356cBB839Cbe05303d7705Fa").accountAddress())
.isEqualTo(Optional.of(Ethereum.accountAddress("0x00000000219ab540356cBB839Cbe05303d7705Fa")));
assertThat(Ethereum.wallet("0x00000000219ab540356cBB839Cbe05303d7705Fa").accountAddress()).isEqualTo(Optional.of(Ethereum.accountAddress("0x00000000219ab540356cBB839Cbe05303d7705Fa")));

assertThat(Ethereum.wallet("0x00000000219ab540356cBB839Cbe05303d7705Fa").ens())
.isEmpty();
assertThat(Ethereum.wallet("0x00000000219ab540356cBB839Cbe05303d7705Fa").ens()).isEmpty();
}

@Test
void should_create_wallet_from_ens() {
assertThat(Ethereum.wallet("vitalik.eth").asString())
.isEqualTo("vitalik.eth");
assertThat(Ethereum.wallet("vitalik.eth").asString()).isEqualTo("vitalik.eth");

assertThat(Ethereum.wallet("vitalik.eth").accountAddress())
.isEmpty();
assertThat(Ethereum.wallet("vitalik.eth").accountAddress()).isEmpty();

assertThat(Ethereum.wallet("vitalik.eth").ens())
.isEqualTo(Optional.of(Ethereum.name("vitalik.eth")));
assertThat(Ethereum.wallet("vitalik.eth").ens()).isEqualTo(Optional.of(Ethereum.name("vitalik.eth")));
}
}
Loading