explorer: rm
23
Tiltfile
|
@ -497,29 +497,6 @@ if explorer:
|
|||
trigger_mode = trigger_mode,
|
||||
)
|
||||
|
||||
# explorer web app
|
||||
docker_build(
|
||||
ref = "explorer",
|
||||
context = "./explorer",
|
||||
dockerfile = "./explorer/Dockerfile",
|
||||
ignore = ["./explorer/node_modules"],
|
||||
live_update = [
|
||||
sync("./explorer/src", "/home/node/app/src"),
|
||||
sync("./explorer/public", "/home/node/app/public"),
|
||||
],
|
||||
)
|
||||
|
||||
k8s_yaml_with_ns("devnet/explorer.yaml")
|
||||
|
||||
k8s_resource(
|
||||
"explorer",
|
||||
port_forwards = [
|
||||
port_forward(8001, name = "Explorer Web UI [:8001]", host = webHost),
|
||||
],
|
||||
labels = ["explorer"],
|
||||
trigger_mode = trigger_mode,
|
||||
)
|
||||
|
||||
# terra devnet
|
||||
|
||||
docker_build(
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: explorer
|
||||
labels:
|
||||
app: explorer
|
||||
spec:
|
||||
ports:
|
||||
- port: 8001
|
||||
name: http
|
||||
protocol: TCP
|
||||
clusterIP: None
|
||||
selector:
|
||||
app: explorer
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: explorer
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: explorer
|
||||
serviceName: explorer
|
||||
replicas: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: explorer
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 1
|
||||
containers:
|
||||
- name: explorer
|
||||
image: explorer
|
||||
command:
|
||||
- /usr/local/bin/npm
|
||||
- run
|
||||
- serve
|
||||
tty: true
|
||||
ports:
|
||||
- containerPort: 8001
|
||||
name: gatsbyserver
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
port: gatsbyserver
|
||||
path: /
|
|
@ -1,125 +0,0 @@
|
|||
GATSBY_SITE_URL=http://localhost:8000
|
||||
GATSBY_GA_TAG=G-tag-goes-here
|
||||
|
||||
GATSBY_GUARDIAN_DEVNET_RPC_URL=http://localhost:7071
|
||||
GATSBY_GUARDIAN_TESTNET_RPC_URL=https://wormhole-v2-testnet-api.certus.one
|
||||
GATSBY_GUARDIAN_MAINNET_RPC_URL=https://wormhole-v2-mainnet-api.certus.one
|
||||
|
||||
GATSBY_BIGTABLE_FUNCTIONS_DEVNET_BASE_URL=http://localhost:8090/
|
||||
GATSBY_BIGTABLE_FUNCTIONS_TESTNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/testnet-
|
||||
GATSBY_BIGTABLE_FUNCTIONS_MAINNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/mainnet-
|
||||
|
||||
GATSBY_DEFAULT_NETWORK=mainnet
|
||||
|
||||
# contract addresses
|
||||
|
||||
## devnet addresses
|
||||
GATSBY_DEVNET_SOLANA_CORE_BRIDGE=Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o
|
||||
GATSBY_DEVNET_SOLANA_TOKEN_BRIDGE=B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE
|
||||
GATSBY_DEVNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
|
||||
|
||||
GATSBY_DEVNET_ETHEREUM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_ETHEREUM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
|
||||
GATSBY_DEVNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
GATSBY_DEVNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
|
||||
GATSBY_DEVNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_AVALANCHE_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_AVALANCHE_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_AVALANCHE_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_OASIS_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_OASIS_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_OASIS_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_AURORA_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_AURORA_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_AURORA_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_FANTOM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_FANTOM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_FANTOM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
## testnet addresses
|
||||
GATSBY_TESTNET_SOLANA_CORE_BRIDGE=Brdguy7BmNB4qwEbcqqMbyV5CyJd2sxQNUn6NEpMSsUb
|
||||
GATSBY_TESTNET_SOLANA_TOKEN_BRIDGE=A4Us8EhCC76XdGAN17L4KpRNEK423nMivVHZzZqFqqBg
|
||||
GATSBY_TESTNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
|
||||
|
||||
GATSBY_TESTNET_ETHEREUM_CORE_BRIDGE=0x44F3e7c20850B3B5f3031114726A9240911D912a
|
||||
GATSBY_TESTNET_ETHEREUM_TOKEN_BRIDGE=0xa6CDAddA6e4B6704705b065E01E52e2486c0FBf6
|
||||
GATSBY_TESTNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
|
||||
GATSBY_TESTNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
GATSBY_TESTNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
|
||||
GATSBY_TESTNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_TESTNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_TESTNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_TESTNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_TESTNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_AVALANCHE_CORE_BRIDGE=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C
|
||||
GATSBY_TESTNET_AVALANCHE_TOKEN_BRIDGE=0x61E44E506Ca5659E6c0bba9b678586fA2d729756
|
||||
GATSBY_TESTNET_AVALANCHE_NFT_BRIDGE=0xD601BAf2EEE3C028344471684F6b27E789D9075D
|
||||
|
||||
GATSBY_TESTNET_OASIS_CORE_BRIDGE=0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb
|
||||
GATSBY_TESTNET_OASIS_TOKEN_BRIDGE=0x88d8004A9BdbfD9D28090A02010C19897a29605c
|
||||
GATSBY_TESTNET_OASIS_NFT_BRIDGE=0xC5c25B41AB0b797571620F5204Afa116A44c0ebA
|
||||
|
||||
GATSBY_TESTNET_AURORA_CORE_BRIDGE=0xBd07292de7b505a4E803CEe286184f7Acf908F5e
|
||||
GATSBY_TESTNET_AURORA_TOKEN_BRIDGE=0xD05eD3ad637b890D68a854d607eEAF11aF456fba
|
||||
GATSBY_TESTNET_AURORA_NFT_BRIDGE=0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24
|
||||
|
||||
GATSBY_TESTNET_FANTOM_CORE_BRIDGE=0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7
|
||||
GATSBY_TESTNET_FANTOM_TOKEN_BRIDGE=0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8
|
||||
GATSBY_TESTNET_FANTOM_NFT_BRIDGE=0x63eD9318628D26BdCB15df58B53BB27231D1B227
|
||||
|
||||
## mainnet addresses
|
||||
GATSBY_MAINNET_SOLANA_CORE_BRIDGE=worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth
|
||||
GATSBY_MAINNET_SOLANA_TOKEN_BRIDGE=wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb
|
||||
GATSBY_MAINNET_SOLANA_NFT_BRIDGE=WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD
|
||||
|
||||
GATSBY_MAINNET_ETHEREUM_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
|
||||
GATSBY_MAINNET_ETHEREUM_TOKEN_BRIDGE=0x3ee18B2214AFF97000D974cf647E7C347E8fa585
|
||||
GATSBY_MAINNET_ETHEREUM_NFT_BRIDGE=0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
|
||||
|
||||
GATSBY_MAINNET_TERRA_CORE_BRIDGE=terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5
|
||||
GATSBY_MAINNET_TERRA_TOKEN_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
GATSBY_MAINNET_TERRA_NFT_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
|
||||
GATSBY_MAINNET_BSC_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
|
||||
GATSBY_MAINNET_BSC_TOKEN_BRIDGE=0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7
|
||||
GATSBY_MAINNET_BSC_NFT_BRIDGE=0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE
|
||||
|
||||
GATSBY_MAINNET_POLYGON_CORE_BRIDGE=0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7
|
||||
GATSBY_MAINNET_POLYGON_TOKEN_BRIDGE=0x5a58505a96d1dbf8df91cb21b54419fc36e93fde
|
||||
GATSBY_MAINNET_POLYGON_NFT_BRIDGE=0x90bbd86a6fe93d3bc3ed6335935447e75fab7fcf
|
||||
|
||||
GATSBY_MAINNET_AVALANCHE_CORE_BRIDGE=0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c
|
||||
GATSBY_MAINNET_AVALANCHE_TOKEN_BRIDGE=0x0e082F06FF657D94310cB8cE8B0D9a04541d8052
|
||||
GATSBY_MAINNET_AVALANCHE_NFT_BRIDGE=0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5
|
||||
|
||||
GATSBY_MAINNET_OASIS_CORE_BRIDGE=0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585
|
||||
GATSBY_MAINNET_OASIS_TOKEN_BRIDGE=0x5848c791e09901b40a9ef749f2a6735b418d7564
|
||||
GATSBY_MAINNET_OASIS_NFT_BRIDGE=0x04952d522ff217f40b5ef3cbf659eca7b952a6c1
|
||||
|
||||
GATSBY_MAINNET_AURORA_CORE_BRIDGE=0xa321448d90d4e5b0A732867c18eA198e75CAC48E
|
||||
GATSBY_MAINNET_AURORA_TOKEN_BRIDGE=0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F
|
||||
GATSBY_MAINNET_AURORA_NFT_BRIDGE=0x6dcC0484472523ed9Cdc017F711Bcbf909789284
|
||||
|
||||
GATSBY_MAINNET_FANTOM_CORE_BRIDGE=0x126783A6Cb203a3E35344528B26ca3a0489a1485
|
||||
GATSBY_MAINNET_FANTOM_TOKEN_BRIDGE=0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2
|
||||
GATSBY_MAINNET_FANTOM_NFT_BRIDGE=0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535
|
|
@ -1,126 +0,0 @@
|
|||
GATSBY_SITE_URL=https://wormholenetwork.com
|
||||
GATSBY_GA_TAG=G-TF5EQYS7RL
|
||||
|
||||
GATSBY_GUARDIAN_DEVNET_RPC_URL=http://localhost:7071
|
||||
GATSBY_GUARDIAN_TESTNET_RPC_URL=https://wormhole-v2-testnet-api.certus.one
|
||||
GATSBY_GUARDIAN_MAINNET_RPC_URL=https://wormhole-v2-mainnet-api.certus.one
|
||||
|
||||
GATSBY_BIGTABLE_FUNCTIONS_DEVNET_BASE_URL=http://localhost:8090/
|
||||
GATSBY_BIGTABLE_FUNCTIONS_TESTNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/testnet-
|
||||
GATSBY_BIGTABLE_FUNCTIONS_MAINNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/mainnet-
|
||||
|
||||
GATSBY_DEFAULT_NETWORK=mainnet
|
||||
|
||||
# contract addresses
|
||||
|
||||
## devnet addresses
|
||||
GATSBY_DEVNET_SOLANA_CORE_BRIDGE=Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o
|
||||
GATSBY_DEVNET_SOLANA_TOKEN_BRIDGE=B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE
|
||||
GATSBY_DEVNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
|
||||
|
||||
GATSBY_DEVNET_ETHEREUM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_ETHEREUM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
|
||||
GATSBY_DEVNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
GATSBY_DEVNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
|
||||
GATSBY_DEVNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_AVALANCHE_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_AVALANCHE_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_AVALANCHE_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_OASIS_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_OASIS_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_OASIS_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_AURORA_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_AURORA_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_AURORA_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_FANTOM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_FANTOM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_FANTOM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
## testnet addresses
|
||||
GATSBY_TESTNET_SOLANA_CORE_BRIDGE=Brdguy7BmNB4qwEbcqqMbyV5CyJd2sxQNUn6NEpMSsUb
|
||||
GATSBY_TESTNET_SOLANA_TOKEN_BRIDGE=A4Us8EhCC76XdGAN17L4KpRNEK423nMivVHZzZqFqqBg
|
||||
GATSBY_TESTNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
|
||||
|
||||
GATSBY_TESTNET_ETHEREUM_CORE_BRIDGE=0x44F3e7c20850B3B5f3031114726A9240911D912a
|
||||
GATSBY_TESTNET_ETHEREUM_TOKEN_BRIDGE=0xa6CDAddA6e4B6704705b065E01E52e2486c0FBf6
|
||||
GATSBY_TESTNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
|
||||
GATSBY_TESTNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
GATSBY_TESTNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
|
||||
GATSBY_TESTNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_TESTNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_TESTNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_TESTNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_TESTNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_AVALANCHE_CORE_BRIDGE=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C
|
||||
GATSBY_TESTNET_AVALANCHE_TOKEN_BRIDGE=0x61E44E506Ca5659E6c0bba9b678586fA2d729756
|
||||
GATSBY_TESTNET_AVALANCHE_NFT_BRIDGE=0xD601BAf2EEE3C028344471684F6b27E789D9075D
|
||||
|
||||
GATSBY_TESTNET_OASIS_CORE_BRIDGE=0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb
|
||||
GATSBY_TESTNET_OASIS_TOKEN_BRIDGE=0x88d8004A9BdbfD9D28090A02010C19897a29605c
|
||||
GATSBY_TESTNET_OASIS_NFT_BRIDGE=0xC5c25B41AB0b797571620F5204Afa116A44c0ebA
|
||||
|
||||
GATSBY_TESTNET_AURORA_CORE_BRIDGE=0xBd07292de7b505a4E803CEe286184f7Acf908F5e
|
||||
GATSBY_TESTNET_AURORA_TOKEN_BRIDGE=0xD05eD3ad637b890D68a854d607eEAF11aF456fba
|
||||
GATSBY_TESTNET_AURORA_NFT_BRIDGE=0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24
|
||||
|
||||
GATSBY_TESTNET_FANTOM_CORE_BRIDGE=0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7
|
||||
GATSBY_TESTNET_FANTOM_TOKEN_BRIDGE=0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8
|
||||
GATSBY_TESTNET_FANTOM_NFT_BRIDGE=0x63eD9318628D26BdCB15df58B53BB27231D1B227
|
||||
|
||||
## mainnet addresses
|
||||
GATSBY_MAINNET_SOLANA_CORE_BRIDGE=worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth
|
||||
GATSBY_MAINNET_SOLANA_TOKEN_BRIDGE=wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb
|
||||
GATSBY_MAINNET_SOLANA_NFT_BRIDGE=WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD
|
||||
|
||||
GATSBY_MAINNET_ETHEREUM_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
|
||||
GATSBY_MAINNET_ETHEREUM_TOKEN_BRIDGE=0x3ee18B2214AFF97000D974cf647E7C347E8fa585
|
||||
GATSBY_MAINNET_ETHEREUM_NFT_BRIDGE=0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
|
||||
|
||||
GATSBY_MAINNET_TERRA_CORE_BRIDGE=terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5
|
||||
GATSBY_MAINNET_TERRA_TOKEN_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
GATSBY_MAINNET_TERRA_NFT_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
|
||||
GATSBY_MAINNET_BSC_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
|
||||
GATSBY_MAINNET_BSC_TOKEN_BRIDGE=0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7
|
||||
GATSBY_MAINNET_BSC_NFT_BRIDGE=0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE
|
||||
|
||||
GATSBY_MAINNET_POLYGON_CORE_BRIDGE=0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7
|
||||
GATSBY_MAINNET_POLYGON_TOKEN_BRIDGE=0x5a58505a96d1dbf8df91cb21b54419fc36e93fde
|
||||
GATSBY_MAINNET_POLYGON_NFT_BRIDGE=0x90bbd86a6fe93d3bc3ed6335935447e75fab7fcf
|
||||
|
||||
GATSBY_MAINNET_AVALANCHE_CORE_BRIDGE=0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c
|
||||
GATSBY_MAINNET_AVALANCHE_TOKEN_BRIDGE=0x0e082F06FF657D94310cB8cE8B0D9a04541d8052
|
||||
GATSBY_MAINNET_AVALANCHE_NFT_BRIDGE=0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5
|
||||
|
||||
GATSBY_MAINNET_OASIS_CORE_BRIDGE=0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585
|
||||
GATSBY_MAINNET_OASIS_TOKEN_BRIDGE=0x5848c791e09901b40a9ef749f2a6735b418d7564
|
||||
GATSBY_MAINNET_OASIS_NFT_BRIDGE=0x04952d522ff217f40b5ef3cbf659eca7b952a6c1
|
||||
|
||||
GATSBY_MAINNET_AURORA_CORE_BRIDGE=0xa321448d90d4e5b0A732867c18eA198e75CAC48E
|
||||
GATSBY_MAINNET_AURORA_TOKEN_BRIDGE=0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F
|
||||
GATSBY_MAINNET_AURORA_NFT_BRIDGE=0x6dcC0484472523ed9Cdc017F711Bcbf909789284
|
||||
|
||||
GATSBY_MAINNET_FANTOM_CORE_BRIDGE=0x126783A6Cb203a3E35344528B26ca3a0489a1485
|
||||
GATSBY_MAINNET_FANTOM_TOKEN_BRIDGE=0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2
|
||||
GATSBY_MAINNET_FANTOM_NFT_BRIDGE=0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
GATSBY_SITE_URL=http://localhost:8000
|
||||
GATSBY_GA_TAG=G-tag-goes-here
|
||||
|
||||
GATSBY_GUARDIAN_DEVNET_RPC_URL=http://localhost:7071
|
||||
GATSBY_GUARDIAN_TESTNET_RPC_URL=https://wormhole-v2-testnet-api.certus.one
|
||||
GATSBY_GUARDIAN_MAINNET_RPC_URL=https://wormhole-v2-mainnet-api.certus.one
|
||||
|
||||
GATSBY_BIGTABLE_FUNCTIONS_DEVNET_BASE_URL=http://localhost:8090/
|
||||
GATSBY_BIGTABLE_FUNCTIONS_TESTNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/testnet-
|
||||
GATSBY_BIGTABLE_FUNCTIONS_MAINNET_BASE_URL=https://europe-west3-wormhole-315720.cloudfunctions.net/mainnet-
|
||||
|
||||
GATSBY_DEFAULT_NETWORK=mainnet
|
||||
|
||||
# contract addresses
|
||||
|
||||
## devnet addresses
|
||||
GATSBY_DEVNET_SOLANA_CORE_BRIDGE=Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o
|
||||
GATSBY_DEVNET_SOLANA_TOKEN_BRIDGE=B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE
|
||||
GATSBY_DEVNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
|
||||
|
||||
GATSBY_DEVNET_ETHEREUM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_ETHEREUM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
|
||||
GATSBY_DEVNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
GATSBY_DEVNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
|
||||
GATSBY_DEVNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_AVALANCHE_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_AVALANCHE_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_AVALANCHE_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_OASIS_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_OASIS_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_OASIS_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_AURORA_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_AURORA_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_AURORA_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_DEVNET_FANTOM_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_DEVNET_FANTOM_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_DEVNET_FANTOM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
## testnet addresses
|
||||
GATSBY_TESTNET_SOLANA_CORE_BRIDGE=Brdguy7BmNB4qwEbcqqMbyV5CyJd2sxQNUn6NEpMSsUb
|
||||
GATSBY_TESTNET_SOLANA_TOKEN_BRIDGE=A4Us8EhCC76XdGAN17L4KpRNEK423nMivVHZzZqFqqBg
|
||||
GATSBY_TESTNET_SOLANA_NFT_BRIDGE=NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA
|
||||
|
||||
GATSBY_TESTNET_ETHEREUM_CORE_BRIDGE=0x44F3e7c20850B3B5f3031114726A9240911D912a
|
||||
GATSBY_TESTNET_ETHEREUM_TOKEN_BRIDGE=0xa6CDAddA6e4B6704705b065E01E52e2486c0FBf6
|
||||
GATSBY_TESTNET_ETHEREUM_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_TERRA_CORE_BRIDGE=terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5
|
||||
GATSBY_TESTNET_TERRA_TOKEN_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
GATSBY_TESTNET_TERRA_NFT_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
|
||||
GATSBY_TESTNET_BSC_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_TESTNET_BSC_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_TESTNET_BSC_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_POLYGON_CORE_BRIDGE=0xC89Ce4735882C9F0f0FE26686c53074E09B0D550
|
||||
GATSBY_TESTNET_POLYGON_TOKEN_BRIDGE=0x0290FB167208Af455bB137780163b7B7a9a10C16
|
||||
GATSBY_TESTNET_POLYGON_NFT_BRIDGE=0x26b4afb60d6c903165150c6f0aa14f8016be4aec
|
||||
|
||||
GATSBY_TESTNET_AVALANCHE_CORE_BRIDGE=0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C
|
||||
GATSBY_TESTNET_AVALANCHE_TOKEN_BRIDGE=0x61E44E506Ca5659E6c0bba9b678586fA2d729756
|
||||
GATSBY_TESTNET_AVALANCHE_NFT_BRIDGE=0xD601BAf2EEE3C028344471684F6b27E789D9075D
|
||||
|
||||
GATSBY_TESTNET_OASIS_CORE_BRIDGE=0xc1C338397ffA53a2Eb12A7038b4eeb34791F8aCb
|
||||
GATSBY_TESTNET_OASIS_TOKEN_BRIDGE=0x88d8004A9BdbfD9D28090A02010C19897a29605c
|
||||
GATSBY_TESTNET_OASIS_NFT_BRIDGE=0xC5c25B41AB0b797571620F5204Afa116A44c0ebA
|
||||
|
||||
GATSBY_TESTNET_AURORA_CORE_BRIDGE=0xBd07292de7b505a4E803CEe286184f7Acf908F5e
|
||||
GATSBY_TESTNET_AURORA_TOKEN_BRIDGE=0xD05eD3ad637b890D68a854d607eEAF11aF456fba
|
||||
GATSBY_TESTNET_AURORA_NFT_BRIDGE=0x8F399607E9BA2405D87F5f3e1B78D950b44b2e24
|
||||
|
||||
GATSBY_TESTNET_FANTOM_CORE_BRIDGE=0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7
|
||||
GATSBY_TESTNET_FANTOM_TOKEN_BRIDGE=0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8
|
||||
GATSBY_TESTNET_FANTOM_NFT_BRIDGE=0x63eD9318628D26BdCB15df58B53BB27231D1B227
|
||||
|
||||
## mainnet addresses
|
||||
GATSBY_MAINNET_SOLANA_CORE_BRIDGE=worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth
|
||||
GATSBY_MAINNET_SOLANA_TOKEN_BRIDGE=wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb
|
||||
GATSBY_MAINNET_SOLANA_NFT_BRIDGE=WnFt12ZrnzZrFZkt2xsNsaNWoQribnuQ5B5FrDbwDhD
|
||||
|
||||
GATSBY_MAINNET_ETHEREUM_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
|
||||
GATSBY_MAINNET_ETHEREUM_TOKEN_BRIDGE=0x3ee18B2214AFF97000D974cf647E7C347E8fa585
|
||||
GATSBY_MAINNET_ETHEREUM_NFT_BRIDGE=0x6FFd7EdE62328b3Af38FCD61461Bbfc52F5651fE
|
||||
|
||||
GATSBY_MAINNET_TERRA_CORE_BRIDGE=terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5
|
||||
GATSBY_MAINNET_TERRA_TOKEN_BRIDGE=terra10nmmwe8r3g99a9newtqa7a75xfgs2e8z87r2sf
|
||||
GATSBY_MAINNET_TERRA_NFT_BRIDGE=terra10pyejy66429refv3g35g2t7am0was7ya7kz2a4
|
||||
|
||||
GATSBY_MAINNET_BSC_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B
|
||||
GATSBY_MAINNET_BSC_TOKEN_BRIDGE=0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7
|
||||
GATSBY_MAINNET_BSC_NFT_BRIDGE=0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE
|
||||
|
||||
GATSBY_MAINNET_POLYGON_CORE_BRIDGE=0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7
|
||||
GATSBY_MAINNET_POLYGON_TOKEN_BRIDGE=0x5a58505a96d1dbf8df91cb21b54419fc36e93fde
|
||||
GATSBY_MAINNET_POLYGON_NFT_BRIDGE=0x90bbd86a6fe93d3bc3ed6335935447e75fab7fcf
|
||||
|
||||
GATSBY_MAINNET_AVALANCHE_CORE_BRIDGE=0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c
|
||||
GATSBY_MAINNET_AVALANCHE_TOKEN_BRIDGE=0x0e082F06FF657D94310cB8cE8B0D9a04541d8052
|
||||
GATSBY_MAINNET_AVALANCHE_NFT_BRIDGE=0xf7B6737Ca9c4e08aE573F75A97B73D7a813f5De5
|
||||
|
||||
GATSBY_MAINNET_OASIS_CORE_BRIDGE=0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585
|
||||
GATSBY_MAINNET_OASIS_TOKEN_BRIDGE=0x5848c791e09901b40a9ef749f2a6735b418d7564
|
||||
GATSBY_MAINNET_OASIS_NFT_BRIDGE=0x04952d522ff217f40b5ef3cbf659eca7b952a6c1
|
||||
|
||||
GATSBY_MAINNET_AURORA_CORE_BRIDGE=0xa321448d90d4e5b0A732867c18eA198e75CAC48E
|
||||
GATSBY_MAINNET_AURORA_TOKEN_BRIDGE=0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F
|
||||
GATSBY_MAINNET_AURORA_NFT_BRIDGE=0x6dcC0484472523ed9Cdc017F711Bcbf909789284
|
||||
|
||||
GATSBY_MAINNET_FANTOM_CORE_BRIDGE=0x126783A6Cb203a3E35344528B26ca3a0489a1485
|
||||
GATSBY_MAINNET_FANTOM_TOKEN_BRIDGE=0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2
|
||||
GATSBY_MAINNET_FANTOM_NFT_BRIDGE=0xA9c7119aBDa80d4a4E0C06C8F4d8cF5893234535
|
|
@ -1,3 +0,0 @@
|
|||
node_modules/
|
||||
.cache/
|
||||
public
|
|
@ -1 +0,0 @@
|
|||
save-exact=true
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"cSpell.words": ["bridgesplit", "buidl", "pyth", "roadmap", "Solana", "tiexo"]
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
# syntax=docker.io/docker/dockerfile:1.3@sha256:42399d4635eddd7a9b8a24be879d2f9a930d0ed040a61324cfdf59ef1357b3b2
|
||||
|
||||
# Derivative of ethereum/Dockerfile, look there for an explanation on how it works.
|
||||
FROM node:16-alpine@sha256:004dbac84fed48e20f9888a23e32fa7cf83c2995e174a78d41d9a9dd1e051a20
|
||||
|
||||
RUN mkdir -p /app
|
||||
WORKDIR /app
|
||||
|
||||
ADD package.json .
|
||||
ADD package-lock.json .
|
||||
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
|
||||
npm ci
|
||||
|
||||
ADD . .
|
||||
|
||||
|
||||
RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
|
||||
npm run build
|
|
@ -1,54 +0,0 @@
|
|||
<p align="center">
|
||||
<a href="https://www.gatsbyjs.com/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter">
|
||||
<img alt="Gatsby" src="https://www.gatsbyjs.com/Gatsby-Monogram.svg" width="60" />
|
||||
</a>
|
||||
</p>
|
||||
<h1 align="center">
|
||||
Gatsby minimal starter
|
||||
</h1>
|
||||
|
||||
## 🚀 Quick start
|
||||
|
||||
1. **Create a Gatsby site.**
|
||||
|
||||
Use the Gatsby CLI to create a new site, specifying the minimal starter.
|
||||
|
||||
```shell
|
||||
# create a new Gatsby site using the minimal starter
|
||||
npm init gatsby
|
||||
```
|
||||
|
||||
2. **Start developing.**
|
||||
|
||||
Navigate into your new site’s directory and start it up.
|
||||
|
||||
```shell
|
||||
cd my-gatsby-site/
|
||||
npm run develop
|
||||
```
|
||||
|
||||
3. **Open the code and start customizing!**
|
||||
|
||||
Your site is now running at http://localhost:8000!
|
||||
|
||||
Edit `src/pages/index.js` to see your site update in real-time!
|
||||
|
||||
4. **Learn more**
|
||||
|
||||
- [Documentation](https://www.gatsbyjs.com/docs/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
|
||||
|
||||
- [Tutorials](https://www.gatsbyjs.com/tutorial/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
|
||||
|
||||
- [Guides](https://www.gatsbyjs.com/tutorial/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
|
||||
|
||||
- [API Reference](https://www.gatsbyjs.com/docs/api-reference/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
|
||||
|
||||
- [Plugin Library](https://www.gatsbyjs.com/plugins?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
|
||||
|
||||
- [Cheat Sheet](https://www.gatsbyjs.com/docs/cheat-sheet/?utm_source=starter&utm_medium=readme&utm_campaign=minimal-starter)
|
||||
|
||||
## 🚀 Quick start (Gatsby Cloud)
|
||||
|
||||
Deploy this starter with one click on [Gatsby Cloud](https://www.gatsbyjs.com/cloud/):
|
||||
|
||||
[<img src="https://www.gatsbyjs.com/deploynow.svg" alt="Deploy to Gatsby Cloud">](https://www.gatsbyjs.com/dashboard/deploynow?url=https://github.com/gatsbyjs/gatsby-starter-minimal)
|
|
@ -1,4 +0,0 @@
|
|||
// import "@fontsource/poppins"; // Defaults to weight 400 with all styles included.
|
||||
import "@fontsource/poppins/300.css";
|
||||
import "@fontsource/poppins/400.css";
|
||||
import "./src/styles/global.css"; // bug loading multiple fonts in MuiCssBaseline
|
|
@ -1,38 +0,0 @@
|
|||
require("dotenv").config({
|
||||
path: `.env.${process.env.NODE_ENV}`,
|
||||
});
|
||||
const siteMetadata = {
|
||||
siteUrl: process.env.GATSBY_SITE_URL,
|
||||
title: "Wormhole",
|
||||
};
|
||||
module.exports = {
|
||||
siteMetadata,
|
||||
plugins: [
|
||||
`gatsby-plugin-react-helmet`,
|
||||
`gatsby-plugin-top-layout`,
|
||||
`gatsby-plugin-material-ui`,
|
||||
{
|
||||
resolve: "gatsby-plugin-robots-txt",
|
||||
options: {
|
||||
host: siteMetadata.siteUrl,
|
||||
sitemap: `${siteMetadata.siteUrl}/sitemap/sitemap-index.xml`,
|
||||
env: {
|
||||
development: {
|
||||
policy: [{ userAgent: "*", disallow: ["/"] }],
|
||||
},
|
||||
production: {
|
||||
policy: [{ userAgent: "*", allow: "/" }],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
`gatsby-plugin-sitemap`,
|
||||
{
|
||||
resolve: `gatsby-plugin-google-gtag`,
|
||||
options: {
|
||||
trackingIds: [String(process.env.GATSBY_GA_TAG)],
|
||||
},
|
||||
},
|
||||
`gatsby-plugin-meta-redirect`, // make sure to put last in the array
|
||||
],
|
||||
};
|
|
@ -1,59 +0,0 @@
|
|||
/**
|
||||
* Implement Gatsby's Node APIs in this file.
|
||||
*
|
||||
* See: https://www.gatsbyjs.com/docs/node-apis/
|
||||
*/
|
||||
|
||||
const webpack = require("webpack");
|
||||
|
||||
exports.onCreateWebpackConfig = function addPathMapping({
|
||||
stage,
|
||||
actions,
|
||||
getConfig,
|
||||
}) {
|
||||
actions.setWebpackConfig({
|
||||
experiments: {
|
||||
asyncWebAssembly: true,
|
||||
},
|
||||
plugins: [
|
||||
// Work around for Buffer is undefined:
|
||||
// https://github.com/webpack/changelog-v5/issues/10
|
||||
new webpack.ProvidePlugin({
|
||||
Buffer: ["buffer", "Buffer"],
|
||||
}),
|
||||
],
|
||||
resolve: {
|
||||
fallback: {
|
||||
buffer: require.resolve("buffer"),
|
||||
fs: false,
|
||||
path: false,
|
||||
stream: require.resolve("stream-browserify"),
|
||||
crypto: require.resolve("crypto-browserify"),
|
||||
},
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
exports.createPages = ({ actions }) => {
|
||||
const { createRedirect } = actions;
|
||||
createRedirect({
|
||||
fromPath: "/en/",
|
||||
toPath: "/",
|
||||
isPermanent: true,
|
||||
});
|
||||
createRedirect({
|
||||
fromPath: "/en/about/",
|
||||
toPath: "/buidl/",
|
||||
isPermanent: true,
|
||||
});
|
||||
createRedirect({
|
||||
fromPath: "/en/network/",
|
||||
toPath: "/network/",
|
||||
isPermanent: true,
|
||||
});
|
||||
createRedirect({
|
||||
fromPath: "/en/explorer/",
|
||||
toPath: "/explorer/",
|
||||
isPermanent: true,
|
||||
});
|
||||
};
|
|
@ -1,48 +0,0 @@
|
|||
{
|
||||
"name": "wormhole",
|
||||
"version": "1.0.0",
|
||||
"private": false,
|
||||
"scripts": {
|
||||
"develop": "gatsby develop",
|
||||
"start": "gatsby develop",
|
||||
"build": "gatsby build",
|
||||
"serve": "gatsby serve --port=8001 --host=0.0.0.0",
|
||||
"clean": "gatsby clean"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certusone/wormhole-sdk": "0.2.7",
|
||||
"@cosmjs/encoding": "^0.27.0",
|
||||
"@emotion/react": "^11.7.1",
|
||||
"@emotion/styled": "^11.6.0",
|
||||
"@fontsource/poppins": "^4.5.0",
|
||||
"@mui/icons-material": "^5.2.5",
|
||||
"@mui/lab": "^5.0.0-alpha.64",
|
||||
"@mui/material": "^5.2.7",
|
||||
"@mui/system": "^5.2.6",
|
||||
"@nivo/bar": "^0.79.1",
|
||||
"buffer": "^6.0.3",
|
||||
"crypto-browserify": "3.12.0",
|
||||
"dotenv": "^10.0.0",
|
||||
"ethers": "^5.4.1",
|
||||
"gatsby": "^4.4.0",
|
||||
"gatsby-plugin-google-gtag": "^4.4.0",
|
||||
"gatsby-plugin-material-ui": "^4.1.0",
|
||||
"gatsby-plugin-meta-redirect": "1.1.1",
|
||||
"gatsby-plugin-react-helmet": "^5.4.0",
|
||||
"gatsby-plugin-robots-txt": "^1.6.14",
|
||||
"gatsby-plugin-sitemap": "^5.4.0",
|
||||
"gsap": "3.9.1",
|
||||
"javascript-time-ago": "^2.3.10",
|
||||
"path-browserify": "^1.0.1",
|
||||
"react": "^17.0.1",
|
||||
"react-dom": "^17.0.1",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-time-ago": "^7.1.7",
|
||||
"stream-browserify": "^3.0.0",
|
||||
"util": "^0.12.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react-helmet": "6.1.5",
|
||||
"wasm-loader": "^1.3.0"
|
||||
}
|
||||
}
|
|
@ -1,162 +0,0 @@
|
|||
import {
|
||||
createTheme,
|
||||
CssBaseline,
|
||||
responsiveFontSizes,
|
||||
ThemeProvider,
|
||||
} from "@mui/material";
|
||||
import TimeAgo from "javascript-time-ago";
|
||||
import en from "javascript-time-ago/locale/en";
|
||||
import React from "react";
|
||||
import { NetworkContextProvider } from "../../src/contexts/NetworkContext";
|
||||
import bg from "../../src/images/bg.svg";
|
||||
import { Helmet } from "react-helmet";
|
||||
|
||||
import Suisse from "../../src/fonts/SuisseBPIntlBold.woff2";
|
||||
|
||||
TimeAgo.addDefaultLocale(en);
|
||||
|
||||
let theme = createTheme({
|
||||
palette: {
|
||||
mode: "dark",
|
||||
background: {
|
||||
default: "#17153f",
|
||||
},
|
||||
},
|
||||
typography: {
|
||||
fontFamily: ["Poppins", "Arial"].join(","),
|
||||
fontSize: 13,
|
||||
body1: {
|
||||
fontWeight: 300,
|
||||
},
|
||||
body2: {
|
||||
fontWeight: 300,
|
||||
},
|
||||
h1: {
|
||||
fontWeight: "bold",
|
||||
fontFamily: ["Suisse BP Intl", "Arial"],
|
||||
lineHeight: 0.9,
|
||||
letterSpacing: -2.7,
|
||||
},
|
||||
h3: {
|
||||
fontSize: 49,
|
||||
fontWeight: "bold",
|
||||
fontFamily: "Suisse BP Intl",
|
||||
lineHeight: 0.9,
|
||||
letterSpacing: -1.47,
|
||||
},
|
||||
h4: {
|
||||
fontSize: 40,
|
||||
fontWeight: "bold",
|
||||
fontFamily: "Suisse BP Intl",
|
||||
letterSpacing: -1.2,
|
||||
lineHeight: 0.9,
|
||||
},
|
||||
caption: {
|
||||
textTransform: "uppercase",
|
||||
fontSize: 8,
|
||||
letterSpacing: 2,
|
||||
fontFamily: "Suisse BP Intl",
|
||||
fontWeight: 400,
|
||||
display: "block",
|
||||
marginTop: 10,
|
||||
},
|
||||
},
|
||||
|
||||
components: {
|
||||
MuiCssBaseline: {
|
||||
styleOverrides: {
|
||||
body: {
|
||||
overscrollBehaviorY: "none",
|
||||
backgroundColor: "#17153f",
|
||||
backgroundImage: `url(${bg})`,
|
||||
backgroundPosition: "top center",
|
||||
backgroundRepeat: "repeat-y",
|
||||
backgroundSize: "120%",
|
||||
},
|
||||
ul: {
|
||||
paddingLeft: "0px",
|
||||
},
|
||||
"*": {
|
||||
scrollbarWidth: "thin",
|
||||
scrollbarColor: `#4e4e54 rgba(0,0,0,.25)`,
|
||||
},
|
||||
"*::-webkit-scrollbar": {
|
||||
width: "8px",
|
||||
height: "8px",
|
||||
backgroundColor: "rgba(0, 0, 0, 0.25)",
|
||||
},
|
||||
"*::-webkit-scrollbar-thumb": {
|
||||
backgroundColor: "#4e4e54",
|
||||
borderRadius: "4px",
|
||||
},
|
||||
"*::-webkit-scrollbar-corner": {
|
||||
// this hides an annoying white box which appears when both scrollbars are present
|
||||
backgroundColor: "transparent",
|
||||
},
|
||||
},
|
||||
},
|
||||
MuiButton: {
|
||||
styleOverrides: {
|
||||
root: {
|
||||
borderRadius: 22,
|
||||
fontSize: 12,
|
||||
fontWeight: 700,
|
||||
letterSpacing: 1.5,
|
||||
padding: "8px 22.5px 8px",
|
||||
"&:hover .MuiButton-endIcon": {
|
||||
transform: "translateX(4px)",
|
||||
},
|
||||
},
|
||||
contained: {
|
||||
boxShadow: "none",
|
||||
"&:hover": {
|
||||
boxShadow: "none",
|
||||
},
|
||||
"&:active": {
|
||||
boxShadow: "none",
|
||||
},
|
||||
},
|
||||
endIcon: {
|
||||
marginLeft: 12,
|
||||
transition: "transform 300ms",
|
||||
},
|
||||
},
|
||||
},
|
||||
MuiOutlinedInput: {
|
||||
styleOverrides: {
|
||||
notchedOutline: {
|
||||
borderRadius: 24,
|
||||
},
|
||||
},
|
||||
},
|
||||
MuiSelect: {
|
||||
styleOverrides: {
|
||||
select: {
|
||||
paddingTop: 8,
|
||||
paddingRight: "40px!important",
|
||||
paddingBottom: 8,
|
||||
paddingLeft: 20,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
theme = responsiveFontSizes(theme);
|
||||
|
||||
const TopLayout = ({ children }) => (
|
||||
<ThemeProvider theme={theme}>
|
||||
<Helmet>
|
||||
<link
|
||||
rel="preload"
|
||||
as="font"
|
||||
href={Suisse}
|
||||
type="font/woff2"
|
||||
crossOrigin="anonymous"
|
||||
/>
|
||||
</Helmet>
|
||||
<CssBaseline />
|
||||
<NetworkContextProvider>{children}</NetworkContextProvider>
|
||||
</ThemeProvider>
|
||||
);
|
||||
|
||||
export default TopLayout;
|
|
@ -1,6 +0,0 @@
|
|||
import React from "react";
|
||||
import TopLayout from "./TopLayout";
|
||||
|
||||
export const wrapRootElement = ({ element }) => (
|
||||
<TopLayout>{element}</TopLayout>
|
||||
);
|
|
@ -1,6 +0,0 @@
|
|||
import React from "react";
|
||||
import TopLayout from "./TopLayout";
|
||||
|
||||
export const wrapRootElement = ({ element }) => (
|
||||
<TopLayout>{element}</TopLayout>
|
||||
);
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"name": "gatsby-plugin-top-layout"
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
import { Box } from "@mui/material";
|
||||
import React from "react";
|
||||
|
||||
const AvoidBreak = ({ spans }: { spans: string[] }) => (
|
||||
<>
|
||||
{spans.map((span, idx) => (
|
||||
<React.Fragment key={`${idx}|${span}`}>
|
||||
<Box component="span" sx={{ display: "inline-block" }}>
|
||||
{span}
|
||||
</Box>{" "}
|
||||
</React.Fragment>
|
||||
))}
|
||||
</>
|
||||
);
|
||||
|
||||
export default AvoidBreak;
|
|
@ -1,60 +0,0 @@
|
|||
import * as React from "react";
|
||||
import binanceChainIcon from "../images/bsc.svg";
|
||||
import ethereumIcon from "../images/eth.svg";
|
||||
import solanaIcon from "../images//solana.svg";
|
||||
import terraIcon from "../images/terra.svg";
|
||||
import polygonIcon from "../images/polygon.svg";
|
||||
import avalancheIcon from "../images/avalanche.svg";
|
||||
import oasisIcon from "../images/oasis.svg";
|
||||
import fantomIcon from "../images/fantom.svg";
|
||||
import auroraIcon from "../images/aurora.svg";
|
||||
import karuraIcon from "../images/karura.svg"
|
||||
import {
|
||||
ChainId,
|
||||
CHAIN_ID_AVAX,
|
||||
CHAIN_ID_BSC,
|
||||
CHAIN_ID_ETH,
|
||||
CHAIN_ID_OASIS,
|
||||
CHAIN_ID_POLYGON,
|
||||
CHAIN_ID_SOLANA,
|
||||
CHAIN_ID_TERRA,
|
||||
CHAIN_ID_FANTOM,
|
||||
CHAIN_ID_AURORA,
|
||||
CHAIN_ID_KARURA,
|
||||
} from "@certusone/wormhole-sdk";
|
||||
import { chainEnums } from "../utils/consts";
|
||||
import { Box } from "@mui/material";
|
||||
|
||||
const chainIdToSrc = {
|
||||
[CHAIN_ID_SOLANA]: solanaIcon,
|
||||
[CHAIN_ID_ETH]: ethereumIcon,
|
||||
[CHAIN_ID_TERRA]: terraIcon,
|
||||
[CHAIN_ID_BSC]: binanceChainIcon,
|
||||
[CHAIN_ID_POLYGON]: polygonIcon,
|
||||
[CHAIN_ID_AVAX]: avalancheIcon,
|
||||
[CHAIN_ID_OASIS]: oasisIcon,
|
||||
[CHAIN_ID_FANTOM]: fantomIcon,
|
||||
[CHAIN_ID_AURORA]: auroraIcon,
|
||||
[CHAIN_ID_KARURA]: karuraIcon,
|
||||
};
|
||||
|
||||
const ChainIcon = ({ chainId }: { chainId: ChainId }) =>
|
||||
chainIdToSrc[chainId] ? (
|
||||
<Box
|
||||
sx={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
px: chainId === CHAIN_ID_ETH ? 0 : 0.25,
|
||||
"&:first-of-type": { pl: 0 },
|
||||
"&:last-of-type": { pr: 0 },
|
||||
}}
|
||||
>
|
||||
<img
|
||||
src={chainIdToSrc[chainId]}
|
||||
alt={chainEnums[chainId] || ""}
|
||||
style={{ width: 16 }}
|
||||
/>
|
||||
</Box>
|
||||
) : null;
|
||||
|
||||
export default ChainIcon;
|
|
@ -1,306 +0,0 @@
|
|||
|
||||
import { BigNumber } from "ethers";
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { Typography } from '@mui/material'
|
||||
import { importCoreWasm } from '@certusone/wormhole-sdk'
|
||||
|
||||
import { chainEnums, ChainIDs, chainIDs, METADATA_REPLACE } from "../utils/consts";
|
||||
import { usdFormatter } from "../utils/explorer";
|
||||
import { TransferDetails, TokenTransferPayload as TransferPayload } from "./ExplorerSearch/ExplorerQuery";
|
||||
|
||||
const validChains = Object.values(chainIDs)
|
||||
|
||||
// these types match/load the descriptions in src/locales
|
||||
type TokenTransfer = "tokenTransfer"
|
||||
type NFTTransfer = "nftTransfer"
|
||||
type AssetMeta = "assetMeta"
|
||||
type Governance = "governance"
|
||||
type Pyth = "pyth"
|
||||
type UnknownMessage = "unknownMessage"
|
||||
|
||||
type PayloadType = TokenTransfer | NFTTransfer | AssetMeta | Governance | Pyth | UnknownMessage
|
||||
|
||||
// the payloads this component can decode
|
||||
const knownPayloads = ["assetMeta", "tokenTransfer", "nftTransfer"]
|
||||
|
||||
|
||||
interface TokenTransferPayload {
|
||||
payloadId: number
|
||||
amount: string
|
||||
originAddress: string
|
||||
originChain: number
|
||||
targetAddress: string
|
||||
targetChain: number
|
||||
}
|
||||
interface NFTTransferPayload {
|
||||
payloadId: number
|
||||
name: string // "Not a PUNK🎸"
|
||||
originAddress: string // "0101010101010101010101010101010101010101010101010101010101010101"
|
||||
originChain: number // 1
|
||||
symbol: string // "PUNK🎸"
|
||||
targetAddress: string // "00000000000000000000000090f8bf6a479f320ead074411a4b0e7944ea8c9c1"
|
||||
targetChain: number // 2
|
||||
tokenId: BigNumber | string // BigNumber { _hex: '0x9c006c48c8cbf33849cb07a3f936159cc523f9591cb1999abd45890ec5fee9b7', _isBigNumber: true }
|
||||
uri: string // "https://wrappedpunks.com:3000/api/punks/metadata/39"
|
||||
}
|
||||
interface AssetMetaPayload {
|
||||
payloadId: number
|
||||
tokenAddress: string
|
||||
tokenChain: number
|
||||
decimals: number
|
||||
symbol: string
|
||||
name: string
|
||||
}
|
||||
// TODO - figure out how to decode these and what they contain
|
||||
interface GovernancePayload { }
|
||||
interface PythPayload { }
|
||||
interface UnknownPayload { }
|
||||
|
||||
type VAAPayload =
|
||||
| TokenTransferPayload
|
||||
| NFTTransferPayload
|
||||
| AssetMetaPayload
|
||||
| GovernancePayload
|
||||
| PythPayload
|
||||
| UnknownPayload
|
||||
|
||||
type TokenTransferBundle = { type: TokenTransfer, payload: TokenTransferPayload }
|
||||
type NFTTransferBundle = { type: NFTTransfer, payload: NFTTransferPayload }
|
||||
type AssetMetaBundle = { type: AssetMeta, payload: AssetMetaPayload }
|
||||
type UnknownMessageBundle = { type: UnknownMessage, payload: UnknownPayload }
|
||||
type PayloadBundle = TokenTransferBundle | NFTTransferBundle | AssetMetaBundle | UnknownMessageBundle
|
||||
|
||||
|
||||
const parseTokenPayload = (arr: Buffer): TokenTransferPayload => ({
|
||||
payloadId: arr.readUInt8(0),
|
||||
amount: BigNumber.from(arr.slice(1, 1 + 32)).toBigInt().toString(),
|
||||
originAddress: arr.slice(33, 33 + 32).toString("hex"),
|
||||
originChain: arr.readUInt16BE(65),
|
||||
targetAddress: arr.slice(67, 67 + 32).toString("hex"),
|
||||
targetChain: arr.readUInt16BE(99),
|
||||
});
|
||||
const parseNFTPayload = (arr: Buffer): NFTTransferPayload => {
|
||||
const payloadId = arr.readUInt8(0)
|
||||
const originAddress = arr.slice(1, 1 + 32).toString("hex");
|
||||
const originChain = arr.readUInt16BE(33)
|
||||
const symbol = Buffer.from(arr.slice(35, 35 + 32))
|
||||
.toString("utf8")
|
||||
.replace(METADATA_REPLACE, "");
|
||||
const name = Buffer.from(arr.slice(67, 67 + 32))
|
||||
.toString("utf8")
|
||||
.replace(METADATA_REPLACE, "");
|
||||
const tokenId = BigNumber.from(arr.slice(99, 99 + 32)).toString()
|
||||
const uri_len = arr.readUInt8(131);
|
||||
const uri = Buffer.from(arr.slice(132, 132 + uri_len))
|
||||
.toString("utf8")
|
||||
.replace(METADATA_REPLACE, "");
|
||||
const target_offset = 132 + uri_len;
|
||||
const targetAddress = arr
|
||||
.slice(target_offset, target_offset + 32)
|
||||
.toString("hex");
|
||||
const targetChain = arr.readUInt16BE(target_offset + 32);
|
||||
return {
|
||||
payloadId,
|
||||
originAddress,
|
||||
originChain,
|
||||
symbol,
|
||||
name,
|
||||
tokenId,
|
||||
uri,
|
||||
targetAddress,
|
||||
targetChain,
|
||||
};
|
||||
};
|
||||
const parseAssetMetaPayload = (arr: Buffer): AssetMetaPayload => {
|
||||
let index = 0
|
||||
const payloadId = arr.readUInt8(0)
|
||||
index += 1
|
||||
|
||||
const tokenAddress = arr.slice(index, index + 32).toString("hex");
|
||||
index += 32
|
||||
|
||||
const tokenChain = arr.readUInt16BE(index)
|
||||
index += 1
|
||||
|
||||
const decimals = arr.readUInt8(index)
|
||||
index += 1
|
||||
|
||||
const symbol = Buffer.from(arr.slice(index, index + 32))
|
||||
.toString("utf8")
|
||||
.replace(METADATA_REPLACE, "")
|
||||
.replace(new RegExp("\u0012", "g"), "")
|
||||
.replace(new RegExp("\u0002", "g"), "")
|
||||
index += 32
|
||||
|
||||
const name = Buffer.from(arr.slice(index, index + 32))
|
||||
.toString("utf8")
|
||||
.replace(METADATA_REPLACE, "");
|
||||
index += 32
|
||||
|
||||
return {
|
||||
payloadId,
|
||||
tokenAddress,
|
||||
tokenChain,
|
||||
decimals,
|
||||
symbol,
|
||||
name
|
||||
}
|
||||
}
|
||||
|
||||
function useBase64ToBuffer(base64VAA: string = "") {
|
||||
const [buf, setBuf] = useState<Buffer>()
|
||||
|
||||
function convertbase64ToBinary(base64: string) {
|
||||
var raw = window.atob(base64);
|
||||
var rawLength = raw.length;
|
||||
var array = new Uint8Array(new ArrayBuffer(rawLength));
|
||||
|
||||
for (let i = 0; i < rawLength; i++) {
|
||||
array[i] = raw.charCodeAt(i);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
async function asyncWork(vaaString: string) {
|
||||
const vaa = convertbase64ToBinary(vaaString)
|
||||
|
||||
// TODO - need to export parse_vaa from @certusone/wormhole-sdk
|
||||
// const bridgeWasm = await import('bridge')
|
||||
const bridgeWasm = await importCoreWasm()
|
||||
|
||||
const parsedVaa = bridgeWasm.parse_vaa(vaa)
|
||||
|
||||
setBuf(Buffer.from(parsedVaa.payload))
|
||||
}
|
||||
asyncWork(base64VAA)
|
||||
}, [base64VAA])
|
||||
return buf
|
||||
}
|
||||
interface DecodePayloadProps {
|
||||
base64VAA?: string
|
||||
emitterChainName: keyof ChainIDs
|
||||
emitterAddress: string
|
||||
showType?: boolean
|
||||
showSummary?: boolean
|
||||
showPayload?: boolean
|
||||
transferPayload?: TransferPayload
|
||||
transferDetails?: TransferDetails
|
||||
}
|
||||
|
||||
const DecodePayload = (props: DecodePayloadProps) => {
|
||||
const buf = useBase64ToBuffer(props.base64VAA)
|
||||
const [payloadBundle, setPayloadBundle] = useState<PayloadBundle>()
|
||||
|
||||
const determineType = (payloadBuffer: Buffer) => {
|
||||
let payload: PayloadBundle["payload"] = {}
|
||||
let type: PayloadBundle["type"] = "unknownMessage"
|
||||
|
||||
let unknown: UnknownMessageBundle = { type: "unknownMessage", payload: {} }
|
||||
let bundle: PayloadBundle = unknown
|
||||
|
||||
// try the types, do some logic on the results
|
||||
let parsedTokenPayload: TokenTransferPayload | undefined
|
||||
let parsedNftPayload: NFTTransferPayload | undefined
|
||||
let parsedAssetMeta: AssetMetaPayload | undefined
|
||||
try {
|
||||
parsedTokenPayload = parseTokenPayload(payloadBuffer)
|
||||
// console.log('parsedTokenPayload: ', parsedTokenPayload)
|
||||
} catch (_) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
try {
|
||||
parsedNftPayload = parseNFTPayload(payloadBuffer)
|
||||
// console.log('parsedNftPayload ', parsedNftPayload)
|
||||
} catch (_) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
try {
|
||||
parsedAssetMeta = parseAssetMetaPayload(payloadBuffer)
|
||||
// console.log('parsedAssetMeta ', parsedAssetMeta)
|
||||
} catch (_) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
// determine which type of payload this is by asserting values
|
||||
if (parsedNftPayload?.uri) {
|
||||
try {
|
||||
// test for valid url
|
||||
new URL(parsedNftPayload.uri);
|
||||
type = "nftTransfer"
|
||||
payload = parsedNftPayload
|
||||
bundle = { type: "nftTransfer", payload: parsedNftPayload }
|
||||
} catch (_) {
|
||||
// probably not an NFT transfer, continue
|
||||
}
|
||||
} else if (parsedTokenPayload && validChains.includes(parsedTokenPayload?.originChain) && validChains.includes(parsedTokenPayload?.targetChain)) {
|
||||
type = "tokenTransfer"
|
||||
payload = parsedTokenPayload
|
||||
bundle = { type: "tokenTransfer", payload: parsedTokenPayload }
|
||||
} else if (parsedAssetMeta && chainIDs[props.emitterChainName] === parsedAssetMeta.tokenChain) {
|
||||
payload = parsedAssetMeta
|
||||
type = "assetMeta"
|
||||
bundle = { type: "assetMeta", payload: parsedAssetMeta }
|
||||
}
|
||||
|
||||
setPayloadBundle(bundle)
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (buf) {
|
||||
determineType(buf)
|
||||
}
|
||||
}, [buf])
|
||||
|
||||
const titleCase = (str: string) => <span style={{ textTransform: 'capitalize' }}>{str}</span>
|
||||
const unknown = "Unknown message"
|
||||
|
||||
return (
|
||||
<>
|
||||
{props.showType && payloadBundle ?
|
||||
<span>
|
||||
|
||||
{props.showSummary && payloadBundle ? (
|
||||
payloadBundle.type === "assetMeta" ? (<>
|
||||
{"AssetMeta:"} {chainEnums[payloadBundle.payload.tokenChain]} {payloadBundle.payload.symbol} {payloadBundle.payload.name}
|
||||
</>) :
|
||||
payloadBundle.type === "tokenTransfer" ?
|
||||
props.transferDetails && payloadBundle.payload && props.transferDetails.OriginSymbol ? (<>
|
||||
{"Transfer"}
|
||||
{(Math.round(Number(props.transferDetails.Amount) * 100) / 100).toLocaleString()} {props.transferDetails.OriginSymbol}
|
||||
{'from'} {titleCase(props.emitterChainName)} {'to'} {chainEnums[Number(payloadBundle.payload.targetChain)]}
|
||||
{'('}{usdFormatter.format(Number(props.transferDetails.NotionalUSDStr))}{')'}
|
||||
</>) : (<>
|
||||
{"Token transfer: "}{chainEnums[payloadBundle.payload.originChain]}{' asset -> '}{chainEnums[payloadBundle.payload.targetChain]}
|
||||
</>) :
|
||||
payloadBundle.type === "nftTransfer" ? (<>
|
||||
{"NFT: "} {payloadBundle.payload.name || "?"} {" wormholed "} {chainEnums[payloadBundle.payload.originChain]}{' -> '}{chainEnums[payloadBundle.payload.targetChain]}
|
||||
</>) : unknown
|
||||
) : unknown}
|
||||
</span> : props.showPayload && payloadBundle ? (
|
||||
<>
|
||||
<div style={{ margin: "20px 0" }} className="styled-scrollbar">
|
||||
<Typography variant="h4"> payload</Typography>
|
||||
<pre style={{ fontSize: 14 }}>{JSON.stringify(payloadBundle.payload, undefined, 2)}</pre>
|
||||
</div>
|
||||
{/* TODO - prettier formatting of payload data. POC below. */}
|
||||
{/* {payloadBundle && payloadBundle.payload && knownPayloads.includes(payloadBundle.type) ? (
|
||||
Object.entries(payloadBundle.payload).map(([key, value]) => {
|
||||
return <Statistic title={key} key={key} value={value} />
|
||||
})
|
||||
) : <span>Can't decode unknown payloads</span>} */}
|
||||
|
||||
</>
|
||||
) : unknown}
|
||||
|
||||
</>
|
||||
)
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { DecodePayload }
|
|
@ -1,40 +0,0 @@
|
|||
import React from "react";
|
||||
import { TextField, Typography, MenuItem } from "@mui/material";
|
||||
|
||||
export type explorerFormType = "txID" | "messageID";
|
||||
|
||||
interface ExplorerFormSelect {
|
||||
currentlyActive: explorerFormType;
|
||||
toggleFormType: () => void;
|
||||
}
|
||||
|
||||
const ExplorerFormSelect: React.FC<ExplorerFormSelect> = ({
|
||||
currentlyActive,
|
||||
toggleFormType,
|
||||
}) => {
|
||||
const onQueryType = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const { value } = event.target;
|
||||
if (value !== currentlyActive) {
|
||||
// toggle the other form type
|
||||
toggleFormType();
|
||||
}
|
||||
};
|
||||
const formatOption = (message: string) => (
|
||||
<Typography variant="body2">{message}</Typography>
|
||||
);
|
||||
return (
|
||||
<TextField
|
||||
select
|
||||
value={currentlyActive}
|
||||
onChange={onQueryType}
|
||||
sx={{
|
||||
mb: 2,
|
||||
}}
|
||||
>
|
||||
<MenuItem value="txID">{formatOption("Search Transaction")}</MenuItem>
|
||||
<MenuItem value="messageID">{formatOption("Search Message ID")}</MenuItem>
|
||||
</TextField>
|
||||
);
|
||||
};
|
||||
|
||||
export default ExplorerFormSelect;
|
|
@ -1,197 +0,0 @@
|
|||
import React, { useEffect, useState } from "react";
|
||||
import { PageProps, navigate } from "gatsby";
|
||||
|
||||
import ExplorerQuery from "./ExplorerQuery";
|
||||
import { chainEnums, ChainID, chainIDs } from "../../utils/consts";
|
||||
import { useNetworkContext } from "../../contexts/NetworkContext";
|
||||
import { truncateAddress } from "../../utils/explorer";
|
||||
|
||||
import {
|
||||
Autocomplete,
|
||||
Button,
|
||||
FormControl,
|
||||
TextField,
|
||||
Typography,
|
||||
MenuItem,
|
||||
Box,
|
||||
} from "@mui/material";
|
||||
import ExplorerFormSelect, { explorerFormType } from "./ExplorerFormSelect";
|
||||
|
||||
// form props
|
||||
interface ExplorerMessageSearchValues {
|
||||
emitterChain: number;
|
||||
emitterAddress: string;
|
||||
sequence: string;
|
||||
}
|
||||
|
||||
const emitterChains = [
|
||||
{ label: ChainID[1], value: chainIDs["solana"] },
|
||||
{ label: ChainID[2], value: chainIDs["ethereum"] },
|
||||
{ label: ChainID[3], value: chainIDs["terra"] },
|
||||
{ label: ChainID[4], value: chainIDs["bsc"] },
|
||||
{ label: ChainID[5], value: chainIDs["polygon"] },
|
||||
{ label: ChainID[6], value: chainIDs["avalanche"] },
|
||||
{ label: ChainID[7], value: chainIDs["oasis"] },
|
||||
{ label: ChainID[9], value: chainIDs["aurora"] },
|
||||
{ label: ChainID[10], value: chainIDs["fantom"] },
|
||||
];
|
||||
|
||||
interface ExplorerMessageSearchProps {
|
||||
location: PageProps["location"];
|
||||
toggleFormType: () => void;
|
||||
formName: explorerFormType;
|
||||
}
|
||||
|
||||
const ExplorerMessageSearchForm: React.FC<ExplorerMessageSearchProps> = ({
|
||||
location,
|
||||
toggleFormType,
|
||||
formName,
|
||||
}) => {
|
||||
const [emitterChain, setEmitterChain] =
|
||||
useState<ExplorerMessageSearchValues["emitterChain"]>();
|
||||
const [emitterAddress, setEmitterAddress] =
|
||||
useState<ExplorerMessageSearchValues["emitterAddress"]>();
|
||||
const [sequence, setSequence] =
|
||||
useState<ExplorerMessageSearchValues["sequence"]>();
|
||||
|
||||
const { activeNetwork } = useNetworkContext();
|
||||
|
||||
useEffect(() => {
|
||||
if (location.search) {
|
||||
// take searchparams from the URL and set the values in the form
|
||||
const searchParams = new URLSearchParams(location.search);
|
||||
|
||||
const chain = searchParams.get("emitterChain");
|
||||
const address = searchParams.get("emitterAddress");
|
||||
const seqQuery = searchParams.get("sequence");
|
||||
|
||||
setEmitterChain(Number(chain));
|
||||
setEmitterAddress(address || undefined);
|
||||
setSequence(seqQuery || undefined);
|
||||
} else {
|
||||
// clear state
|
||||
setEmitterChain(undefined);
|
||||
setEmitterAddress(undefined);
|
||||
setSequence(undefined);
|
||||
}
|
||||
}, [location.search]);
|
||||
|
||||
const handleSubmit = (event: React.ChangeEvent<HTMLFormElement>) => {
|
||||
event.preventDefault();
|
||||
// pushing to the history stack will cause the component to get new props, and useEffect will run.
|
||||
if (emitterChain && emitterAddress && sequence) {
|
||||
navigate(
|
||||
`?emitterChain=${emitterChain}&emitterAddress=${emitterAddress}&sequence=${sequence}`
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
const onChain = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const { value } = event.target;
|
||||
setEmitterChain(Number(value));
|
||||
};
|
||||
|
||||
const onAddress = (value: string) => {
|
||||
// trim whitespace
|
||||
setEmitterAddress(value.replace(/\s/g, ""));
|
||||
};
|
||||
|
||||
const onSequence = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const { value } = event.target;
|
||||
// remove everything except numbers
|
||||
setSequence(value.replace(/\D/g, ""));
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<Box
|
||||
component="form"
|
||||
noValidate
|
||||
autoComplete="off"
|
||||
onSubmit={handleSubmit}
|
||||
>
|
||||
<ExplorerFormSelect
|
||||
currentlyActive={formName}
|
||||
toggleFormType={toggleFormType}
|
||||
/>
|
||||
|
||||
<TextField
|
||||
select
|
||||
value={emitterChain || ""}
|
||||
onChange={onChain}
|
||||
placeholder="Chain"
|
||||
label="Chain"
|
||||
fullWidth
|
||||
size="small"
|
||||
sx={{ my: 1 }}
|
||||
>
|
||||
{emitterChains.map(({ label, value }) => (
|
||||
<MenuItem key={label} value={value}>
|
||||
{label}
|
||||
</MenuItem>
|
||||
))}
|
||||
</TextField>
|
||||
|
||||
<Autocomplete
|
||||
// TODO set value when loading the page with emitterAddress
|
||||
// value={emitterAddress || ""}
|
||||
freeSolo
|
||||
fullWidth
|
||||
size="small"
|
||||
sx={{ my: 1 }}
|
||||
onChange={(event, newVal: any) => onAddress(newVal.value)}
|
||||
placeholder="Contract"
|
||||
renderInput={(params: any) => (
|
||||
<TextField {...params} label="Emitter Contract" />
|
||||
)}
|
||||
getOptionLabel={(option) => option.label}
|
||||
// Get the chainID from the emitterChain form item, then use chainEnums to transform it to the
|
||||
// lowercase chain name, in order to use it to lookup the emitterAdresses of the active network.
|
||||
// Filter out keys that are not human readable names, by checking for a space in the key.
|
||||
options={Object.entries(
|
||||
activeNetwork.chains[
|
||||
chainEnums[emitterChain || 1]?.toLowerCase()
|
||||
] || {}
|
||||
)
|
||||
.filter(([key]) => key.includes(" "))
|
||||
.map(([key, val]) => ({
|
||||
label: `${key} (${truncateAddress(val)})`,
|
||||
value: val,
|
||||
}))}
|
||||
/>
|
||||
|
||||
<TextField
|
||||
type="number"
|
||||
value={sequence ? Number(sequence) : ""}
|
||||
onChange={onSequence}
|
||||
label="Sequence"
|
||||
fullWidth
|
||||
size="small"
|
||||
sx={{ my: 1 }}
|
||||
/>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
variant="contained"
|
||||
sx={{
|
||||
display: "block",
|
||||
mt: 1,
|
||||
ml: "auto",
|
||||
}}
|
||||
>
|
||||
Search
|
||||
</Button>
|
||||
</Box>
|
||||
|
||||
{emitterChain && emitterAddress && sequence ? (
|
||||
<ExplorerQuery
|
||||
emitterChain={emitterChain}
|
||||
emitterAddress={emitterAddress}
|
||||
sequence={sequence}
|
||||
/>
|
||||
) : null}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ExplorerMessageSearchForm;
|
|
@ -1,237 +0,0 @@
|
|||
import React, { useEffect, useState } from 'react';
|
||||
import { Typography } from '@mui/material'
|
||||
|
||||
import { arrayify, isHexString, zeroPad, hexlify } from "ethers/lib/utils";
|
||||
import { Bech32, toHex, fromHex } from "@cosmjs/encoding"
|
||||
import ExplorerSummary from './ExplorerSummary';
|
||||
|
||||
import { useNetworkContext } from '../../contexts/NetworkContext';
|
||||
import { ChainId, getEmitterAddressSolana, isEVMChain } from "@certusone/wormhole-sdk";
|
||||
import { ChainIDs, chainIDs } from '../../utils/consts';
|
||||
import { PublicKey } from '@solana/web3.js';
|
||||
|
||||
export interface VAA {
|
||||
Version: number | string,
|
||||
GuardianSetIndex: number,
|
||||
Signatures: { Index: number, Signature: string }[],
|
||||
Timestamp: string, // "0001-01-01T00:00:00Z",
|
||||
Nonce: number,
|
||||
Sequence: number,
|
||||
ConsistencyLevel: number,
|
||||
EmitterChain: number,
|
||||
EmitterAddress: string,
|
||||
Payload: string // base64 encoded byte array
|
||||
}
|
||||
export interface TokenTransferPayload {
|
||||
Amount: string
|
||||
OriginAddress: string
|
||||
OriginChain: string,
|
||||
TargetAddress: string,
|
||||
TargetChain: string,
|
||||
}
|
||||
export interface TransferDetails {
|
||||
Amount: string, // "1530.000000",
|
||||
Decimals: string, // "6",
|
||||
NotionalUSDStr: string, // "1538.495460",
|
||||
TokenPriceUSDStr: string, // "1.005553",
|
||||
TransferTimestamp: string, // "2021-11-21 16:55:15 +0000 UTC",
|
||||
OriginSymbol: string,
|
||||
OriginName: string,
|
||||
OriginTokenAddress: string,
|
||||
}
|
||||
export interface BigTableMessage {
|
||||
InitiatingTxID?: string
|
||||
SignedVAABytes?: string // base64 encoded byte array
|
||||
SignedVAA?: VAA
|
||||
QuorumTime?: string // "2021-08-11 00:16:11.757 +0000 UTC"
|
||||
EmitterChain: keyof ChainIDs
|
||||
EmitterAddress: string
|
||||
Sequence: string
|
||||
TokenTransferPayload?: TokenTransferPayload
|
||||
TransferDetails?: TransferDetails
|
||||
}
|
||||
|
||||
interface ExplorerQuery {
|
||||
emitterChain?: number,
|
||||
emitterAddress?: string,
|
||||
sequence?: string,
|
||||
txId?: string,
|
||||
}
|
||||
const ExplorerQuery = (props: ExplorerQuery) => {
|
||||
const { activeNetwork } = useNetworkContext()
|
||||
const [error, setError] = useState<string>();
|
||||
const [loading, setLoading] = useState<boolean>(true);
|
||||
const [message, setMessage] = useState<BigTableMessage>();
|
||||
const [polling, setPolling] = useState(false);
|
||||
const [lastFetched, setLastFetched] = useState<number>()
|
||||
const [pollInterval, setPollInterval] = useState<NodeJS.Timeout>()
|
||||
|
||||
const fetchMessage = async (
|
||||
emitterChain: ExplorerQuery["emitterChain"],
|
||||
emitterAddress: ExplorerQuery["emitterAddress"],
|
||||
sequence: ExplorerQuery["sequence"],
|
||||
txId: ExplorerQuery["txId"]) => {
|
||||
let paddedAddress: string = ""
|
||||
let paddedSequence: string
|
||||
|
||||
let base = `${activeNetwork.endpoints.bigtableFunctionsBase}`
|
||||
let url = ""
|
||||
|
||||
if (emitterChain && emitterAddress && sequence) {
|
||||
if (emitterChain === chainIDs["solana"]) {
|
||||
if (emitterAddress.length < 64) {
|
||||
try {
|
||||
paddedAddress = await getEmitterAddressSolana(emitterAddress)
|
||||
} catch (_) {
|
||||
// do nothing
|
||||
}
|
||||
} else {
|
||||
paddedAddress = emitterAddress
|
||||
}
|
||||
} else if (isEVMChain(emitterChain as ChainId)) {
|
||||
if (isHexString(emitterAddress)) {
|
||||
|
||||
let paddedAddressArray = zeroPad(arrayify(emitterAddress, { hexPad: "left" }), 32);
|
||||
|
||||
let maybeString = Buffer.from(paddedAddressArray).toString('hex');
|
||||
|
||||
paddedAddress = maybeString
|
||||
} else {
|
||||
// must already be padded
|
||||
paddedAddress = emitterAddress
|
||||
}
|
||||
} else if (emitterChain === chainIDs["terra"]) {
|
||||
if (emitterAddress.startsWith('terra')) {
|
||||
try {
|
||||
paddedAddress = toHex(zeroPad(Bech32.decode(emitterAddress).data, 32))
|
||||
} catch (_) {
|
||||
// do nothing
|
||||
}
|
||||
} else {
|
||||
paddedAddress = emitterAddress
|
||||
}
|
||||
} else {
|
||||
paddedAddress = emitterAddress
|
||||
}
|
||||
|
||||
if (sequence.length <= 15) {
|
||||
paddedSequence = sequence.padStart(16, "0")
|
||||
} else {
|
||||
paddedSequence = sequence
|
||||
}
|
||||
url = `${base}readrow?emitterChain=${emitterChain}&emitterAddress=${paddedAddress}&sequence=${paddedSequence}`
|
||||
} else if (txId) {
|
||||
let transformedTxId = txId
|
||||
if (isHexString(txId)) {
|
||||
// valid hexString, no transformation needed.
|
||||
} else {
|
||||
try {
|
||||
let pubKey = new PublicKey(txId).toBytes()
|
||||
let solHex = hexlify(pubKey)
|
||||
transformedTxId = solHex
|
||||
} catch (_) {
|
||||
// not solana, try terra
|
||||
try {
|
||||
let arr = fromHex(txId)
|
||||
let terraHex = hexlify(arr)
|
||||
transformedTxId = terraHex
|
||||
} catch (_) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
url = `${base}transaction?id=${transformedTxId}`
|
||||
}
|
||||
|
||||
fetch(url)
|
||||
.then<BigTableMessage>(res => {
|
||||
if (res.ok) return res.json()
|
||||
if (res.status === 404) {
|
||||
// show a specific message to the user if the query returned 404.
|
||||
throw 'explorer.notFound'
|
||||
}
|
||||
// if res is not ok, and not 404, throw an error with specific message,
|
||||
// rather than letting the json decoding throw.
|
||||
throw 'explorer.failedFetching'
|
||||
})
|
||||
.then(result => {
|
||||
|
||||
setMessage(result)
|
||||
setLoading(false)
|
||||
setLastFetched(Date.now())
|
||||
|
||||
// turn polling on/off
|
||||
if (!result.QuorumTime && !polling) {
|
||||
setPolling(true)
|
||||
} else if (result.QuorumTime && polling) {
|
||||
setPolling(false)
|
||||
}
|
||||
}, error => {
|
||||
// Note: it's important to handle errors here
|
||||
// instead of a catch() block so that we don't swallow
|
||||
// exceptions from actual bugs in components.
|
||||
setError(error)
|
||||
setLoading(false)
|
||||
setLastFetched(Date.now())
|
||||
if (polling) {
|
||||
setPolling(false)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const refreshCallback = () => {
|
||||
fetchMessage(props.emitterChain, props.emitterAddress, props.sequence, props.txId)
|
||||
}
|
||||
|
||||
if (polling && !pollInterval) {
|
||||
let interval = setInterval(() => {
|
||||
fetchMessage(props.emitterChain, props.emitterAddress, props.sequence, props.txId)
|
||||
}, 3000)
|
||||
setPollInterval(interval)
|
||||
} else if (!polling && pollInterval) {
|
||||
clearInterval(pollInterval)
|
||||
setPollInterval(undefined)
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
setPolling(false)
|
||||
setError(undefined)
|
||||
setMessage(undefined)
|
||||
setLastFetched(undefined)
|
||||
if ((props.emitterChain && props.emitterAddress && props.sequence) || props.txId) {
|
||||
setLoading(true)
|
||||
fetchMessage(props.emitterChain, props.emitterAddress, props.sequence, props.txId)
|
||||
}
|
||||
|
||||
}, [props.emitterChain, props.emitterAddress, props.sequence, props.txId, activeNetwork.endpoints.bigtableFunctionsBase])
|
||||
|
||||
useEffect(() => {
|
||||
return function cleanup() {
|
||||
if (pollInterval) {
|
||||
clearInterval(pollInterval)
|
||||
}
|
||||
};
|
||||
}, [polling, activeNetwork.endpoints.bigtableFunctionsBase])
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
{loading ? <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center' }}>
|
||||
loading...
|
||||
</div> :
|
||||
error ? <Typography variant="h4" >error</Typography> :
|
||||
message ? (
|
||||
<ExplorerSummary
|
||||
{...props}
|
||||
message={message}
|
||||
polling={polling}
|
||||
lastFetched={lastFetched}
|
||||
refetch={refreshCallback}
|
||||
/>
|
||||
) : null
|
||||
}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default ExplorerQuery
|
|
@ -1,62 +0,0 @@
|
|||
import React, { useEffect, useState } from 'react'
|
||||
import { navigate, PageProps } from 'gatsby'
|
||||
import { Box } from "@mui/material";
|
||||
import ExplorerMessageSearchForm from "./ExplorerMessageSearchForm";
|
||||
import ExplorerTxSearchForm from "./ExplorerTxSearchForm";
|
||||
|
||||
interface ExplorerSearchProps {
|
||||
location: PageProps["location"],
|
||||
}
|
||||
const ExplorerSearch = ({ location }: ExplorerSearchProps) => {
|
||||
const [showMessageIdForm, setShowMessageIdForm] = useState<boolean>(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (location.search) {
|
||||
const searchParams = new URLSearchParams(location.search);
|
||||
|
||||
const chain = searchParams.get("emitterChain");
|
||||
const address = searchParams.get("emitterAddress");
|
||||
const seq = searchParams.get("sequence");
|
||||
const tx = searchParams.get("txId");
|
||||
if (!tx && chain && address && seq) {
|
||||
setShowMessageIdForm(true);
|
||||
}
|
||||
} else {
|
||||
setShowMessageIdForm(false)
|
||||
}
|
||||
}, [location.search])
|
||||
|
||||
const switchForm = () => {
|
||||
if (location.search) {
|
||||
navigate('/explorer')
|
||||
}
|
||||
setShowMessageIdForm(!showMessageIdForm)
|
||||
}
|
||||
|
||||
return (
|
||||
<Box
|
||||
sx={{
|
||||
backgroundColor: "rgba(255,255,255,.07)",
|
||||
borderRadius: "28px",
|
||||
mt: 4,
|
||||
p: 4,
|
||||
}}
|
||||
>
|
||||
{showMessageIdForm ? (
|
||||
<ExplorerMessageSearchForm
|
||||
location={location}
|
||||
toggleFormType={switchForm}
|
||||
formName="messageID"
|
||||
/>
|
||||
) : (
|
||||
<ExplorerTxSearchForm
|
||||
location={location}
|
||||
toggleFormType={switchForm}
|
||||
formName="txID"
|
||||
/>
|
||||
)}
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
|
||||
export default ExplorerSearch
|
|
@ -1,250 +0,0 @@
|
|||
import React from "react";
|
||||
import { Box, Button, Link, Typography } from "@mui/material";
|
||||
|
||||
import { BigTableMessage } from "./ExplorerQuery";
|
||||
import { DecodePayload } from "../DecodePayload";
|
||||
import ReactTimeAgo from "react-time-ago";
|
||||
import { Link as RouterLink } from "gatsby";
|
||||
import {
|
||||
contractNameFormatter,
|
||||
getNativeAddress,
|
||||
nativeExplorerContractUri,
|
||||
nativeExplorerTxUri,
|
||||
truncateAddress,
|
||||
usdFormatter,
|
||||
} from "../../utils/explorer";
|
||||
import { OutboundLink } from "gatsby-plugin-google-gtag";
|
||||
import { ChainID, chainIDs } from "../../utils/consts";
|
||||
import { hexToNativeString } from "@certusone/wormhole-sdk";
|
||||
import { explorer } from "../../utils/urls";
|
||||
|
||||
interface SummaryProps {
|
||||
emitterChain?: number;
|
||||
emitterAddress?: string;
|
||||
sequence?: string;
|
||||
txId?: string;
|
||||
message: BigTableMessage;
|
||||
polling?: boolean;
|
||||
lastFetched?: number;
|
||||
refetch: () => void;
|
||||
}
|
||||
const textStyles = { fontSize: 16, margin: "6px 0" };
|
||||
|
||||
const ExplorerSummary = (props: SummaryProps) => {
|
||||
const { SignedVAA, ...message } = props.message;
|
||||
|
||||
const {
|
||||
EmitterChain,
|
||||
EmitterAddress,
|
||||
InitiatingTxID,
|
||||
TokenTransferPayload,
|
||||
TransferDetails,
|
||||
} = message;
|
||||
// get chainId from chain name
|
||||
let chainId = chainIDs[EmitterChain];
|
||||
|
||||
let transactionId: string | undefined;
|
||||
if (InitiatingTxID) {
|
||||
if (
|
||||
chainId === chainIDs["ethereum"] ||
|
||||
chainId === chainIDs["bsc"] ||
|
||||
chainId === chainIDs["polygon"]
|
||||
) {
|
||||
transactionId = InitiatingTxID;
|
||||
} else {
|
||||
if (chainId === chainIDs["solana"]) {
|
||||
const txId = InitiatingTxID.slice(2); // remove the leading "0x"
|
||||
transactionId = hexToNativeString(txId, chainId);
|
||||
} else if (chainId === chainIDs["terra"]) {
|
||||
transactionId = InitiatingTxID.slice(2); // remove the leading "0x"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
justifyContent: "space-between",
|
||||
gap: 8,
|
||||
alignItems: "baseline",
|
||||
marginTop: 40,
|
||||
}}
|
||||
>
|
||||
<Typography variant="h4">Message Summary</Typography>
|
||||
{props.polling ? (
|
||||
<>
|
||||
<div style={{ flexGrow: 1 }}></div>
|
||||
<Typography variant="caption">listening</Typography>
|
||||
</>
|
||||
) : (
|
||||
<div>
|
||||
<Button onClick={props.refetch}>Refresh</Button>
|
||||
<Button component={RouterLink} to={explorer} sx={{ ml: 1 }}>
|
||||
Clear
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
margin: "20px 0 24px 20px",
|
||||
}}
|
||||
>
|
||||
<ul>
|
||||
{TokenTransferPayload &&
|
||||
TokenTransferPayload.TargetAddress &&
|
||||
TransferDetails &&
|
||||
nativeExplorerContractUri(
|
||||
Number(TokenTransferPayload.TargetChain),
|
||||
TokenTransferPayload.TargetAddress
|
||||
) ? (
|
||||
<>
|
||||
<li>
|
||||
<span style={textStyles}>
|
||||
This is a token transfer of{" "}
|
||||
{Math.round(Number(TransferDetails.Amount) * 100) / 100}
|
||||
{` `}
|
||||
{!["UST", "LUNA"].includes(TransferDetails.OriginSymbol) ? (
|
||||
<Link
|
||||
component={OutboundLink}
|
||||
href={nativeExplorerContractUri(
|
||||
Number(TokenTransferPayload.OriginChain),
|
||||
TokenTransferPayload.OriginAddress
|
||||
)}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style={{ ...textStyles, whiteSpace: "nowrap" }}
|
||||
>
|
||||
{TransferDetails.OriginSymbol}
|
||||
</Link>
|
||||
) : (
|
||||
TransferDetails.OriginSymbol
|
||||
)}
|
||||
{` `}from {ChainID[chainId]}, to{" "}
|
||||
{ChainID[Number(TokenTransferPayload.TargetChain)]}, destined
|
||||
for address{" "}
|
||||
</span>
|
||||
<Link
|
||||
component={OutboundLink}
|
||||
href={nativeExplorerContractUri(
|
||||
Number(TokenTransferPayload.TargetChain),
|
||||
TokenTransferPayload.TargetAddress
|
||||
)}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style={{ ...textStyles, whiteSpace: "nowrap" }}
|
||||
>
|
||||
{truncateAddress(
|
||||
getNativeAddress(
|
||||
Number(TokenTransferPayload.TargetChain),
|
||||
TokenTransferPayload.TargetAddress
|
||||
)
|
||||
)}
|
||||
</Link>
|
||||
<span style={textStyles}>.</span>
|
||||
</li>
|
||||
{TransferDetails.NotionalUSDStr && (
|
||||
<>
|
||||
<li>
|
||||
<span style={textStyles}>
|
||||
When these tokens were sent to Wormhole, the{" "}
|
||||
{Math.round(Number(TransferDetails.Amount) * 100) / 100}{" "}
|
||||
{TransferDetails.OriginSymbol} was worth about{" "}
|
||||
{usdFormatter.format(
|
||||
Number(TransferDetails.NotionalUSDStr)
|
||||
)}
|
||||
.
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span style={textStyles}>
|
||||
At the time of the transfer, 1{" "}
|
||||
{TransferDetails.OriginName} was worth about{" "}
|
||||
{usdFormatter.format(
|
||||
Number(TransferDetails.TokenPriceUSDStr)
|
||||
)}
|
||||
.{" "}
|
||||
</span>
|
||||
</li>
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
) : null}
|
||||
{EmitterChain &&
|
||||
EmitterAddress &&
|
||||
nativeExplorerContractUri(chainId, EmitterAddress) ? (
|
||||
<li>
|
||||
<span style={textStyles}>
|
||||
This message was emitted by the {ChainID[chainId]}{" "}
|
||||
</span>
|
||||
<Link
|
||||
component={OutboundLink}
|
||||
href={nativeExplorerContractUri(chainId, EmitterAddress)}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style={{ ...textStyles, whiteSpace: "nowrap" }}
|
||||
>
|
||||
{contractNameFormatter(EmitterAddress, chainId)}
|
||||
</Link>
|
||||
<span style={textStyles}> contract</span>
|
||||
{transactionId && (
|
||||
<>
|
||||
<span style={textStyles}>
|
||||
{" "}
|
||||
after the Wormhole Guardians observed transaction{" "}
|
||||
</span>
|
||||
<Link
|
||||
component={OutboundLink}
|
||||
href={nativeExplorerTxUri(chainId, transactionId)}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style={{ ...textStyles, whiteSpace: "nowrap" }}
|
||||
>
|
||||
{truncateAddress(transactionId)}
|
||||
</Link>
|
||||
</>
|
||||
)}{" "}
|
||||
<span style={textStyles}>.</span>
|
||||
</li>
|
||||
) : null}
|
||||
</ul>
|
||||
</div>
|
||||
<Typography variant="h4">Raw message data:</Typography>
|
||||
<Box component="div" sx={{ overflow: "auto", mb: 2.5 }}>
|
||||
<pre style={{ fontSize: 14 }}>
|
||||
{JSON.stringify(message, undefined, 2)}
|
||||
</pre>
|
||||
</Box>
|
||||
<DecodePayload
|
||||
base64VAA={props.message.SignedVAABytes}
|
||||
emitterChainName={props.message.EmitterChain}
|
||||
emitterAddress={props.message.EmitterAddress}
|
||||
showPayload={true}
|
||||
transferDetails={props.message.TransferDetails}
|
||||
/>
|
||||
<Box component="div" sx={{ overflow: "auto", mb: 2.5 }}>
|
||||
<Typography variant="h4">Signed VAA</Typography>
|
||||
<pre style={{ fontSize: 12 }}>
|
||||
{JSON.stringify(SignedVAA, undefined, 2)}
|
||||
</pre>
|
||||
</Box>
|
||||
<div style={{ display: "flex", justifyContent: "flex-end" }}>
|
||||
{props.lastFetched ? (
|
||||
<span>
|
||||
last updated:
|
||||
<ReactTimeAgo
|
||||
date={new Date(props.lastFetched)}
|
||||
timeStyle="round"
|
||||
/>
|
||||
</span>
|
||||
) : null}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ExplorerSummary;
|
|
@ -1,88 +0,0 @@
|
|||
import React, { useEffect, useState } from "react";
|
||||
import { PageProps, navigate } from "gatsby";
|
||||
import { Button, TextField, Box } from "@mui/material";
|
||||
|
||||
import ExplorerQuery from "./ExplorerQuery";
|
||||
import ExplorerFormSelect, { explorerFormType } from "./ExplorerFormSelect";
|
||||
|
||||
interface ExplorerTxSearchProps {
|
||||
location: PageProps["location"];
|
||||
toggleFormType: () => void;
|
||||
formName: explorerFormType;
|
||||
}
|
||||
const ExplorerTxSearchForm: React.FC<ExplorerTxSearchProps> = ({
|
||||
location,
|
||||
toggleFormType,
|
||||
formName,
|
||||
}) => {
|
||||
const [txId, setTxId] = useState<string>();
|
||||
|
||||
useEffect(() => {
|
||||
if (location.search) {
|
||||
// take searchparams from the URL and set the values in the form
|
||||
const searchParams = new URLSearchParams(location.search);
|
||||
const txQuery = searchParams.get("txId");
|
||||
|
||||
// if the search params are different form values, update the form.
|
||||
if (txQuery) {
|
||||
setTxId(txQuery);
|
||||
}
|
||||
} else {
|
||||
// clear state
|
||||
setTxId(undefined);
|
||||
}
|
||||
}, [location.search]);
|
||||
|
||||
const handleSubmit = (event: any) => {
|
||||
event.preventDefault();
|
||||
// pushing to the history stack will cause the component to get new props, and useEffect will run.
|
||||
if (txId) {
|
||||
navigate(`/explorer?txId=${txId}`);
|
||||
}
|
||||
};
|
||||
|
||||
const onTxId = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const tx = event.target.value;
|
||||
setTxId(tx.replace(/\s/g, ""));
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<Box
|
||||
component="form"
|
||||
noValidate
|
||||
autoComplete="off"
|
||||
onSubmit={handleSubmit}
|
||||
>
|
||||
<ExplorerFormSelect
|
||||
currentlyActive={formName}
|
||||
toggleFormType={toggleFormType}
|
||||
/>
|
||||
|
||||
<TextField
|
||||
value={txId || ""}
|
||||
onChange={onTxId}
|
||||
label="Transaction"
|
||||
fullWidth
|
||||
size="small"
|
||||
sx={{ my: 1 }}
|
||||
/>
|
||||
|
||||
<Button
|
||||
type="submit"
|
||||
variant="contained"
|
||||
sx={{
|
||||
display: "block",
|
||||
mt: 1,
|
||||
ml: "auto",
|
||||
}}
|
||||
>
|
||||
Search
|
||||
</Button>
|
||||
</Box>
|
||||
{txId ? <ExplorerQuery txId={txId} /> : null}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ExplorerTxSearchForm;
|
|
@ -1,146 +0,0 @@
|
|||
import { Typography } from "@mui/material";
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { chainIDStrings } from "../../utils/consts";
|
||||
import { amountFormatter } from "../../utils/explorer";
|
||||
import {
|
||||
NotionalTransferred,
|
||||
NotionalTransferredToCumulative,
|
||||
Totals,
|
||||
} from "./ExplorerStats";
|
||||
|
||||
interface ChainOverviewCardProps {
|
||||
dataKey: keyof typeof chainIDStrings;
|
||||
totals?: Totals;
|
||||
notionalTransferred?: NotionalTransferred;
|
||||
notionalTransferredToCumulative?: NotionalTransferredToCumulative;
|
||||
}
|
||||
|
||||
const ChainOverviewCard: React.FC<ChainOverviewCardProps> = ({
|
||||
dataKey,
|
||||
totals,
|
||||
notionalTransferred,
|
||||
notionalTransferredToCumulative,
|
||||
}) => {
|
||||
const [totalCount, setTotalColunt] = useState<number>();
|
||||
const [animate, setAnimate] = useState<boolean>(false);
|
||||
|
||||
useEffect(() => {
|
||||
// hold values from props in state, so that we can detect changes and add animation class
|
||||
setTotalColunt(totals?.TotalCount[dataKey]);
|
||||
|
||||
let timeout: NodeJS.Timeout;
|
||||
if (
|
||||
totals?.TotalCount[dataKey] &&
|
||||
totalCount !== totals?.TotalCount[dataKey]
|
||||
) {
|
||||
setAnimate(true);
|
||||
timeout = setTimeout(() => {
|
||||
setAnimate(false);
|
||||
}, 2000);
|
||||
}
|
||||
return function cleanup() {
|
||||
if (timeout) {
|
||||
clearTimeout(timeout);
|
||||
}
|
||||
};
|
||||
}, [
|
||||
totals?.TotalCount[dataKey],
|
||||
dataKey,
|
||||
totalCount,
|
||||
]);
|
||||
|
||||
const centerStyles: any = {
|
||||
display: "flex",
|
||||
justifyContent: "flex-start",
|
||||
alignItems: "center",
|
||||
flexDirection: "column",
|
||||
};
|
||||
// prevent an exception if data is missing (ie. new chain)
|
||||
if (
|
||||
!notionalTransferredToCumulative ||
|
||||
!(dataKey in notionalTransferredToCumulative.AllTime) ||
|
||||
!("*" in notionalTransferredToCumulative.AllTime[dataKey])
|
||||
) {
|
||||
return <>coming soon</>
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<div style={{ ...centerStyles, gap: 8 }}>
|
||||
{notionalTransferredToCumulative &&
|
||||
notionalTransferredToCumulative.AllTime && (
|
||||
<div style={centerStyles}>
|
||||
<div>
|
||||
<Typography
|
||||
variant="h5"
|
||||
className={animate ? "highlight-new-val" : ""}
|
||||
>
|
||||
$
|
||||
{amountFormatter(
|
||||
notionalTransferredToCumulative.AllTime[dataKey]["*"]
|
||||
)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div style={{ marginTop: -10 }}>
|
||||
<Typography variant="caption">received</Typography>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{notionalTransferred &&
|
||||
notionalTransferred.WithinPeriod &&
|
||||
dataKey in notionalTransferred.WithinPeriod &&
|
||||
"*" in notionalTransferred.WithinPeriod[dataKey] &&
|
||||
"*" in notionalTransferred.WithinPeriod[dataKey]["*"] &&
|
||||
notionalTransferred.WithinPeriod[dataKey]["*"]["*"] > 0 ? (
|
||||
<div style={centerStyles}>
|
||||
<div>
|
||||
<Typography
|
||||
variant="h5"
|
||||
className={animate ? "highlight-new-val" : ""}
|
||||
>
|
||||
{notionalTransferred.WithinPeriod[dataKey]["*"]["*"]
|
||||
? "$" +
|
||||
amountFormatter(
|
||||
notionalTransferred.WithinPeriod[dataKey]["*"]["*"]
|
||||
)
|
||||
: "..."}
|
||||
</Typography>
|
||||
</div>
|
||||
<div style={{ marginTop: -10 }}>
|
||||
<Typography variant="caption">sent</Typography>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<div style={centerStyles}>
|
||||
<div>
|
||||
<Typography variant="h5">
|
||||
<span style={{ fontSize: "75%", verticalAlign: 'middle' }}>Coming Soon</span>
|
||||
</Typography>
|
||||
</div>
|
||||
<div style={{ marginTop: -10 }}>
|
||||
<Typography variant="caption">sent</Typography>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{!!totalCount && (
|
||||
<div style={centerStyles}>
|
||||
<div>
|
||||
<Typography
|
||||
variant="h5"
|
||||
className={animate ? "highlight-new-val" : ""}
|
||||
>
|
||||
{amountFormatter(totalCount)}
|
||||
</Typography>
|
||||
</div>
|
||||
<div style={{ marginTop: -10 }}>
|
||||
<Typography variant="caption"> messages </Typography>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{totalCount === 0 && <Typography variant="h6">coming soon</Typography>}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ChainOverviewCard;
|
|
@ -1,145 +0,0 @@
|
|||
import React, { useEffect, useState } from "react";
|
||||
import { Totals } from "./ExplorerStats";
|
||||
import { ResponsiveBar, BarDatum } from "@nivo/bar";
|
||||
|
||||
import {
|
||||
chainColors,
|
||||
chainIdColors,
|
||||
makeDate,
|
||||
makeGroupName,
|
||||
} from "../../utils/explorer";
|
||||
import { useNetworkContext } from "../../contexts/NetworkContext";
|
||||
import { chainEnums } from "../../utils/consts";
|
||||
import { Typography } from "@mui/material";
|
||||
|
||||
interface DailyCountProps {
|
||||
dailyCount: Totals["DailyTotals"];
|
||||
showBottomLedgend?: boolean;
|
||||
}
|
||||
|
||||
const DailyCountBarChart = (props: DailyCountProps) => {
|
||||
const { activeNetwork } = useNetworkContext();
|
||||
const [data, setData] = useState<Array<BarDatum>>([]);
|
||||
|
||||
useEffect(() => {
|
||||
const datum = Object.keys(props.dailyCount).reduce<Array<BarDatum>>(
|
||||
(accum, date) => {
|
||||
const chains = props.dailyCount[date];
|
||||
return [
|
||||
...accum,
|
||||
Object.keys(chains).reduce<BarDatum>(
|
||||
(subAccum, chain) => {
|
||||
const group = makeGroupName(chain, activeNetwork);
|
||||
return {
|
||||
...subAccum,
|
||||
[group]: chains[chain],
|
||||
};
|
||||
},
|
||||
{ date: date }
|
||||
),
|
||||
];
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
setData(datum);
|
||||
}, [props.dailyCount, activeNetwork]);
|
||||
|
||||
const keys = chainEnums.slice(1);
|
||||
const today = new Date().toISOString().slice(0, 10);
|
||||
|
||||
return (
|
||||
<div style={{ height: 400, minWidth: 360, flex: "1", marginBottom: 40 }}>
|
||||
<Typography variant="subtitle1" gutterBottom>Messages/Day</Typography>
|
||||
<ResponsiveBar
|
||||
theme={{ textColor: "rgba(255, 255, 255, 0.85)" }}
|
||||
data={data}
|
||||
keys={keys}
|
||||
colors={chainIdColors.slice(1)}
|
||||
groupMode="stacked"
|
||||
indexBy="date"
|
||||
margin={{
|
||||
top: 10,
|
||||
right: 0,
|
||||
bottom: props.showBottomLedgend ? 80 : 24,
|
||||
left: 40,
|
||||
}}
|
||||
padding={0.3}
|
||||
valueScale={{ type: "linear" }}
|
||||
indexScale={{ type: "band", round: true }}
|
||||
borderColor={{ from: "color", modifiers: [["darker", 1.6]] }}
|
||||
axisTop={null}
|
||||
axisRight={null}
|
||||
axisBottom={{
|
||||
format: (value) => {
|
||||
if (value === today) {
|
||||
return "today";
|
||||
}
|
||||
return makeDate(value);
|
||||
},
|
||||
}}
|
||||
labelSkipWidth={12}
|
||||
labelSkipHeight={12}
|
||||
labelTextColor={{ from: "color", modifiers: [["darker", 3]] }}
|
||||
tooltip={(data) => {
|
||||
let { id, value, indexValue } = data;
|
||||
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
background: "#827db8",
|
||||
borderRadius: "14px",
|
||||
padding: "9px 12px",
|
||||
border: "1px solid rgba(255, 255, 255, 0.85)",
|
||||
color: "rgba(255, 255, 255, 0.85)",
|
||||
fontSize: 14,
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
variant="subtitle1"
|
||||
style={{ color: "rgba(255, 255, 255, 0.85)" }}
|
||||
>
|
||||
{id} - {makeDate(String(indexValue))}
|
||||
</Typography>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
padding: "3px 0",
|
||||
justifyContent: "flex-end",
|
||||
}}
|
||||
>
|
||||
<span>{value} messages</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}}
|
||||
/>
|
||||
{props.showBottomLedgend && (
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
justifyContent: "space-evenly",
|
||||
width: "100%",
|
||||
}}
|
||||
>
|
||||
{chainEnums.slice(1).map((chain, index) => (
|
||||
<div key={chain} style={{ display: "flex", alignItems: "center" }}>
|
||||
<div
|
||||
style={{
|
||||
background: chainColors[String(index + 1)],
|
||||
height: 16,
|
||||
width: 16,
|
||||
display: "inline-block",
|
||||
}}
|
||||
/>
|
||||
|
||||
<span>{chain}</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default DailyCountBarChart;
|
|
@ -1,146 +0,0 @@
|
|||
import React, { useEffect, useState } from 'react';
|
||||
import { NotionalTransferredTo } from './ExplorerStats';
|
||||
import { Typography } from '@mui/material';
|
||||
import { ResponsiveBar, BarDatum } from '@nivo/bar'
|
||||
|
||||
import { makeDate, makeGroupName, chainColors, amountFormatter, usdFormatter, chainIdColors } from "../../utils/explorer"
|
||||
import { useNetworkContext } from '../../contexts/NetworkContext';
|
||||
import { chainEnums, } from '../../utils/consts';
|
||||
|
||||
function findMaxBoundOfIQR(array: number[]): number {
|
||||
|
||||
if (array.length < 4) {
|
||||
array.sort((a, b) => a - b)
|
||||
return array[0]
|
||||
}
|
||||
|
||||
let values, q1, q3, iqr, maxValue: number
|
||||
|
||||
values = array.slice().sort((a, b) => a - b);//copy array fast and sort
|
||||
|
||||
if ((values.length / 4) % 1 === 0) {//find quartiles
|
||||
q1 = 1 / 2 * (values[(values.length / 4)] + values[(values.length / 4) + 1]);
|
||||
q3 = 1 / 2 * (values[(values.length * (3 / 4))] + values[(values.length * (3 / 4)) + 1]);
|
||||
} else {
|
||||
q1 = values[Math.floor(values.length / 4 + 1)];
|
||||
q3 = values[Math.ceil(values.length * (3 / 4) + 1)];
|
||||
}
|
||||
|
||||
iqr = q3 - q1;
|
||||
maxValue = q3 + iqr * 1.5;
|
||||
|
||||
return maxValue
|
||||
}
|
||||
|
||||
interface DailyCountProps {
|
||||
daily: NotionalTransferredTo["Daily"]
|
||||
}
|
||||
|
||||
const DailyNotionalBarChart = (props: DailyCountProps) => {
|
||||
|
||||
const { activeNetwork } = useNetworkContext()
|
||||
const [barData, setBarData] = useState<Array<BarDatum>>([])
|
||||
const [max, setMax] = useState<number>()
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
// create a list of all data points in order to calculate min/max bounds of chart
|
||||
const all: number[] = []
|
||||
|
||||
const data = Object.keys(props.daily).reduce<Array<BarDatum>>((accum, date) => {
|
||||
const chains = props.daily[date]
|
||||
|
||||
return [...accum, Object.keys(chains).reduce<BarDatum>((subAccum, chain) => {
|
||||
if (chain === "*") {
|
||||
return subAccum
|
||||
}
|
||||
|
||||
const group = makeGroupName(chain, activeNetwork)
|
||||
// const group = chain
|
||||
all.push(chains[chain]["*"])
|
||||
return {
|
||||
...subAccum,
|
||||
[group]: chains[chain]["*"],
|
||||
}
|
||||
|
||||
}, { "date": date })]
|
||||
}, [])
|
||||
|
||||
// create a max value for the y axis, in order to exclude outliers so the chart looks nice.
|
||||
let max = findMaxBoundOfIQR(all)
|
||||
setMax(max)
|
||||
|
||||
setBarData(data)
|
||||
|
||||
}, [props.daily, activeNetwork])
|
||||
|
||||
const keys = chainEnums.slice(1)
|
||||
const today = new Date().toISOString().slice(0, 10)
|
||||
|
||||
return (
|
||||
<div style={{ height: 400, minWidth: 360, flex: '1', marginBottom: 40 }}>
|
||||
<Typography variant="subtitle1" gutterBottom>Value Received (USD)</Typography>
|
||||
|
||||
<ResponsiveBar
|
||||
theme={{ textColor: "rgba(255, 255, 255, 0.85)" }}
|
||||
colors={chainIdColors.slice(1)}
|
||||
data={barData}
|
||||
keys={keys}
|
||||
enableLabel={false}
|
||||
groupMode="grouped"
|
||||
indexBy="date"
|
||||
margin={{
|
||||
top: 10,
|
||||
right: 0,
|
||||
bottom: 24,
|
||||
left: 40,
|
||||
}}
|
||||
padding={0.3}
|
||||
valueScale={{ type: 'linear' }}
|
||||
indexScale={{ type: 'band', round: true }}
|
||||
borderColor={{ from: 'color', modifiers: [['darker', 1.6]] }}
|
||||
axisTop={null}
|
||||
axisRight={null}
|
||||
axisLeft={{
|
||||
format: (value) => amountFormatter(Number(value))
|
||||
}}
|
||||
axisBottom={{
|
||||
format: (value) => {
|
||||
if (value === today) {
|
||||
return "today"
|
||||
}
|
||||
return makeDate(value)
|
||||
}
|
||||
}}
|
||||
tooltip={(data) => {
|
||||
let { id, value, indexValue, } = data
|
||||
return (
|
||||
<div
|
||||
style={{
|
||||
background: '#010114',
|
||||
padding: '9px 12px',
|
||||
border: '1px solid rgba(255, 255, 255, 0.85)',
|
||||
color: "rgba(255, 255, 255, 0.85)",
|
||||
fontSize: 14
|
||||
}}
|
||||
>
|
||||
<Typography variant="subtitle1" style={{ color: 'rgba(255, 255, 255, 0.85)' }}>{id} - {makeDate(String(indexValue))}</Typography>
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
padding: '3px 0',
|
||||
justifyContent: 'flex-end',
|
||||
}}
|
||||
>
|
||||
{usdFormatter.format(Number(value))} received
|
||||
</div>
|
||||
|
||||
</div>
|
||||
)
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default DailyNotionalBarChart
|
|
@ -1,683 +0,0 @@
|
|||
import { Box, Card, CircularProgress } from "@mui/material";
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { useNetworkContext } from "../../contexts/NetworkContext";
|
||||
import { ChainID } from "../../utils/consts";
|
||||
import { contractNameFormatter } from "../../utils/explorer";
|
||||
import { BigTableMessage } from "../ExplorerSearch/ExplorerQuery";
|
||||
import RecentMessages from "./RecentMessages";
|
||||
import ChainOverviewCard from "./ChainOverviewCard";
|
||||
import PastWeekCard from "./PastWeekCard";
|
||||
|
||||
import binanceChainIcon from "../../images/bsc.svg";
|
||||
import ethereumIcon from "../../images/eth.svg";
|
||||
import solanaIcon from "../../images//solana.svg";
|
||||
import terraIcon from "../../images/terra.svg";
|
||||
import polygonIcon from "../../images/polygon.svg";
|
||||
import avalancheIcon from "../../images/avalanche.svg";
|
||||
import oasisIcon from "../../images/oasis.svg";
|
||||
import fantomIcon from "../../images/fantom.svg"
|
||||
import GridWithCards from "../GridWithCards";
|
||||
import { explorer } from "../../utils/urls";
|
||||
|
||||
export interface Totals {
|
||||
LastDayCount: { [groupByKey: string]: number };
|
||||
TotalCount: { [groupByKey: string]: number };
|
||||
DailyTotals: {
|
||||
// "2021-08-22": { "*": 0 },
|
||||
[date: string]: { [groupByKey: string]: number };
|
||||
};
|
||||
}
|
||||
// type GroupByKey = "*" | "emitterChain" | "emitterChain:emitterAddress"
|
||||
export interface Recent {
|
||||
[groupByKey: string]: Array<BigTableMessage>;
|
||||
}
|
||||
interface BidirectionalTransferData {
|
||||
[leavingChainId: string]: {
|
||||
[destinationChainId: string]: {
|
||||
[tokenSymbol: string]: number;
|
||||
};
|
||||
};
|
||||
}
|
||||
export interface NotionalTransferred {
|
||||
Last24Hours: BidirectionalTransferData;
|
||||
WithinPeriod: BidirectionalTransferData;
|
||||
PeriodDurationDays: Number;
|
||||
Daily: {
|
||||
[date: string]: BidirectionalTransferData;
|
||||
};
|
||||
}
|
||||
interface DirectionalTransferData {
|
||||
[chainId: string]: {
|
||||
[tokenSymbol: string]: number;
|
||||
};
|
||||
}
|
||||
export interface NotionalTransferredTo {
|
||||
Last24Hours: DirectionalTransferData;
|
||||
WithinPeriod: DirectionalTransferData;
|
||||
PeriodDurationDays: Number;
|
||||
Daily: {
|
||||
[date: string]: DirectionalTransferData;
|
||||
};
|
||||
}
|
||||
export interface NotionalTransferredToCumulative {
|
||||
AllTime: DirectionalTransferData;
|
||||
AllTimeDurationDays: Number;
|
||||
Daily: {
|
||||
[date: string]: DirectionalTransferData;
|
||||
};
|
||||
}
|
||||
interface LockedAsset {
|
||||
Symbol: string
|
||||
Name: string
|
||||
Address: string
|
||||
CoinGeckoId: string
|
||||
Amount: number
|
||||
Notional: number
|
||||
TokenPrice: number
|
||||
}
|
||||
interface LockedAssets {
|
||||
[tokenAddress: string]: LockedAsset
|
||||
}
|
||||
interface ChainsAssets {
|
||||
[chainId: string]: LockedAssets
|
||||
}
|
||||
export interface NotionalTvl {
|
||||
Last24HoursChange: ChainsAssets
|
||||
AllTime: ChainsAssets
|
||||
}
|
||||
|
||||
type GroupBy = undefined | "chain" | "address";
|
||||
type ForChain = undefined | StatsProps["emitterChain"];
|
||||
type ForAddress = undefined | StatsProps["emitterAddress"];
|
||||
|
||||
interface StatsProps {
|
||||
emitterChain?: number;
|
||||
emitterAddress?: string;
|
||||
}
|
||||
|
||||
const ExplorerStats: React.FC<StatsProps> = ({
|
||||
emitterChain,
|
||||
emitterAddress,
|
||||
}) => {
|
||||
const { activeNetwork } = useNetworkContext();
|
||||
|
||||
const [totals, setTotals] = useState<Totals>();
|
||||
const [recent, setRecent] = useState<Recent>();
|
||||
const [notionalTransferred, setNotionalTransferred] =
|
||||
useState<NotionalTransferred>();
|
||||
const [notionalTransferredTo, setNotionalTransferredTo] =
|
||||
useState<NotionalTransferredTo>();
|
||||
const [notionalTransferredToCumulative, setNotionalTransferredToCumulative] =
|
||||
useState<NotionalTransferredToCumulative>();
|
||||
const [address, setAddress] = useState<StatsProps["emitterAddress"]>();
|
||||
const [chain, setChain] = useState<StatsProps["emitterChain"]>();
|
||||
const [lastFetched, setLastFetched] = useState<number>();
|
||||
const [pollInterval, setPollInterval] = useState<NodeJS.Timeout>();
|
||||
const [controller, setController] = useState<AbortController>(
|
||||
new AbortController()
|
||||
);
|
||||
|
||||
const launchDate = new Date("2021-09-13T00:00:00.000+00:00");
|
||||
// calculate the time difference between now and the launch day
|
||||
const differenceInTime = new Date().getTime() - launchDate.getTime();
|
||||
// calculate the number of days, rounding up
|
||||
const daysSinceDataStart = Math.ceil(differenceInTime / (1000 * 3600 * 24));
|
||||
|
||||
const fetchTotals = (
|
||||
baseUrl: string,
|
||||
groupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: ForAddress,
|
||||
signal: AbortSignal
|
||||
) => {
|
||||
const totalsUrl = `${baseUrl}totals`;
|
||||
let url = `${totalsUrl}?&daily=true`
|
||||
if (groupBy) {
|
||||
url = `${url}&groupBy=${groupBy}`;
|
||||
}
|
||||
if (forChain) {
|
||||
url = `${url}&forChain=${forChain}`;
|
||||
}
|
||||
if (forAddress) {
|
||||
url = `${url}&forAddress=${forAddress}`;
|
||||
}
|
||||
|
||||
return fetch(url, { signal })
|
||||
.then<Totals>((res) => {
|
||||
if (res.ok) return res.json();
|
||||
// throw an error with specific message, rather than letting the json decoding throw.
|
||||
throw "explorer.stats.failedFetchingTotals";
|
||||
})
|
||||
.then(
|
||||
(result) => {
|
||||
setTotals(result);
|
||||
|
||||
setLastFetched(Date.now());
|
||||
},
|
||||
(error) => {
|
||||
if (error.name !== "AbortError") {
|
||||
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
|
||||
console.error("failed fetching totals. error: ", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
const fetchRecent = (
|
||||
baseUrl: string,
|
||||
groupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: ForAddress,
|
||||
signal: AbortSignal
|
||||
) => {
|
||||
const recentUrl = `${baseUrl}recent`;
|
||||
let numRows = 10
|
||||
if (forChain) {
|
||||
numRows = 30
|
||||
}
|
||||
if (forAddress) {
|
||||
numRows = 80
|
||||
}
|
||||
let url = `${recentUrl}?numRows=${numRows}`;
|
||||
if (groupBy) {
|
||||
url = `${url}&groupBy=${groupBy}`;
|
||||
}
|
||||
if (forChain) {
|
||||
url = `${url}&forChain=${forChain}`;
|
||||
}
|
||||
if (forAddress) {
|
||||
url = `${url}&forAddress=${forAddress}`;
|
||||
}
|
||||
|
||||
return fetch(url, { signal })
|
||||
.then<Recent>((res) => {
|
||||
if (res.ok) return res.json();
|
||||
// throw an error with specific message, rather than letting the json decoding throw.
|
||||
throw "explorer.stats.failedFetchingRecent";
|
||||
})
|
||||
.then(
|
||||
(result) => {
|
||||
setRecent(result);
|
||||
setLastFetched(Date.now());
|
||||
},
|
||||
(error) => {
|
||||
if (error.name !== "AbortError") {
|
||||
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
|
||||
console.error("failed fetching recent. error: ", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
const fetchTransferred = (
|
||||
baseUrl: string,
|
||||
groupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: ForAddress,
|
||||
signal: AbortSignal
|
||||
) => {
|
||||
const transferredUrl = `${baseUrl}notionaltransferred`;
|
||||
let url = `${transferredUrl}?forPeriod=true&numDays=${daysSinceDataStart}`;
|
||||
if (groupBy) {
|
||||
url = `${url}&groupBy=${groupBy}`;
|
||||
}
|
||||
if (forChain) {
|
||||
url = `${url}&forChain=${forChain}`;
|
||||
}
|
||||
if (forAddress) {
|
||||
url = `${url}&forAddress=${forAddress}`;
|
||||
}
|
||||
if (groupBy === "address" || forChain || forAddress) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return fetch(url, { signal })
|
||||
.then<NotionalTransferred>((res) => {
|
||||
if (res.ok) return res.json();
|
||||
// throw an error with specific message, rather than letting the json decoding throw.
|
||||
throw "explorer.stats.failedFetchingTransferred";
|
||||
})
|
||||
.then(
|
||||
(result) => {
|
||||
setNotionalTransferred(result);
|
||||
setLastFetched(Date.now());
|
||||
},
|
||||
(error) => {
|
||||
if (error.name !== "AbortError") {
|
||||
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
|
||||
console.error("failed fetching transferred to. error: ", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
const fetchTransferredTo = (
|
||||
baseUrl: string,
|
||||
groupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: ForAddress,
|
||||
signal: AbortSignal
|
||||
) => {
|
||||
const transferredUrl = `${baseUrl}notionaltransferredto`;
|
||||
let url = `${transferredUrl}?forPeriod=true&daily=true&numDays=${daysSinceDataStart}`;
|
||||
if (groupBy) {
|
||||
url = `${url}&groupBy=${groupBy}`;
|
||||
}
|
||||
if (forChain) {
|
||||
url = `${url}&forChain=${forChain}`;
|
||||
}
|
||||
if (forAddress) {
|
||||
url = `${url}&forAddress=${forAddress}`;
|
||||
}
|
||||
if (groupBy === "address" || forChain || forAddress) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return fetch(url, { signal })
|
||||
.then<NotionalTransferredTo>((res) => {
|
||||
if (res.ok) return res.json();
|
||||
// throw an error with specific message, rather than letting the json decoding throw.
|
||||
throw "explorer.stats.failedFetchingTransferredTo";
|
||||
})
|
||||
.then(
|
||||
(result) => {
|
||||
setNotionalTransferredTo(result);
|
||||
setLastFetched(Date.now());
|
||||
},
|
||||
(error) => {
|
||||
if (error.name !== "AbortError") {
|
||||
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
|
||||
console.error("failed fetching transferred to. error: ", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
const fetchTransferredToCumulative = (
|
||||
baseUrl: string,
|
||||
groupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: ForAddress,
|
||||
signal: AbortSignal
|
||||
) => {
|
||||
const transferredToUrl = `${baseUrl}notionaltransferredtocumulative`;
|
||||
let url = `${transferredToUrl}?allTime=true`
|
||||
if (groupBy) {
|
||||
url = `${url}&groupBy=${groupBy}`;
|
||||
}
|
||||
if (forChain) {
|
||||
url = `${url}&forChain=${forChain}`;
|
||||
}
|
||||
if (forAddress) {
|
||||
url = `${url}&forAddress=${forAddress}`;
|
||||
}
|
||||
if (groupBy === "address" || forChain || forAddress) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return fetch(url, { signal })
|
||||
.then<NotionalTransferredToCumulative>((res) => {
|
||||
if (res.ok) return res.json();
|
||||
// throw an error with specific message, rather than letting the json decoding throw.
|
||||
throw "explorer.stats.failedFetchingTransferredTo";
|
||||
})
|
||||
.then(
|
||||
(result) => {
|
||||
// let today = "2021-12-03"
|
||||
// let { [today]: t, ...dailies } = result.Daily
|
||||
// let r = { ...result, Daily: dailies }
|
||||
// setNotionalTransferredTo(r)
|
||||
setNotionalTransferredToCumulative(result);
|
||||
setLastFetched(Date.now());
|
||||
},
|
||||
(error) => {
|
||||
if (error.name !== "AbortError") {
|
||||
// handle errors here instead of a catch(), so that we don't swallow exceptions from components
|
||||
console.error("failed fetching transferred to. error: ", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
const getData = (props: StatsProps, baseUrl: string, signal: AbortSignal, func: (baseUrl: string,
|
||||
recentGroupBy: GroupBy,
|
||||
totalsGroupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: string | undefined,
|
||||
signal: AbortSignal) => Promise<any>) => {
|
||||
let forChain: ForChain = undefined;
|
||||
let forAddress: ForAddress = undefined;
|
||||
let recentGroupBy: GroupBy = undefined;
|
||||
let totalsGroupBy: GroupBy = "chain";
|
||||
if (props.emitterChain) {
|
||||
forChain = props.emitterChain;
|
||||
totalsGroupBy = "address";
|
||||
recentGroupBy = "address";
|
||||
}
|
||||
if (props.emitterChain && props.emitterAddress) {
|
||||
forAddress = props.emitterAddress;
|
||||
}
|
||||
return func(baseUrl, recentGroupBy, totalsGroupBy, forChain, forAddress, signal)
|
||||
};
|
||||
const getAllEndpoints = (
|
||||
baseUrl: string,
|
||||
recentGroupBy: GroupBy,
|
||||
totalsGroupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: string | undefined,
|
||||
signal: AbortSignal) => {
|
||||
return Promise.all([
|
||||
fetchTotals(baseUrl, totalsGroupBy, forChain, forAddress, signal),
|
||||
fetchRecent(baseUrl, recentGroupBy, forChain, forAddress, signal),
|
||||
fetchTransferred(baseUrl, recentGroupBy, forChain, forAddress, signal),
|
||||
fetchTransferredTo(baseUrl, recentGroupBy, forChain, forAddress, signal),
|
||||
fetchTransferredToCumulative(
|
||||
baseUrl,
|
||||
recentGroupBy,
|
||||
forChain,
|
||||
forAddress,
|
||||
signal
|
||||
),
|
||||
]);
|
||||
};
|
||||
const getRecents = (
|
||||
baseUrl: string,
|
||||
recentGroupBy: GroupBy,
|
||||
totalsGroupBy: GroupBy,
|
||||
forChain: ForChain,
|
||||
forAddress: string | undefined,
|
||||
signal: AbortSignal) => fetchRecent(baseUrl, recentGroupBy, forChain, forAddress, signal)
|
||||
|
||||
|
||||
const pollingController = (
|
||||
emitterChain: StatsProps["emitterChain"],
|
||||
emitterAddress: StatsProps["emitterAddress"],
|
||||
baseUrl: string,
|
||||
) => {
|
||||
// clear any ongoing intervals
|
||||
if (pollInterval) {
|
||||
clearInterval(pollInterval);
|
||||
setPollInterval(undefined);
|
||||
}
|
||||
// abort any in-flight requests
|
||||
controller.abort();
|
||||
// create a new controller for the new fetches, add it to state
|
||||
const newController = new AbortController();
|
||||
setController(newController);
|
||||
// create a signal for requests
|
||||
const { signal } = newController;
|
||||
// start polling
|
||||
let interval = setInterval(() => {
|
||||
getData({ emitterChain, emitterAddress }, baseUrl, signal, getRecents);
|
||||
}, 30000);
|
||||
setPollInterval(interval);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
// getData if first load (no totals or recents), or emitterAddress/emitterChain changed.
|
||||
if (
|
||||
(!totals && !recent) ||
|
||||
emitterAddress !== address ||
|
||||
emitterChain !== chain
|
||||
) {
|
||||
const newController = new AbortController();
|
||||
setController(newController);
|
||||
getData(
|
||||
{ emitterChain, emitterAddress },
|
||||
activeNetwork.endpoints.bigtableFunctionsBase,
|
||||
newController.signal,
|
||||
getAllEndpoints
|
||||
);
|
||||
}
|
||||
setTotals(undefined);
|
||||
setRecent(undefined);
|
||||
setNotionalTransferred(undefined);
|
||||
setNotionalTransferredTo(undefined);
|
||||
setNotionalTransferredToCumulative(undefined);
|
||||
|
||||
pollingController(
|
||||
emitterChain,
|
||||
emitterAddress,
|
||||
activeNetwork.endpoints.bigtableFunctionsBase
|
||||
);
|
||||
// hold chain & address in state to detect changes
|
||||
setChain(emitterChain);
|
||||
setAddress(emitterAddress);
|
||||
}, [
|
||||
emitterChain,
|
||||
emitterAddress,
|
||||
activeNetwork.endpoints.bigtableFunctionsBase,
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
return function cleanup() {
|
||||
controller.abort();
|
||||
if (pollInterval) {
|
||||
clearInterval(pollInterval);
|
||||
}
|
||||
};
|
||||
}, [pollInterval, activeNetwork.endpoints.bigtableFunctionsBase]);
|
||||
|
||||
let title = "Recent messages";
|
||||
let hideTableTitles = false;
|
||||
if (emitterChain) {
|
||||
title = `Recent ${ChainID[Number(emitterChain)]} messages`;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
{!totals && !recent ? (
|
||||
<Card
|
||||
sx={{
|
||||
backgroundColor: "rgba(255,255,255,.07)",
|
||||
backgroundImage: "none",
|
||||
borderRadius: "28px",
|
||||
padding: "24px",
|
||||
textAlign: "center",
|
||||
mt: 5,
|
||||
}}
|
||||
>
|
||||
<CircularProgress />
|
||||
</Card>
|
||||
) : (
|
||||
<>
|
||||
{recent && (
|
||||
<div style={{ margin: "40px 0" }}>
|
||||
<RecentMessages
|
||||
recent={recent}
|
||||
lastFetched={lastFetched}
|
||||
title={title}
|
||||
hideTableTitles={hideTableTitles}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{!emitterChain && !emitterAddress ? (
|
||||
totals && notionalTransferredToCumulative && notionalTransferred ? (
|
||||
<GridWithCards
|
||||
spacing={3}
|
||||
sm={6}
|
||||
md={3}
|
||||
cardPaddingTop={3}
|
||||
imgAlignMd="center"
|
||||
imgOffsetRightMd="0px"
|
||||
imgOffsetTopXs="0px"
|
||||
imgOffsetTopMd="-36px"
|
||||
imgOffsetTopMdHover="-52px"
|
||||
imgPaddingBottomXs={3}
|
||||
headerTextAlign="center"
|
||||
data={[
|
||||
{
|
||||
header: ChainID[1],
|
||||
src: solanaIcon,
|
||||
to: `${explorer}?emitterChain=1`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="1"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
},
|
||||
{
|
||||
header: ChainID[2],
|
||||
src: ethereumIcon,
|
||||
to: `${explorer}?emitterChain=2`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="2"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
},
|
||||
{
|
||||
header: ChainID[3],
|
||||
src: terraIcon,
|
||||
to: `${explorer}?emitterChain=3`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="3"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
},
|
||||
{
|
||||
header: ChainID[4],
|
||||
src: binanceChainIcon,
|
||||
to: `${explorer}?emitterChain=4`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="4"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
},
|
||||
{
|
||||
header: ChainID[5],
|
||||
src: polygonIcon,
|
||||
to: `${explorer}?emitterChain=5`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="5"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
},
|
||||
{
|
||||
header: ChainID[6],
|
||||
src: avalancheIcon,
|
||||
to: `${explorer}?emitterChain=6`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="6"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
},
|
||||
{
|
||||
header: ChainID[7],
|
||||
src: oasisIcon,
|
||||
to: `${explorer}?emitterChain=7`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="7"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
}
|
||||
].concat(
|
||||
// check the we have transfer data before adding the fantom card
|
||||
("10" in notionalTransferredToCumulative.AllTime) &&
|
||||
("*" in notionalTransferredToCumulative.AllTime["10"]) ?
|
||||
[{
|
||||
header: ChainID[10],
|
||||
src: fantomIcon,
|
||||
to: `${explorer}?emitterChain=10`,
|
||||
description: (
|
||||
<ChainOverviewCard
|
||||
totals={totals}
|
||||
notionalTransferredToCumulative={
|
||||
notionalTransferredToCumulative
|
||||
}
|
||||
notionalTransferred={notionalTransferred}
|
||||
dataKey="10"
|
||||
/>
|
||||
),
|
||||
imgStyle: { height: 110 },
|
||||
}] : []
|
||||
)}
|
||||
/>
|
||||
) : (
|
||||
<Box
|
||||
sx={{
|
||||
padding: "24px",
|
||||
textAlign: "center",
|
||||
}}
|
||||
>
|
||||
<CircularProgress />
|
||||
</Box>
|
||||
)
|
||||
) : null}
|
||||
|
||||
<div style={{ margin: "40px 0" }}>
|
||||
{!emitterChain && !emitterAddress ? (
|
||||
notionalTransferredTo && totals ? (
|
||||
<PastWeekCard
|
||||
title="Last 7 Days"
|
||||
numDaysToShow={7}
|
||||
messages={totals}
|
||||
notionalTransferredTo={notionalTransferredTo}
|
||||
notionalTransferred={notionalTransferred}
|
||||
/>
|
||||
) : (
|
||||
<Card
|
||||
sx={{
|
||||
backgroundColor: "rgba(255,255,255,.07)",
|
||||
backgroundImage: "none",
|
||||
borderRadius: "28px",
|
||||
padding: "24px",
|
||||
textAlign: "center",
|
||||
}}
|
||||
>
|
||||
<CircularProgress />
|
||||
</Card>
|
||||
)
|
||||
) : null}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ExplorerStats;
|
|
@ -1,109 +0,0 @@
|
|||
import { Box, Card, Typography } from "@mui/material";
|
||||
import React from "react";
|
||||
import { chainEnums, chainIDs } from "../../utils/consts";
|
||||
import { chainColors } from "../../utils/explorer";
|
||||
import DailyCountBarChart from "./DailyCountBarChart";
|
||||
import DailyNotionalBarChart from "./DailyNotionalBarChart";
|
||||
import {
|
||||
NotionalTransferred,
|
||||
NotionalTransferredTo,
|
||||
Totals,
|
||||
} from "./ExplorerStats";
|
||||
|
||||
interface PastWeekCardProps {
|
||||
title: string;
|
||||
messages: Totals;
|
||||
numDaysToShow: number;
|
||||
notionalTransferred?: NotionalTransferred;
|
||||
notionalTransferredTo: NotionalTransferredTo;
|
||||
}
|
||||
|
||||
const PastWeekCard: React.FC<PastWeekCardProps> = ({
|
||||
title,
|
||||
messages,
|
||||
numDaysToShow,
|
||||
notionalTransferredTo,
|
||||
}) => {
|
||||
const dates = [...Array(numDaysToShow)]
|
||||
.map((_, i) => {
|
||||
const d = new Date();
|
||||
d.setDate(d.getDate() - i);
|
||||
return d;
|
||||
})
|
||||
.map((d) => {
|
||||
const isoStr = d.toISOString();
|
||||
return isoStr.slice(0, 10);
|
||||
})
|
||||
.reverse();
|
||||
|
||||
let messagesForPeriod = dates
|
||||
.filter((date) => messages && date in messages?.DailyTotals)
|
||||
.reduce<{ [date: string]: { [groupByKey: string]: number } }>(
|
||||
(accum, key) => ({ ...accum, [key]: messages.DailyTotals[key] }),
|
||||
Object()
|
||||
);
|
||||
|
||||
let notionalTransferredToInPeriod = dates
|
||||
.filter((date) => date in notionalTransferredTo.Daily)
|
||||
.reduce<NotionalTransferredTo["Daily"]>(
|
||||
(accum, key) => ((accum[key] = notionalTransferredTo.Daily[key]), accum),
|
||||
Object()
|
||||
);
|
||||
|
||||
return (
|
||||
<Card
|
||||
sx={{
|
||||
backgroundColor: "rgba(255,255,255,.07)",
|
||||
backgroundImage: "none",
|
||||
borderRadius: "28px",
|
||||
padding: "24px",
|
||||
}}
|
||||
>
|
||||
<Typography variant="h4" gutterBottom>
|
||||
{title}
|
||||
</Typography>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
justifyContent: "space-evenly",
|
||||
alignItems: "center",
|
||||
flexWrap: "wrap",
|
||||
gap: 16,
|
||||
marginBottom: 10,
|
||||
}}
|
||||
>
|
||||
<DailyCountBarChart dailyCount={messagesForPeriod} />
|
||||
|
||||
<DailyNotionalBarChart daily={notionalTransferredToInPeriod} />
|
||||
</div>
|
||||
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexWrap: "wrap",
|
||||
justifyContent: "space-evenly",
|
||||
width: "100%",
|
||||
}}
|
||||
>
|
||||
{Object.values(chainIDs).map((chainId) => (
|
||||
<Box
|
||||
key={chainId}
|
||||
sx={{ display: "flex", alignItems: "center", mx: 1 }}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
background: chainColors[String(chainId)],
|
||||
height: 12,
|
||||
width: 12,
|
||||
display: "inline-block",
|
||||
}}
|
||||
/>
|
||||
<div> {chainEnums[chainId]}</div>
|
||||
</Box>
|
||||
))}
|
||||
</div>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
export default PastWeekCard;
|
|
@ -1,230 +0,0 @@
|
|||
import React from "react";
|
||||
import { Link as RouterLink } from "gatsby";
|
||||
import { Recent } from "./ExplorerStats";
|
||||
import ReactTimeAgo from "react-time-ago";
|
||||
import {
|
||||
Box,
|
||||
Card,
|
||||
Link,
|
||||
Table,
|
||||
TableBody,
|
||||
TableCell,
|
||||
TableContainer,
|
||||
TableFooter,
|
||||
TableHead,
|
||||
TableRow,
|
||||
Typography,
|
||||
} from "@mui/material";
|
||||
import { contractNameFormatter } from "../../utils/explorer";
|
||||
import { ChainID, chainIDs } from "../../utils/consts";
|
||||
import { formatQuorumDate } from "../../utils/time";
|
||||
import { explorer } from "../../utils/urls";
|
||||
import ChainIcon from "../ChainIcon";
|
||||
import { DecodePayload } from "../DecodePayload";
|
||||
|
||||
interface RecentMessagesProps {
|
||||
recent: Recent;
|
||||
lastFetched?: number;
|
||||
title: string;
|
||||
hideTableTitles?: boolean;
|
||||
}
|
||||
|
||||
const RecentMessages = (props: RecentMessagesProps) => {
|
||||
// const columns: ColumnsType<BigTableMessage> = [
|
||||
// {
|
||||
// title: "",
|
||||
// key: "icon",
|
||||
// render: (item: BigTableMessage) =>
|
||||
// networkIcons[chainIDs[item.EmitterChain]],
|
||||
// responsive: ["sm"],
|
||||
// },
|
||||
// {
|
||||
// title: "contract",
|
||||
// key: "contract",
|
||||
// render: (item: BigTableMessage) => {
|
||||
// const name = contractNameFormatter(
|
||||
// item.EmitterAddress,
|
||||
// chainIDs[item.EmitterChain]
|
||||
// );
|
||||
// return <div>{name}</div>;
|
||||
// },
|
||||
// responsive: ["sm"],
|
||||
// },
|
||||
// {
|
||||
// title: "message",
|
||||
// key: "payload",
|
||||
// render: (item: BigTableMessage) =>
|
||||
// item.SignedVAABytes ? (
|
||||
// <DecodePayload
|
||||
// base64VAA={item.SignedVAABytes}
|
||||
// emitterChainName={item.EmitterChain}
|
||||
// emitterAddress={item.EmitterAddress}
|
||||
// showType={true}
|
||||
// showSummary={true}
|
||||
// transferDetails={item.TransferDetails}
|
||||
// />
|
||||
// ) : null,
|
||||
// },
|
||||
// {
|
||||
// title: "sequence",
|
||||
// key: "sequence",
|
||||
// render: (item: BigTableMessage) => {
|
||||
// let sequence = item.Sequence.replace(/^0+/, "");
|
||||
// if (!sequence) sequence = "0";
|
||||
|
||||
// return sequence;
|
||||
// },
|
||||
// responsive: ["md"],
|
||||
// },
|
||||
// {
|
||||
// title: "attested",
|
||||
// dataIndex: "QuorumTime",
|
||||
// key: "time",
|
||||
// render: (QuorumTime) => (
|
||||
// <ReactTimeAgo
|
||||
// date={
|
||||
// QuorumTime ? Date.parse(formatQuorumDate(QuorumTime)) : new Date()
|
||||
// }
|
||||
// locale={intl.locale}
|
||||
// timeStyle={!screens.md ? "twitter" : "round"}
|
||||
// />
|
||||
// ),
|
||||
// },
|
||||
// {
|
||||
// title: "",
|
||||
// key: "view",
|
||||
// render: (item: BigTableMessage) => (
|
||||
// <Link
|
||||
// to={`/${intl.locale}/explorer/?emitterChain=${
|
||||
// chainIDs[item.EmitterChain]
|
||||
// }&emitterAddress=${item.EmitterAddress}&sequence=${item.Sequence}`}
|
||||
// >
|
||||
// View
|
||||
// </Link>
|
||||
// ),
|
||||
// },
|
||||
// ];
|
||||
|
||||
const formatKey = (key: string) => {
|
||||
if (props.hideTableTitles) {
|
||||
return null;
|
||||
}
|
||||
if (key.includes(":")) {
|
||||
const parts = key.split(":");
|
||||
const link = `${explorer}?emitterChain=${parts[0]}&emitterAddress=${parts[1]}`;
|
||||
return (
|
||||
<Typography variant="subtitle1" gutterBottom>
|
||||
From {ChainID[Number(parts[0])]} contract:{" "}
|
||||
<Link component={RouterLink} to={link} color="inherit">
|
||||
{contractNameFormatter(parts[1], Number(parts[0]))}
|
||||
</Link>
|
||||
</Typography>
|
||||
);
|
||||
} else if (key === "*") {
|
||||
return (
|
||||
<Typography variant="subtitle1" gutterBottom>
|
||||
From all chains and addresses
|
||||
</Typography>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<Typography variant="subtitle1" gutterBottom>
|
||||
From {ChainID[Number(key)]}
|
||||
</Typography>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Card
|
||||
sx={{
|
||||
backgroundColor: "rgba(255,255,255,.07)",
|
||||
backgroundImage: "none",
|
||||
borderRadius: "28px",
|
||||
padding: "24px",
|
||||
}}
|
||||
>
|
||||
<Typography variant="h4" gutterBottom>
|
||||
{props.title}
|
||||
</Typography>
|
||||
{Object.keys(props.recent).map((key) => (
|
||||
<TableContainer key={key}>
|
||||
{formatKey(key)}
|
||||
<Table size="small">
|
||||
<TableBody>
|
||||
{props.recent[key].map((item) => (
|
||||
<TableRow key={item.EmitterAddress + item.Sequence}>
|
||||
<TableCell>
|
||||
<ChainIcon chainId={chainIDs[item.EmitterChain]} />
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
{contractNameFormatter(
|
||||
item.EmitterAddress,
|
||||
chainIDs[item.EmitterChain]
|
||||
)}
|
||||
</TableCell>
|
||||
<TableCell sx={{ whiteSpace: "nowrap" }}>
|
||||
{item.SignedVAABytes
|
||||
? <DecodePayload
|
||||
base64VAA={item.SignedVAABytes}
|
||||
emitterChainName={item.EmitterChain}
|
||||
emitterAddress={item.EmitterAddress}
|
||||
showType={true}
|
||||
showSummary={true}
|
||||
transferDetails={item.TransferDetails}
|
||||
/> : null}
|
||||
</TableCell>
|
||||
<TableCell sx={{ whiteSpace: "nowrap" }}>
|
||||
{item.Sequence.replace(/^0+/, "") || "0"}
|
||||
</TableCell>
|
||||
<TableCell sx={{ "& > time": { whiteSpace: "nowrap" } }}>
|
||||
{
|
||||
<ReactTimeAgo
|
||||
date={
|
||||
item.QuorumTime
|
||||
? Date.parse(formatQuorumDate(item.QuorumTime))
|
||||
: new Date()
|
||||
}
|
||||
timeStyle={"round"}
|
||||
/>
|
||||
}
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={`${explorer}?emitterChain=${
|
||||
chainIDs[item.EmitterChain]
|
||||
}&emitterAddress=${item.EmitterAddress}&sequence=${
|
||||
item.Sequence
|
||||
}`}
|
||||
color="inherit"
|
||||
>
|
||||
View
|
||||
</Link>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
))}
|
||||
</TableBody>
|
||||
<TableFooter>
|
||||
<TableRow>
|
||||
<TableCell
|
||||
colSpan={6}
|
||||
sx={{ textAlign: "right", borderBottom: "none" }}
|
||||
>
|
||||
{props.lastFetched ? (
|
||||
<ReactTimeAgo
|
||||
date={new Date(props.lastFetched)}
|
||||
timeStyle="round"
|
||||
/>
|
||||
) : null}
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
</TableFooter>
|
||||
</Table>
|
||||
</TableContainer>
|
||||
))}
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
export default RecentMessages;
|
|
@ -1,309 +0,0 @@
|
|||
import { Box, IconButton, Link, Typography } from "@mui/material";
|
||||
import { Link as RouterLink } from "gatsby";
|
||||
|
||||
import { gsap } from "gsap";
|
||||
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
||||
|
||||
import React, { useEffect } from "react";
|
||||
import Discord from "../images/Discord.svg";
|
||||
import shape from "../images/footer/shape.svg";
|
||||
import Github from "../images/Github.svg";
|
||||
import Medium from "../images/Medium.svg";
|
||||
import Telegram from "../images/Telegram.svg";
|
||||
import Twitter from "../images/Twitter.svg";
|
||||
import {
|
||||
apps,
|
||||
blog,
|
||||
buidl,
|
||||
brand,
|
||||
discord,
|
||||
docs,
|
||||
explorer,
|
||||
github,
|
||||
jobs,
|
||||
network,
|
||||
portal,
|
||||
telegram,
|
||||
twitter,
|
||||
} from "../utils/urls";
|
||||
import LogoLink from "./LogoLink";
|
||||
|
||||
const linkStyle = {
|
||||
display: "block",
|
||||
mr: { xs: 0, md: 7.5 },
|
||||
mb: 1.5,
|
||||
fontSize: 14,
|
||||
textUnderlineOffset: 6,
|
||||
};
|
||||
const linkActiveStyle = { textDecoration: "underline" };
|
||||
const socialIcon = {
|
||||
"& img": {
|
||||
height: 24,
|
||||
width: 24,
|
||||
},
|
||||
};
|
||||
|
||||
const Footer = () => {
|
||||
|
||||
const shapeLeftf = React.useRef<HTMLCanvasElement>(null);
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
gsap.registerPlugin(ScrollTrigger);
|
||||
|
||||
var viewportWidth = window.innerWidth || document.documentElement.clientWidth;
|
||||
if (viewportWidth > 992) {
|
||||
gsap.from(shapeLeftf.current, {
|
||||
y: 200,
|
||||
x: 200,
|
||||
ease: "Power3.easeOut",
|
||||
scrollTrigger: {
|
||||
trigger: shapeLeftf.current,
|
||||
start: "60% 100%",
|
||||
scrub: 1
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}, [])
|
||||
|
||||
|
||||
return (
|
||||
|
||||
<Box sx={{ position: "relative" }}>
|
||||
<Box
|
||||
ref={shapeLeftf}
|
||||
sx={{
|
||||
position: "absolute",
|
||||
zIndex: -1,
|
||||
transform: { xs: "translate(none)", md: "translate(-50%, 0%)" },
|
||||
background: `url(${shape})`,
|
||||
backgroundRepeat: "no-repeat",
|
||||
backgroundPosition: { xs: "center center", md: "right top -426px" },
|
||||
width: "100%",
|
||||
height: { xs: "100%", md: 540 },
|
||||
bottom:0
|
||||
}}
|
||||
/>
|
||||
<Box
|
||||
sx={{
|
||||
position: "absolute",
|
||||
zIndex: -2,
|
||||
top: '-30%',
|
||||
background: 'radial-gradient(closest-side at 50% 50%, #5189C8 0%, #5189C800 100%) ',
|
||||
transform: 'matrix(0.67, 0.74, -0.74, 0.67, 0, 0)',
|
||||
left: '-5%',
|
||||
width: 1136,
|
||||
height: 1489,
|
||||
pointerEvents: 'none',
|
||||
display:{xs: 'none', md: 'block'},
|
||||
opacity: 0.7,
|
||||
}}
|
||||
/>
|
||||
<Box
|
||||
sx={{
|
||||
maxWidth: 1100,
|
||||
mx: "auto",
|
||||
pt: 21.5,
|
||||
pb: { xs: 6.5, md: 12 },
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
display: "flex",
|
||||
flexWrap: { xs: null, md: "wrap" },
|
||||
flexDirection: { xs: "column", md: "row" },
|
||||
alignItems: { xs: "center", md: "unset" },
|
||||
mx: 3.5,
|
||||
borderTop: "1px solid #585587",
|
||||
pt: 7,
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
pl: { xs: 0, md: 2 },
|
||||
pb: 2,
|
||||
borderTop: { xs: "1px solid #585587", md: "none" },
|
||||
pt: { xs: 7, md: 0 },
|
||||
width: { xs: "100%", md: "auto" },
|
||||
textAlign: { xs: "center", md: "left" },
|
||||
}}
|
||||
>
|
||||
<LogoLink negMt />
|
||||
</Box>
|
||||
<Box sx={{ flexGrow: 1 }} />
|
||||
<Box
|
||||
sx={{
|
||||
pl: { xs: 0, md: 2 },
|
||||
order: { xs: -2, md: 0 },
|
||||
textAlign: { xs: "center", md: "left" },
|
||||
mb: { xs: 7, md: 0 },
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
display: "flex",
|
||||
flexDirection: { xs: "column", md: "row" },
|
||||
}}
|
||||
>
|
||||
<Box>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={apps}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
activeStyle={linkActiveStyle}
|
||||
>
|
||||
Apps
|
||||
</Link>
|
||||
<Link
|
||||
href={portal}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
>
|
||||
Portal
|
||||
</Link>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={buidl}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
activeStyle={linkActiveStyle}
|
||||
>
|
||||
Buidl
|
||||
</Link>
|
||||
<Link
|
||||
href={blog}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
>
|
||||
Blog
|
||||
</Link>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={brand}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
>
|
||||
Brand
|
||||
</Link>
|
||||
</Box>
|
||||
<Box>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={network}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
activeStyle={linkActiveStyle}
|
||||
>
|
||||
Network
|
||||
</Link>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={explorer}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
>
|
||||
Explorer
|
||||
</Link>
|
||||
<Link
|
||||
href={docs}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
>
|
||||
Docs
|
||||
</Link>
|
||||
<Link
|
||||
href={jobs}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
>
|
||||
Jobs
|
||||
</Link>
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
<Box sx={{ flexGrow: 1 }} />
|
||||
<Box
|
||||
sx={{
|
||||
px: 2,
|
||||
order: { xs: -2, md: 0 },
|
||||
textAlign: { xs: "center", md: "left" },
|
||||
borderTop: { xs: "1px solid #585587", md: "none" },
|
||||
pt: { xs: 7, md: 0 },
|
||||
width: { xs: "100%", md: "auto" },
|
||||
mb: { xs: 7, md: 0 },
|
||||
}}
|
||||
>
|
||||
<Typography sx={{ mb: 3 }}>Let's be friends</Typography>
|
||||
<Box>
|
||||
<IconButton
|
||||
href={discord}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
sx={socialIcon}
|
||||
>
|
||||
<img src={Discord} alt="Discord" />
|
||||
</IconButton>
|
||||
<IconButton
|
||||
href={github}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
sx={socialIcon}
|
||||
>
|
||||
<img src={Github} alt="Github" />
|
||||
</IconButton>
|
||||
<IconButton
|
||||
href={blog}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
sx={socialIcon}
|
||||
>
|
||||
<img src={Medium} alt="Medium" />
|
||||
</IconButton>
|
||||
<IconButton
|
||||
href={telegram}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
sx={socialIcon}
|
||||
>
|
||||
<img src={Telegram} alt="Telegram" />
|
||||
</IconButton>
|
||||
<IconButton
|
||||
href={twitter}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
sx={socialIcon}
|
||||
>
|
||||
<img src={Twitter} alt="Twitter" />
|
||||
</IconButton>
|
||||
</Box>
|
||||
</Box>
|
||||
<Box
|
||||
sx={{
|
||||
flexBasis: "100%",
|
||||
pt: { xs: 0, md: 8 },
|
||||
textAlign: { xs: "center", md: "left" },
|
||||
}}
|
||||
>
|
||||
<Typography variant="body2">
|
||||
2022 © Wormhole. All Rights Reserved.
|
||||
</Typography>
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
)
|
||||
}
|
||||
export default Footer;
|
|
@ -1,127 +0,0 @@
|
|||
import { Block } from "@mui/icons-material";
|
||||
import {
|
||||
Card,
|
||||
CardActionArea,
|
||||
Grid,
|
||||
GridSize,
|
||||
GridSpacing,
|
||||
Typography,
|
||||
} from "@mui/material";
|
||||
import { Box, ResponsiveStyleValue } from "@mui/system";
|
||||
import { Link as RouterLink } from "gatsby";
|
||||
import { OutboundLink } from "gatsby-plugin-google-gtag";
|
||||
import React from "react";
|
||||
|
||||
interface CardData {
|
||||
|
||||
key?: string;
|
||||
src: string;
|
||||
header: string;
|
||||
description: JSX.Element | string;
|
||||
href?: string;
|
||||
to?: string;
|
||||
imgStyle?: React.CSSProperties | undefined;
|
||||
size: number;
|
||||
}
|
||||
|
||||
const GridWithCards = ({
|
||||
data,
|
||||
sm = 12,
|
||||
md = 4,
|
||||
spacing = 2,
|
||||
cardPaddingTop = 0,
|
||||
imgAlignMd = "right",
|
||||
imgOffsetRightMd = "-16px",
|
||||
imgOffsetTopXs = "-30px",
|
||||
imgOffsetTopMd = "-16px",
|
||||
imgOffsetTopMdHover,
|
||||
imgPaddingBottomXs = 0,
|
||||
imgPaddingBottomMd = 0,
|
||||
headerTextAlign = "left",
|
||||
}: {
|
||||
data: CardData[];
|
||||
sm?: boolean | GridSize | undefined;
|
||||
md?: boolean | GridSize | undefined;
|
||||
spacing?: ResponsiveStyleValue<GridSpacing>;
|
||||
cardPaddingTop?: number;
|
||||
imgAlignMd?: string;
|
||||
imgOffsetRightMd?: string;
|
||||
imgOffsetTopXs?: string;
|
||||
imgOffsetTopMd?: string;
|
||||
imgOffsetTopMdHover?: string;
|
||||
imgPaddingBottomXs?: number;
|
||||
imgPaddingBottomMd?: number;
|
||||
headerTextAlign?: any;
|
||||
}) => (
|
||||
<Grid
|
||||
container
|
||||
spacing={spacing}
|
||||
justifyContent="space-evenly"
|
||||
sx={{ "& > .MuiGrid-item": { pt: { xs: 8.25, md: 5.25 } } }}
|
||||
>
|
||||
{data.map(({ key, src, header, description, size, href, to, imgStyle }) => (
|
||||
<Grid key={key || header} item xs={12} sm={sm} md={md}>
|
||||
<Card
|
||||
sx={{
|
||||
backgroundColor: "rgba(255,255,255,.07)",
|
||||
backgroundImage: "none",
|
||||
backdropFilter: 'blur(21px)',
|
||||
height: "100%",
|
||||
overflow: "visible",
|
||||
borderRadius: "28px",
|
||||
}}
|
||||
>
|
||||
<CardActionArea
|
||||
component={to ? RouterLink : href ? OutboundLink : undefined}
|
||||
to={to}
|
||||
href={href}
|
||||
target={href ? "_blank" : undefined}
|
||||
rel={href ? "noreferrer" : undefined}
|
||||
disabled={!(href || to)}
|
||||
sx={{
|
||||
px: 4.25,
|
||||
pb: 3,
|
||||
pt: cardPaddingTop,
|
||||
borderRadius: "28px",
|
||||
height: "100%",
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
"& > *": {
|
||||
width: '100%',
|
||||
transition: { md: "300ms top" },
|
||||
},
|
||||
"&:hover > div": {
|
||||
top: {
|
||||
xs: imgOffsetTopXs,
|
||||
md: imgOffsetTopMdHover || imgOffsetTopMd,
|
||||
},
|
||||
},
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
textAlign: { xs: "center", md: imgAlignMd },
|
||||
position: "relative",
|
||||
marginRight: { xs: 'auto', md: imgOffsetRightMd },
|
||||
marginLeft: { xs: 'auto' },
|
||||
top: { xs: imgOffsetTopXs, md: imgOffsetTopMd },
|
||||
mb: { xs: imgPaddingBottomXs, md: imgPaddingBottomMd },
|
||||
zIndex: 1,
|
||||
width: size,
|
||||
height: size,
|
||||
}}
|
||||
>
|
||||
<img src={src} alt="" style={imgStyle} />
|
||||
</Box>
|
||||
<Typography variant="h4" textAlign={headerTextAlign}>{header}</Typography>
|
||||
<Typography component="div" sx={{ mt: 2, flexGrow: 1 }}>
|
||||
{description}
|
||||
</Typography>
|
||||
</CardActionArea>
|
||||
</Card>
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
);
|
||||
|
||||
export default GridWithCards;
|
|
@ -1,28 +0,0 @@
|
|||
import { Box, Typography } from "@mui/material";
|
||||
import React from "react";
|
||||
import AvoidBreak from "./AvoidBreak";
|
||||
|
||||
const HeroText = ({
|
||||
heroSpans,
|
||||
subtitleText,
|
||||
maxWidth = 1155 + 16 * 2,
|
||||
}: {
|
||||
heroSpans: string[];
|
||||
subtitleText: string | string[];
|
||||
maxWidth?: number;
|
||||
}) => (
|
||||
<Box sx={{ m: "auto", maxWidth, textAlign: "center", px: 2 }}>
|
||||
<Typography variant="h1">
|
||||
<AvoidBreak spans={heroSpans} />
|
||||
</Typography>
|
||||
<Typography sx={{ marginTop: 2, fontWeight: 400 }}>
|
||||
{Array.isArray(subtitleText) ? (
|
||||
<AvoidBreak spans={subtitleText} />
|
||||
) : (
|
||||
subtitleText
|
||||
)}
|
||||
</Typography>
|
||||
</Box>
|
||||
);
|
||||
|
||||
export default HeroText;
|
|
@ -1,13 +0,0 @@
|
|||
import React from "react";
|
||||
import Footer from "./Footer";
|
||||
import NavBar from "./Navbar";
|
||||
|
||||
const Layout: React.FC = ({ children }) => (
|
||||
<main style={{overflow:'hidden'}}>
|
||||
<NavBar />
|
||||
{children}
|
||||
<Footer />
|
||||
</main>
|
||||
);
|
||||
|
||||
export default Layout;
|
|
@ -1,24 +0,0 @@
|
|||
import { Button } from "@mui/material";
|
||||
import { Link as RouterLink } from "gatsby";
|
||||
import React from "react";
|
||||
import logo from "../images/logo-and-name.svg";
|
||||
import { home } from "../utils/urls";
|
||||
|
||||
const LogoLink = ({ negMt = false }: { negMt?: boolean }) => (
|
||||
<Button
|
||||
size="small"
|
||||
component={RouterLink}
|
||||
to={home}
|
||||
sx={{
|
||||
display: "flex",
|
||||
p: 1,
|
||||
borderRadius: "8px",
|
||||
ml: -1,
|
||||
mt: negMt ? -1 : 0,
|
||||
}}
|
||||
>
|
||||
<img src={logo} alt="Wormhole" />
|
||||
</Button>
|
||||
);
|
||||
|
||||
export default LogoLink;
|
|
@ -1,56 +0,0 @@
|
|||
import { AppBar, Hidden, Button, Box, Link, Toolbar } from "@mui/material";
|
||||
import ArrowForward from "@mui/icons-material/ArrowForward";
|
||||
import { Link as RouterLink } from "gatsby";
|
||||
import React from "react";
|
||||
import { OutboundLink } from "gatsby-plugin-google-gtag";
|
||||
import hamburger from "../images/hamburger.svg";
|
||||
import { apps, blog, buidl, portal } from "../utils/urls";
|
||||
import LogoLink from "./LogoLink";
|
||||
|
||||
const linkStyle = { ml: 3, textUnderlineOffset: 6 };
|
||||
const linkActiveStyle = { textDecoration: "underline" };
|
||||
|
||||
const NavBar = () => (
|
||||
<AppBar
|
||||
position="static"
|
||||
sx={{ backgroundColor: "transparent" }}
|
||||
elevation={0}
|
||||
>
|
||||
<Toolbar disableGutters sx={{ mt: 2, mx: 4 }}>
|
||||
<LogoLink />
|
||||
<Box sx={{ flexGrow: 1 }} />
|
||||
<Box sx={{ display: { xs: "none", md: "block" } }}>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={apps}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
activeStyle={linkActiveStyle}
|
||||
>
|
||||
Apps
|
||||
</Link>
|
||||
<Link href={portal} color="inherit" underline="hover" sx={linkStyle}>
|
||||
Portal
|
||||
</Link>
|
||||
<Link
|
||||
component={RouterLink}
|
||||
to={buidl}
|
||||
color="inherit"
|
||||
underline="hover"
|
||||
sx={linkStyle}
|
||||
activeStyle={linkActiveStyle}
|
||||
>
|
||||
Buidl
|
||||
</Link>
|
||||
<Link href={blog} color="inherit" underline="hover" sx={linkStyle}>
|
||||
Blog
|
||||
</Link>
|
||||
</Box>
|
||||
{/* <Box sx={{ display: "flex", ml: 8 }}>
|
||||
<img src={hamburger} alt="menu" />
|
||||
</Box> */}
|
||||
</Toolbar>
|
||||
</AppBar>
|
||||
);
|
||||
export default NavBar;
|
|
@ -1,31 +0,0 @@
|
|||
import * as React from "react";
|
||||
import { Box, MenuItem, TextField, Typography } from "@mui/material";
|
||||
import { useNetworkContext } from "../contexts/NetworkContext";
|
||||
import { networks } from "../utils/consts";
|
||||
|
||||
const NetworkSelect = () => {
|
||||
const { activeNetwork, setActiveNetwork } = useNetworkContext();
|
||||
const handleNetworkChange = React.useCallback((e) => {
|
||||
setActiveNetwork(e.target.value);
|
||||
}, []);
|
||||
return (
|
||||
<Box sx={{ display: "flex", alignItems: "center" }}>
|
||||
<Typography variant="body2" sx={{ pr: 2 }}>
|
||||
Network
|
||||
</Typography>
|
||||
<TextField
|
||||
select
|
||||
margin="none"
|
||||
value={activeNetwork.name}
|
||||
onChange={handleNetworkChange}
|
||||
>
|
||||
{networks.map((n) => (
|
||||
<MenuItem key={n} value={n}>{`${n[0].toUpperCase()}${n.substring(
|
||||
1
|
||||
)}`}</MenuItem>
|
||||
))}
|
||||
</TextField>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
export default NetworkSelect;
|
|
@ -1,207 +0,0 @@
|
|||
import React from 'react'
|
||||
import { Helmet, HelmetProps } from 'react-helmet'
|
||||
import { useStaticQuery, graphql } from 'gatsby'
|
||||
|
||||
type Meta = ConcatArray<PropertyMetaObj | NameMetaObj>
|
||||
|
||||
type PropertyMetaObj = {
|
||||
property: string
|
||||
content: string
|
||||
}
|
||||
|
||||
type NameMetaObj = {
|
||||
name: string
|
||||
content: string
|
||||
}
|
||||
|
||||
type SEOProps = {
|
||||
description?: string
|
||||
meta?: Meta
|
||||
title?: string
|
||||
pathname?: string
|
||||
} & HelmetProps
|
||||
|
||||
export function SEO({
|
||||
children,
|
||||
description = '',
|
||||
meta = [],
|
||||
title,
|
||||
pathname,
|
||||
...props
|
||||
}: SEOProps) {
|
||||
const { site } = useStaticQuery<QueryTypes>(SEOStaticQuery)
|
||||
const siteUrl = site.siteMetadata.siteUrl
|
||||
const defaultTitle = site.siteMetadata?.defaultTitle
|
||||
const twitterUsername = `@wormholecrypto`
|
||||
const socialImage = "/wormhole.png"
|
||||
const socialImageWidth = '800'
|
||||
const socialImageHeight = '400'
|
||||
const image = `${siteUrl}${socialImage}`
|
||||
|
||||
const metaDescription = description || 'The best of blockchains'
|
||||
const canonical = pathname ? `${siteUrl}${pathname}` : null
|
||||
|
||||
// for social sharing we want a little more context than just title,
|
||||
// make a string like "Apps | Wormhole"
|
||||
const socialTitle = title ? `${title} | ${defaultTitle}` : title
|
||||
|
||||
return (
|
||||
<Helmet
|
||||
{...props}
|
||||
htmlAttributes={{
|
||||
lang: 'en',
|
||||
}}
|
||||
title={title || defaultTitle}
|
||||
link={[
|
||||
{
|
||||
rel: `apple-touch-icon`,
|
||||
href: `${siteUrl}/apple-touch-icon.png`,
|
||||
sizes: `180x180`,
|
||||
},
|
||||
{
|
||||
rel: `icon`,
|
||||
href: `${siteUrl}/favicon-32x32.png`,
|
||||
sizes: `32x32`,
|
||||
type: `image/png`,
|
||||
},
|
||||
{
|
||||
rel: `icon`,
|
||||
href: `${siteUrl}/favicon-16x16.png`,
|
||||
sizes: `16x16`,
|
||||
type: `image/png`,
|
||||
},
|
||||
{
|
||||
rel: `manifest`,
|
||||
href: `${siteUrl}/site.webmanifest`,
|
||||
},
|
||||
{
|
||||
rel: `mask-icon`,
|
||||
href: `${siteUrl}/safari-pinned-tab.svg`,
|
||||
color: `#5bbad5`,
|
||||
},
|
||||
|
||||
canonical
|
||||
? {
|
||||
rel: 'canonical',
|
||||
href: canonical,
|
||||
}
|
||||
: {},
|
||||
]}
|
||||
meta={[
|
||||
{
|
||||
name: `description`,
|
||||
content: metaDescription,
|
||||
},
|
||||
{
|
||||
name: `msapplication-TileColor`,
|
||||
content: `#603cba"`,
|
||||
},
|
||||
{
|
||||
name: `theme-color`,
|
||||
content: `#ffffff`,
|
||||
},
|
||||
// opengraph metadata
|
||||
{
|
||||
property: `og:title`,
|
||||
content: socialTitle,
|
||||
},
|
||||
{
|
||||
property: `og:description`,
|
||||
content: metaDescription,
|
||||
},
|
||||
{
|
||||
property: `og:site_name`,
|
||||
content: defaultTitle, // "Wormhole" for all pages
|
||||
},
|
||||
{
|
||||
property: `og:type`,
|
||||
content: `website`,
|
||||
},
|
||||
canonical
|
||||
? {
|
||||
property: `og:url`,
|
||||
content: canonical,
|
||||
}
|
||||
: {},
|
||||
{
|
||||
property: 'og:image',
|
||||
content: image,
|
||||
},
|
||||
{
|
||||
property: 'og:image:secure_url',
|
||||
content: image,
|
||||
},
|
||||
{
|
||||
property: `og:image:type`,
|
||||
content: `image/png`,
|
||||
},
|
||||
{
|
||||
property: `og:image:width`,
|
||||
content: socialImageWidth,
|
||||
},
|
||||
{
|
||||
property: `og:image:height`,
|
||||
content: socialImageHeight,
|
||||
},
|
||||
{
|
||||
property: `og:image:alt`,
|
||||
content: `Wormhole logo`,
|
||||
},
|
||||
// twitter metadata
|
||||
{
|
||||
name: `twitter:title`,
|
||||
content: socialTitle,
|
||||
},
|
||||
{
|
||||
name: `twitter:description`,
|
||||
content: metaDescription,
|
||||
},
|
||||
{
|
||||
name: `twitter:image`,
|
||||
content: image,
|
||||
},
|
||||
{
|
||||
name: `twitter:image:alt`,
|
||||
content: `Wormhole logo`,
|
||||
},
|
||||
{
|
||||
name: 'twitter:card',
|
||||
content: 'summary_large_image',
|
||||
},
|
||||
{
|
||||
name: `twitter:site`,
|
||||
content: twitterUsername,
|
||||
},
|
||||
{
|
||||
name: `twitter:creator`,
|
||||
content: twitterUsername,
|
||||
},
|
||||
]
|
||||
// metadata from props
|
||||
.concat(meta)}
|
||||
>
|
||||
|
||||
{children}
|
||||
</Helmet>
|
||||
)
|
||||
}
|
||||
|
||||
type QueryTypes = {
|
||||
site: {
|
||||
siteMetadata: {
|
||||
siteUrl: string
|
||||
defaultTitle: string
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const SEOStaticQuery = graphql`
|
||||
query SEO {
|
||||
site {
|
||||
siteMetadata {
|
||||
siteUrl
|
||||
defaultTitle: title
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
|
@ -1,124 +0,0 @@
|
|||
import React, {
|
||||
createContext,
|
||||
ReactChildren,
|
||||
useCallback,
|
||||
useContext,
|
||||
useMemo,
|
||||
useState,
|
||||
} from "react";
|
||||
import {
|
||||
ChainContracts,
|
||||
endpoints,
|
||||
knownContractsPromise,
|
||||
Network,
|
||||
NetworkChains,
|
||||
NetworkConfig,
|
||||
networks,
|
||||
} from "../utils/consts";
|
||||
|
||||
// Check if window is defined (so if in the browser or in node.js).
|
||||
const isBrowser = typeof window !== "undefined";
|
||||
|
||||
let network: Network;
|
||||
|
||||
const envDefaultNetwork = String(process.env.GATSBY_DEFAULT_NETWORK) as Network
|
||||
|
||||
// check local storage to get the user's last selected network
|
||||
let storedNetwork: Network = "" as Network
|
||||
if (isBrowser) {
|
||||
// isBrowser check for Gatsby develop's SSR
|
||||
storedNetwork = String(window.localStorage.getItem("networkName")) as Network
|
||||
}
|
||||
|
||||
// validate localstorage data, fallback to .env default, fallback to mainnet.
|
||||
if (storedNetwork && networks.includes(storedNetwork)) {
|
||||
// data from local storage is valid
|
||||
network = storedNetwork
|
||||
} else if (networks.includes(envDefaultNetwork)) {
|
||||
// default network from .env is valid
|
||||
network = envDefaultNetwork
|
||||
} else {
|
||||
// use mainnet
|
||||
network = networks[2];
|
||||
}
|
||||
|
||||
export interface ActiveNetwork {
|
||||
name: string;
|
||||
endpoints: NetworkConfig;
|
||||
chains: ChainContracts;
|
||||
}
|
||||
|
||||
export interface INetworkContext {
|
||||
activeNetwork: ActiveNetwork;
|
||||
setActiveNetwork: (network: Network) => void;
|
||||
}
|
||||
|
||||
const NetworkContext = createContext<INetworkContext>({
|
||||
activeNetwork: {
|
||||
name: network,
|
||||
endpoints: endpoints[network],
|
||||
chains: {
|
||||
// initalize empty object, will be replaced async by generated data
|
||||
},
|
||||
},
|
||||
setActiveNetwork: (network: Network) => { },
|
||||
});
|
||||
|
||||
export const NetworkContextProvider = ({
|
||||
children,
|
||||
}: {
|
||||
children: ReactChildren;
|
||||
}) => {
|
||||
const [state, setState] = useState({
|
||||
// knownContracts are generated async and added to state
|
||||
knownContracts: {
|
||||
devnet: {},
|
||||
testnet: {},
|
||||
mainnet: {},
|
||||
} as NetworkChains,
|
||||
activeNetwork: {
|
||||
name: network,
|
||||
endpoints: endpoints[network],
|
||||
chains: {
|
||||
// chains are generated async and added to state
|
||||
},
|
||||
} as ActiveNetwork,
|
||||
});
|
||||
const setActiveNetwork = useCallback(
|
||||
(network: Network) => {
|
||||
async function setNetwork(network: Network) {
|
||||
if (isBrowser) {
|
||||
// isBrowser check for Gatsby develop's SSR
|
||||
window.localStorage.setItem("networkName", network);
|
||||
}
|
||||
|
||||
// generate knownContracts if needed
|
||||
let contracts = state.knownContracts;
|
||||
if (Object.keys(state.knownContracts[network]).length === 0) {
|
||||
contracts = await knownContractsPromise;
|
||||
}
|
||||
|
||||
setState({
|
||||
knownContracts: contracts,
|
||||
activeNetwork: {
|
||||
name: network,
|
||||
endpoints: endpoints[network],
|
||||
chains: contracts[network],
|
||||
},
|
||||
});
|
||||
}
|
||||
setNetwork(network)
|
||||
}, [])
|
||||
|
||||
useMemo(() => setActiveNetwork(network), [])
|
||||
|
||||
return (
|
||||
<NetworkContext.Provider value={{ activeNetwork: state.activeNetwork, setActiveNetwork }}>
|
||||
{children}
|
||||
</NetworkContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
export const useNetworkContext = () => {
|
||||
return useContext(NetworkContext);
|
||||
};
|
|
@ -1,3 +0,0 @@
|
|||
<svg width="26" height="19" viewBox="0 0 26 19" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M22.3967 2.10679C20.1472 0.316323 16.588 0.0128823 16.4354 0.00226469C16.3194 -0.00717259 16.2034 0.0192786 16.1034 0.0779529C16.0033 0.136627 15.9242 0.224619 15.877 0.329735C15.8091 0.48074 15.7515 0.636067 15.7046 0.794675C17.1928 1.04335 19.0207 1.5435 20.6745 2.55832C20.7376 2.59703 20.7924 2.64765 20.8357 2.70728C20.879 2.76692 20.91 2.8344 20.9269 2.90588C20.9438 2.97736 20.9464 3.05144 20.9343 3.12388C20.9223 3.19633 20.896 3.26572 20.8568 3.3281C20.8177 3.39047 20.7665 3.44462 20.7061 3.48743C20.6458 3.53025 20.5776 3.5609 20.5053 3.57763C20.433 3.59437 20.358 3.59686 20.2848 3.58497C20.2115 3.57307 20.1413 3.54703 20.0782 3.50832C17.2352 1.76311 13.6845 1.6765 13 1.6765C12.3161 1.6765 8.76313 1.76367 5.92178 3.50776C5.85869 3.54647 5.78851 3.57252 5.71523 3.58441C5.64196 3.5963 5.56704 3.59381 5.49474 3.57707C5.34872 3.54328 5.22227 3.45352 5.1432 3.32754C5.06412 3.20156 5.0389 3.04969 5.07309 2.90532C5.10727 2.76096 5.19806 2.63594 5.32548 2.55776C6.9793 1.54573 8.80722 1.04335 10.2954 0.79691C10.2095 0.519734 10.1315 0.344823 10.1259 0.329735C10.0788 0.223877 9.99935 0.135308 9.89863 0.0765457C9.79792 0.0177834 9.68107 -0.00820096 9.56461 0.00226469C9.412 0.0134411 5.85283 0.316323 3.57217 2.13082C2.38239 3.21941 0 9.58495 0 15.0882C0 15.1866 0.0265652 15.2805 0.0751739 15.3654C1.7177 18.221 6.20213 18.967 7.22404 19H7.24157C7.33075 19.0002 7.41872 18.9796 7.49829 18.9398C7.57786 18.8999 7.64677 18.8421 7.69939 18.7709L8.73204 17.3649C5.94383 16.6535 4.51948 15.4442 4.43809 15.3721C4.32566 15.274 4.25726 15.1358 4.24793 14.9878C4.2386 14.8398 4.28911 14.6942 4.38835 14.5831C4.48758 14.4719 4.62742 14.4043 4.77709 14.3951C4.92676 14.3858 5.07401 14.4358 5.18643 14.5339C5.21922 14.5646 7.84239 16.7647 13 16.7647C18.1661 16.7647 20.7893 14.5557 20.8158 14.5339C20.9286 14.4365 21.0759 14.3873 21.2253 14.3971C21.3747 14.407 21.5141 14.4751 21.6128 14.5864C21.6616 14.6413 21.6991 14.7052 21.723 14.7744C21.7468 14.8436 21.7567 14.9167 21.752 14.9897C21.7473 15.0627 21.728 15.134 21.6954 15.1996C21.6628 15.2652 21.6174 15.3238 21.5619 15.3721C21.4805 15.4442 20.0562 16.6535 17.268 17.3649L18.3012 18.7709C18.3537 18.842 18.4226 18.8998 18.502 18.9396C18.5815 18.9795 18.6693 19.0001 18.7584 19H18.7754C19.7984 18.967 24.2823 18.2204 25.9254 15.3654C25.9734 15.2805 26 15.1866 26 15.0882C26 9.58495 23.6176 3.21997 22.3967 2.10679V2.10679ZM9.32609 12.8529C8.23296 12.8529 7.34783 11.8527 7.34783 10.6177C7.34783 9.38266 8.23296 8.38237 9.32609 8.38237C10.4192 8.38237 11.3043 9.38266 11.3043 10.6177C11.3043 11.8527 10.4192 12.8529 9.32609 12.8529ZM16.6739 12.8529C15.5808 12.8529 14.6957 11.8527 14.6957 10.6177C14.6957 9.38266 15.5808 8.38237 16.6739 8.38237C17.767 8.38237 18.6522 9.38266 18.6522 10.6177C18.6522 11.8527 17.767 12.8529 16.6739 12.8529Z" fill="#FFFFFF"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.9 KiB |
|
@ -1,14 +0,0 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="459.319px" height="459.319px" viewBox="0 0 459.319 459.319" style="enable-background:new 0 0 459.319 459.319;"
|
||||
xml:space="preserve">
|
||||
<path fill="#FFFFFF" d="M94.924,366.674h312.874c0.958,0,1.886-0.136,2.778-0.349c0.071,0,0.13,0.012,0.201,0.012
|
||||
c6.679,0,12.105-5.42,12.105-12.104V12.105C422.883,5.423,417.456,0,410.777,0h-2.955H114.284H94.941
|
||||
c-32.22,0-58.428,26.214-58.428,58.425c0,0.432,0.085,0.842,0.127,1.259c-0.042,29.755-0.411,303.166-0.042,339.109
|
||||
c-0.023,0.703-0.109,1.389-0.109,2.099c0,30.973,24.252,56.329,54.757,58.245c0.612,0.094,1.212,0.183,1.847,0.183h317.683
|
||||
c6.679,0,12.105-5.42,12.105-12.105v-45.565c0-6.68-5.427-12.105-12.105-12.105s-12.105,5.426-12.105,12.105v33.461H94.924
|
||||
c-18.395,0-33.411-14.605-34.149-32.817c0.018-0.325,0.077-0.632,0.071-0.963c-0.012-0.532-0.03-1.359-0.042-2.459
|
||||
C61.862,380.948,76.739,366.674,94.924,366.674z M103.178,58.425c0-6.682,5.423-12.105,12.105-12.105s12.105,5.423,12.105,12.105
|
||||
V304.31c0,6.679-5.423,12.105-12.105,12.105s-12.105-5.427-12.105-12.105V58.425z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,3 +0,0 @@
|
|||
<svg width="21" height="21" viewBox="0 0 21 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M19.5915 5.36061C18.6526 3.71151 17.3789 2.40591 15.7703 1.44353C14.1615 0.481094 12.4051 0 10.4999 0C8.59497 0 6.838 0.481241 5.22948 1.44353C3.62072 2.40586 2.34716 3.71151 1.40822 5.36061C0.469422 7.00966 0 8.81044 0 10.7629C0 13.1082 0.667524 15.2172 2.00291 17.0904C3.33815 18.9637 5.06308 20.26 7.17756 20.9794C7.42369 21.0262 7.6059 20.9933 7.72436 20.8814C7.84288 20.7694 7.90207 20.6291 7.90207 20.4611C7.90207 20.4331 7.89972 20.1809 7.89517 19.7043C7.89048 19.2278 7.88828 18.812 7.88828 18.4573L7.57381 18.513C7.37332 18.5507 7.12038 18.5666 6.81502 18.5621C6.5098 18.5577 6.19294 18.525 5.86487 18.464C5.53667 18.4036 5.2314 18.2634 4.94882 18.0439C4.6664 17.8243 4.4659 17.5369 4.34738 17.1821L4.21067 16.8596C4.11954 16.6449 3.97608 16.4064 3.78008 16.145C3.58409 15.8833 3.38589 15.7059 3.18539 15.6125L3.08967 15.5422C3.02589 15.4955 2.9667 15.4392 2.91197 15.3739C2.85728 15.3086 2.81634 15.2432 2.789 15.1777C2.76161 15.1122 2.7843 15.0584 2.85733 15.0163C2.93035 14.9741 3.06233 14.9536 3.25382 14.9536L3.52715 14.9955C3.70945 15.033 3.93494 15.1448 4.20392 15.3318C4.47275 15.5186 4.69374 15.7615 4.86694 16.0603C5.07668 16.4435 5.32937 16.7355 5.62573 16.9364C5.92186 17.1373 6.22042 17.2376 6.52115 17.2376C6.82187 17.2376 7.0816 17.2142 7.30043 17.1677C7.51903 17.121 7.72412 17.0507 7.91562 16.9574C7.99765 16.3311 8.22099 15.85 8.58544 15.5138C8.06598 15.4578 7.59895 15.3735 7.18412 15.2615C6.76953 15.1492 6.3411 14.9671 5.89911 14.7146C5.45689 14.4625 5.09004 14.1494 4.79846 13.7758C4.50684 13.4021 4.26751 12.9114 4.0808 12.3043C3.894 11.6969 3.80058 10.9962 3.80058 10.2021C3.80058 9.07138 4.16068 8.10919 4.88073 7.31498C4.54343 6.4649 4.57527 5.51194 4.97636 4.4562C5.24069 4.37201 5.63268 4.43519 6.15214 4.64533C6.6717 4.85556 7.0521 5.03566 7.29373 5.18498C7.53536 5.33425 7.72896 5.46075 7.87482 5.56334C8.72263 5.32051 9.59755 5.19907 10.4998 5.19907C11.4021 5.19907 12.2772 5.32051 13.125 5.56334L13.6445 5.22714C13.9998 5.00282 14.4193 4.79725 14.9021 4.61038C15.3852 4.4236 15.7546 4.37216 16.0099 4.45634C16.4199 5.51214 16.4564 6.46505 16.119 7.31513C16.839 8.10934 17.1993 9.07177 17.1993 10.2022C17.1993 10.9963 17.1055 11.6992 16.919 12.3113C16.7323 12.9234 16.4909 13.4136 16.1947 13.7828C15.8983 14.152 15.5291 14.4627 15.0871 14.7148C14.645 14.9671 14.2164 15.1492 13.8019 15.2614C13.3871 15.3736 12.92 15.4579 12.4006 15.514C12.8744 15.9343 13.1113 16.5977 13.1113 17.5039V20.4607C13.1113 20.6287 13.1683 20.7689 13.2823 20.881C13.3963 20.9929 13.5762 21.0258 13.8223 20.9789C15.9371 20.2597 17.662 18.9633 18.9972 17.09C20.3322 15.2168 21 13.1078 21 10.7625C20.9995 8.81029 20.5299 7.00966 19.5915 5.36061Z" fill="#FFFFFF"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.7 KiB |
|
@ -1 +0,0 @@
|
|||
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" fill-rule="evenodd" fill="#FFFFFF"><path d="M2.846 6.887c.03-.295-.083-.586-.303-.784l-2.24-2.7v-.403h6.958l5.378 11.795 4.728-11.795h6.633v.403l-1.916 1.837c-.165.126-.247.333-.213.538v13.498c-.034.204.048.411.213.537l1.871 1.837v.403h-9.412v-.403l1.939-1.882c.19-.19.19-.246.19-.537v-10.91l-5.389 13.688h-.728l-6.275-13.688v9.174c-.052.385.076.774.347 1.052l2.521 3.058v.404h-7.148v-.404l2.521-3.058c.27-.279.39-.67.325-1.052v-10.608z"/></svg>
|
Before Width: | Height: | Size: 509 B |
|
@ -1,3 +0,0 @@
|
|||
<svg width="24px" height="24px" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
|
||||
<path fill="#FFFFFF" d="M12,0c-6.626,0 -12,5.372 -12,12c0,6.627 5.374,12 12,12c6.627,0 12,-5.373 12,-12c0,-6.628 -5.373,-12 -12,-12Zm3.224,17.871c0.188,0.133 0.43,0.166 0.646,0.085c0.215,-0.082 0.374,-0.267 0.422,-0.491c0.507,-2.382 1.737,-8.412 2.198,-10.578c0.035,-0.164 -0.023,-0.334 -0.151,-0.443c-0.129,-0.109 -0.307,-0.14 -0.465,-0.082c-2.446,0.906 -9.979,3.732 -13.058,4.871c-0.195,0.073 -0.322,0.26 -0.316,0.467c0.007,0.206 0.146,0.385 0.346,0.445c1.381,0.413 3.193,0.988 3.193,0.988c0,0 0.847,2.558 1.288,3.858c0.056,0.164 0.184,0.292 0.352,0.336c0.169,0.044 0.348,-0.002 0.474,-0.121c0.709,-0.669 1.805,-1.704 1.805,-1.704c0,0 2.084,1.527 3.266,2.369Zm-6.423,-5.062l0.98,3.231l0.218,-2.046c0,0 3.783,-3.413 5.941,-5.358c0.063,-0.057 0.071,-0.153 0.019,-0.22c-0.052,-0.067 -0.148,-0.083 -0.219,-0.037c-2.5,1.596 -6.939,4.43 -6.939,4.43Z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,3 +0,0 @@
|
|||
<svg width="22" height="18" viewBox="0 0 22 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.8361 2.09102C21.0578 2.4457 20.2199 2.68554 19.3409 2.79271C20.2385 2.24157 20.9273 1.36765 21.2518 0.326603C20.4113 0.83692 19.4826 1.20818 18.4905 1.4072C17.6998 0.540936 16.5697 0 15.319 0C12.9207 0 10.975 1.99662 10.975 4.4589C10.975 4.80846 11.0123 5.14783 11.0869 5.47443C7.47527 5.28816 4.27389 3.51481 2.12928 0.813956C1.75506 1.47482 1.54122 2.24157 1.54122 3.05808C1.54122 4.60434 2.30831 5.96944 3.47448 6.76936C2.76334 6.74767 2.09199 6.54482 1.50517 6.21311V6.26797C1.50517 8.42916 3.00329 10.2319 4.99249 10.6401C4.62822 10.7447 4.24406 10.797 3.84746 10.797C3.56773 10.797 3.29421 10.7702 3.0294 10.7179C3.58265 12.4887 5.18644 13.7786 7.08862 13.813C5.60169 15.0097 3.72686 15.7229 1.69166 15.7229C1.34106 15.7229 0.994193 15.7025 0.654785 15.6616C2.5781 16.9247 4.8632 17.6634 7.31613 17.6634C15.3103 17.6634 19.6803 10.8698 19.6803 4.97687C19.6803 4.78295 19.6766 4.58903 19.6691 4.39893C20.5182 3.76997 21.2555 2.98536 21.8361 2.09102" fill="#FFFFFF"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 15 KiB |
|
@ -1,35 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 338.6 294.7" style="enable-background:new 0 0 338.6 294.7;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{clip-path:url(#SVGID_00000074428201918211048820000015955111953353006476_);}
|
||||
.st1{fill:url(#SVGID_00000104669311538768211870000000101404122542395265_);}
|
||||
</style>
|
||||
<g id="Layer_2_00000052078790509646841670000000813375994663887798_">
|
||||
<g id="Layer_1-2">
|
||||
<g>
|
||||
<defs>
|
||||
<path id="SVGID_1_" d="M263.9,238.7l-34.1-4.2L157.8,62.2L24.5,243.8L164.7,0L263.9,238.7z M203.2,58l81.7,196.7L98.6,230.4
|
||||
l-21.3,28.4l261.3,34.4L203.2,58z M56.2,268.6l113.7-149l-13.8-33.1L0,294.7h265.9L56.2,268.6z"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000183944204005193239050000014230086248616965557_">
|
||||
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
<g style="clip-path:url(#SVGID_00000183944204005193239050000014230086248616965557_);">
|
||||
|
||||
<linearGradient id="SVGID_00000111174505500891714840000018148185228839787696_" gradientUnits="userSpaceOnUse" x1="-736.7351" y1="-415.0173" x2="-735.7351" y2="-415.0173" gradientTransform="matrix(196.5485 223.7265 -223.7265 196.5485 52054.457 246467.3594)">
|
||||
<stop offset="0" style="stop-color:#FF6C21"/>
|
||||
<stop offset="3.000000e-02" style="stop-color:#F66929"/>
|
||||
<stop offset="0.26" style="stop-color:#AC4F6A"/>
|
||||
<stop offset="0.42" style="stop-color:#7E3F92"/>
|
||||
<stop offset="0.5" style="stop-color:#6C39A2"/>
|
||||
<stop offset="1" style="stop-color:#403FD8"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_00000111174505500891714840000018148185228839787696_);" points="-146.1,128.4 191.1,-167.9
|
||||
484.7,166.3 147.5,462.6 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 7.1 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 5.0 KiB |
|
@ -1,10 +0,0 @@
|
|||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 155 155" style="enable-background:new 0 0 155 155;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill:#70D44B;}
|
||||
</style>
|
||||
<path class="st0" d="M77.5,16.5c6.1,0,11.6,3.4,14.3,8.8l45,90c4,7.9,0.8,17.5-7.1,21.5c-2.2,1.1-4.7,1.7-7.2,1.7h-90
|
||||
c-8.8,0-16-7.2-16-16c0-2.5,0.6-4.9,1.7-7.2l45-90C65.9,19.9,71.4,16.5,77.5,16.5 M77.5,5.5c-10.2,0-19.6,5.8-24.1,14.9l-45,90
|
||||
c-6.7,13.3-1.3,29.6,12.1,36.2c3.8,1.9,7.9,2.9,12.1,2.9h90c14.9,0,27-12.1,27-27c0-4.2-1-8.3-2.9-12.1l-45-90
|
||||
C97.1,11.3,87.7,5.5,77.5,5.5z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 657 B |
|
@ -1,4 +0,0 @@
|
|||
<svg width="1503" height="1504" viewBox="0 0 1503 1504" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect x="287" y="258" width="928" height="844" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M1502.5 752C1502.5 1166.77 1166.27 1503 751.5 1503C336.734 1503 0.5 1166.77 0.5 752C0.5 337.234 336.734 1 751.5 1C1166.27 1 1502.5 337.234 1502.5 752ZM538.688 1050.86H392.94C362.314 1050.86 347.186 1050.86 337.962 1044.96C327.999 1038.5 321.911 1027.8 321.173 1015.99C320.619 1005.11 328.184 991.822 343.312 965.255L703.182 330.935C718.495 303.999 726.243 290.531 736.021 285.55C746.537 280.2 759.083 280.2 769.599 285.55C779.377 290.531 787.126 303.999 802.438 330.935L876.42 460.079L876.797 460.738C893.336 489.635 901.723 504.289 905.385 519.669C909.443 536.458 909.443 554.169 905.385 570.958C901.695 586.455 893.393 601.215 876.604 630.549L687.573 964.702L687.084 965.558C670.436 994.693 661.999 1009.46 650.306 1020.6C637.576 1032.78 622.263 1041.63 605.474 1046.62C590.161 1050.86 573.004 1050.86 538.688 1050.86ZM906.75 1050.86H1115.59C1146.4 1050.86 1161.9 1050.86 1171.13 1044.78C1181.09 1038.32 1187.36 1027.43 1187.92 1015.63C1188.45 1005.1 1181.05 992.33 1166.55 967.307C1166.05 966.455 1165.55 965.588 1165.04 964.706L1060.43 785.75L1059.24 783.735C1044.54 758.877 1037.12 746.324 1027.59 741.472C1017.08 736.121 1004.71 736.121 994.199 741.472C984.605 746.453 976.857 759.552 961.544 785.934L857.306 964.891L856.949 965.507C841.69 991.847 834.064 1005.01 834.614 1015.81C835.352 1027.62 841.44 1038.5 851.402 1044.96C860.443 1050.86 875.94 1050.86 906.75 1050.86Z" fill="#E84142"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1,15 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 254 254" style="enable-background:new 0 0 254 254;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#E84142;}
|
||||
.st1{fill:#FFFFFF;}
|
||||
</style>
|
||||
<g>
|
||||
<circle class="st0" cx="127" cy="127" r="127"/>
|
||||
<path class="st1" d="M171.8,130.3c4.4-7.6,11.5-7.6,15.9,0l27.4,48.1c4.4,7.6,0.8,13.8-8,13.8h-55.2c-8.7,0-12.3-6.2-8-13.8
|
||||
L171.8,130.3z M118.8,37.7c4.4-7.6,11.4-7.6,15.8,0l6.1,11L155.1,74c3.5,7.2,3.5,15.7,0,22.9l-48.3,83.7
|
||||
c-4.4,6.8-11.7,11.1-19.8,11.6H46.9c-8.8,0-12.4-6.1-8-13.8L118.8,37.7z"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 825 B |
|
@ -1,28 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" opacity="0.56" width="2323.848" height="2555.167" viewBox="0 0 2323.848 2555.167">
|
||||
<defs>
|
||||
<clipPath id="clip-path">
|
||||
<rect id="Rectangle_1353" data-name="Rectangle 1353" width="1480.425" height="1527.483" transform="translate(-143)" fill="none" stroke="#fff" stroke-width="0.5"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip-path-2">
|
||||
<rect id="Rectangle_1353-2" data-name="Rectangle 1353" width="1144.425" height="1181.425" fill="none" stroke="#fff" stroke-width="0.5"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Group_3232" data-name="Group 3232" transform="translate(220.424 -104.575)">
|
||||
<g id="Group_2633" data-name="Group 2633" transform="translate(766 1132.259)" opacity="0.25">
|
||||
<g id="Group_2632" data-name="Group 2632" clip-path="url(#clip-path)">
|
||||
<ellipse id="Ellipse_63" data-name="Ellipse 63" cx="667.75" cy="667.75" rx="667.75" ry="667.75" transform="translate(-111.522 154.819)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
<ellipse id="Ellipse_65" data-name="Ellipse 65" cx="533.168" cy="533.168" rx="533.168" ry="533.168" transform="translate(72.439 188.422)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
<ellipse id="Ellipse_67" data-name="Ellipse 67" cx="398.586" cy="398.586" rx="398.586" ry="398.586" transform="translate(262.864 280.206)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
<ellipse id="Ellipse_68" data-name="Ellipse 68" cx="285.397" cy="285.397" rx="285.397" ry="285.397" transform="matrix(-1, -0.008, 0.008, -1, 989.058, 923.378)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_2679" data-name="Group 2679" transform="translate(-220.424 104.575)" opacity="0.25">
|
||||
<g id="Group_2632-2" data-name="Group 2632" clip-path="url(#clip-path-2)">
|
||||
<circle id="Ellipse_63-2" data-name="Ellipse 63" cx="516.468" cy="516.468" r="516.468" transform="translate(87.744 119.744)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
<circle id="Ellipse_65-2" data-name="Ellipse 65" cx="412.376" cy="412.376" r="412.376" transform="translate(153.644 145.734)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
<circle id="Ellipse_67-2" data-name="Ellipse 67" cx="308.284" cy="308.284" r="308.284" transform="translate(214.545 216.724)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
<circle id="Ellipse_68-2" data-name="Ellipse 68" cx="220.739" cy="220.739" r="220.739" transform="matrix(1, -0.008, 0.008, 1, 266.011, 272.717)" fill="none" stroke="#fff" stroke-miterlimit="10" stroke-width="0.5"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.7 KiB |
|
@ -1,19 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="196.9" height="83.865" viewBox="0 0 196.9 83.865">
|
||||
<defs>
|
||||
<clipPath id="clip-path">
|
||||
<rect id="Rectangle_1658" data-name="Rectangle 1658" width="196.901" height="83.865" transform="translate(0 0)" fill="#17153f"/>
|
||||
</clipPath>
|
||||
<radialGradient id="radial-gradient" cx="0.5" cy="0.5" r="0.5" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#5189c8"/>
|
||||
<stop offset="1" stop-color="#5189c8" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="radial-gradient-2" cx="0.5" cy="0.5" r="0.5" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#e72850"/>
|
||||
<stop offset="1" stop-color="#e72850" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<g id="Mask_Group_16" data-name="Mask Group 16" clip-path="url(#clip-path)">
|
||||
<ellipse id="Ellipse_160" data-name="Ellipse 160" cx="71.042" cy="104.16" rx="71.042" ry="104.16" transform="translate(94.295 -95.243) rotate(45)" opacity="0.679" fill="url(#radial-gradient)"/>
|
||||
<ellipse id="Ellipse_161" data-name="Ellipse 161" cx="95.726" cy="53.792" rx="95.726" ry="53.792" transform="matrix(0.875, 0.485, -0.485, 0.875, 90.032, -9.592)" fill="url(#radial-gradient-2)"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,38 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="156" height="85" viewBox="0 0 156 85">
|
||||
<defs>
|
||||
<linearGradient id="linear-gradient" x1="1" y1="0.012" x2="0" y2="1" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#e72850"/>
|
||||
<stop offset="1" stop-color="#3d2670"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-2" x1="1" x2="0" y2="1" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#e72850"/>
|
||||
<stop offset="1" stop-color="#5189c8"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-3" x1="1" x2="0" y2="1" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#26276f"/>
|
||||
<stop offset="1" stop-color="#5189c8"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-4" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#eeb430"/>
|
||||
<stop offset="1" stop-color="#5189c8"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-5" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#f44b1b"/>
|
||||
<stop offset="1" stop-color="#3d2670"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-6" x1="0.5" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#f44b1b"/>
|
||||
<stop offset="1" stop-color="#eeb430"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="Group_3235" data-name="Group 3235" transform="translate(9958 2714)">
|
||||
<g id="Group_3234" data-name="Group 3234">
|
||||
<rect id="Rectangle_1659" data-name="Rectangle 1659" width="47" height="40" transform="translate(-9958 -2714)" fill="url(#linear-gradient)"/>
|
||||
<rect id="Rectangle_1660" data-name="Rectangle 1660" width="47" height="40" transform="translate(-9903 -2714)" fill="url(#linear-gradient-2)"/>
|
||||
<rect id="Rectangle_1662" data-name="Rectangle 1662" width="47" height="40" transform="translate(-9849 -2714)" fill="url(#linear-gradient-3)"/>
|
||||
<rect id="Rectangle_1663" data-name="Rectangle 1663" width="47" height="40" transform="translate(-9849 -2669)" fill="url(#linear-gradient-4)"/>
|
||||
<rect id="Rectangle_1664" data-name="Rectangle 1664" width="47" height="40" transform="translate(-9903 -2669)" fill="url(#linear-gradient-5)"/>
|
||||
</g>
|
||||
<rect id="Rectangle_1665" data-name="Rectangle 1665" width="47" height="40" transform="translate(-9958 -2669)" fill="url(#linear-gradient-6)"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 145 KiB |
Before Width: | Height: | Size: 91 KiB |
|
@ -1,23 +0,0 @@
|
|||
<svg id="Group_3063" data-name="Group 3063" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="249.332" height="43.464" viewBox="0 0 249.332 43.464">
|
||||
<defs>
|
||||
<clipPath id="clip-path">
|
||||
<rect id="Rectangle_1331" data-name="Rectangle 1331" width="249.332" height="43.464" transform="translate(0 0)" fill="#fff"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Group_2614" data-name="Group 2614" transform="translate(0 0)" clip-path="url(#clip-path)">
|
||||
<path id="Path_1571" data-name="Path 1571" d="M146.389,29.369l-5.7,16.127a.369.369,0,0,1-.379.251h-.433a.4.4,0,0,1-.386-.251l-4.276-11.311L130.945,45.5a.384.384,0,0,1-.379.251h-.44a.379.379,0,0,1-.378-.251l-5.7-16.121c-.088-.25.007-.406.251-.406h1.765a.367.367,0,0,1,.386.251l4.066,12.21,4.133-11.183a.391.391,0,0,1,.386-.25h.372a.383.383,0,0,1,.379.25l4.255,11.183,3.971-12.21a.367.367,0,0,1,.386-.251h1.739c.251,0,.345.156.257.4" transform="translate(-65.489 -15.299)" fill="#fff"/>
|
||||
<path id="Path_1572" data-name="Path 1572" d="M205.2,36.951a8.416,8.416,0,1,1-16.83,0,8.416,8.416,0,1,1,16.83,0m-2.334,0c0-3.91-2.55-6.6-6.082-6.6s-6.082,2.693-6.082,6.6,2.55,6.6,6.082,6.6,6.082-2.693,6.082-6.6" transform="translate(-99.473 -15.026)" fill="#fff"/>
|
||||
<path id="Path_1573" data-name="Path 1573" d="M257.029,44.807a.406.406,0,0,1-.359.67h-1.59a.314.314,0,0,1-.257-.149l-3.991-6.021h-4.289v5.831a.344.344,0,0,1-.338.338h-1.549a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h6.109c4.275,0,6.386,2.246,6.386,5.168a4.865,4.865,0,0,1-4.012,4.9Zm-6.7-7.394c3.362,0,4.492-1.394,4.492-3.274s-1.13-3.274-4.492-3.274h-3.781v6.548Z" transform="translate(-129.02 -15.299)" fill="#fff"/>
|
||||
<path id="Path_1574" data-name="Path 1574" d="M308.354,28.4h.507a.32.32,0,0,1,.338.338v16.1a.32.32,0,0,1-.338.338h-1.549a.32.32,0,0,1-.338-.338V33.41l-6.258,9.058a.257.257,0,0,1-.467,0l-6.257-9.058V44.835a.32.32,0,0,1-.338.338h-1.549a.32.32,0,0,1-.338-.338v-16.1a.32.32,0,0,1,.338-.338h.5a.509.509,0,0,1,.42.23l7.455,10.411,7.461-10.411a.488.488,0,0,1,.412-.23" transform="translate(-154.077 -14.996)" fill="#fff"/>
|
||||
<path id="Path_1575" data-name="Path 1575" d="M365.423,29.308v15.83a.344.344,0,0,1-.338.338h-1.549a.344.344,0,0,1-.338-.338V37.927H352.922v7.211a.344.344,0,0,1-.338.338h-1.549a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h1.549a.344.344,0,0,1,.338.338v6.724H363.2V29.308a.344.344,0,0,1,.338-.338h1.549a.344.344,0,0,1,.338.338" transform="translate(-185.196 -15.299)" fill="#fff"/>
|
||||
<path id="Path_1576" data-name="Path 1576" d="M419.021,36.951a8.416,8.416,0,1,1-16.831,0,8.416,8.416,0,1,1,16.831,0m-2.334,0c0-3.91-2.55-6.6-6.082-6.6s-6.082,2.693-6.082,6.6,2.55,6.6,6.082,6.6,6.082-2.693,6.082-6.6" transform="translate(-212.389 -15.026)" fill="#fff"/>
|
||||
<path id="Path_1577" data-name="Path 1577" d="M469.825,43.92v1.218a.32.32,0,0,1-.338.338H458.48a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h1.549a.344.344,0,0,1,.338.338V43.582h9.119a.32.32,0,0,1,.338.338" transform="translate(-241.937 -15.299)" fill="#fff"/>
|
||||
<path id="Path_1578" data-name="Path 1578" d="M514.28,43.92v1.218a.32.32,0,0,1-.338.338H502.056a.344.344,0,0,1-.338-.338V29.308a.344.344,0,0,1,.338-.338h11.615a.32.32,0,0,1,.338.338v1.218a.32.32,0,0,1-.338.338h-9.728v5.168h8.646a.318.318,0,0,1,.338.331v1.225a.319.319,0,0,1-.338.338h-8.646v5.655h10a.32.32,0,0,1,.338.338" transform="translate(-264.948 -15.299)" fill="#fff"/>
|
||||
<path id="Path_1579" data-name="Path 1579" d="M21.732,43.464A21.732,21.732,0,1,1,43.464,21.732,21.757,21.757,0,0,1,21.732,43.464m0-42.5A20.768,20.768,0,1,0,42.5,21.732,20.791,20.791,0,0,0,21.732.964" transform="translate(0 0)" fill="#fff"/>
|
||||
<path id="Path_1580" data-name="Path 1580" d="M27.97,43.9A19.526,19.526,0,1,1,47.5,24.37,19.548,19.548,0,0,1,27.97,43.9m0-38.217A18.691,18.691,0,1,0,46.661,24.37,18.711,18.711,0,0,0,27.97,5.68" transform="translate(-4.459 -2.558)" fill="#fff"/>
|
||||
<path id="Path_1581" data-name="Path 1581" d="M34.208,44.328a17.32,17.32,0,1,1,17.32-17.32,17.339,17.339,0,0,1-17.32,17.32m0-33.934A16.614,16.614,0,1,0,50.821,27.008,16.632,16.632,0,0,0,34.208,10.394" transform="translate(-8.918 -5.116)" fill="#fff"/>
|
||||
<path id="Path_1582" data-name="Path 1582" d="M40.446,44.761A15.115,15.115,0,1,1,55.56,29.646,15.132,15.132,0,0,1,40.446,44.761m0-29.652A14.536,14.536,0,1,0,54.982,29.646,14.553,14.553,0,0,0,40.446,15.11" transform="translate(-13.377 -7.674)" fill="#fff"/>
|
||||
<path id="Path_1583" data-name="Path 1583" d="M46.683,45.194A12.909,12.909,0,1,1,59.593,32.284,12.924,12.924,0,0,1,46.683,45.194m0-25.368A12.459,12.459,0,1,0,59.142,32.284,12.473,12.473,0,0,0,46.683,19.825" transform="translate(-17.835 -10.232)" fill="#fff"/>
|
||||
<path id="Path_1584" data-name="Path 1584" d="M52.922,45.625a10.7,10.7,0,1,1,10.7-10.7,10.716,10.716,0,0,1-10.7,10.7m0-21.085A10.382,10.382,0,1,0,63.3,34.922,10.393,10.393,0,0,0,52.922,24.54" transform="translate(-22.295 -12.789)" fill="#fff"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 4.8 KiB |
|
@ -1,10 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="66.26" height="66.26" viewBox="0 0 66.26 66.26">
|
||||
<g id="Group_3067" data-name="Group 3067" transform="translate(12576.755 7336.418)">
|
||||
<path id="Path_1579" data-name="Path 1579" d="M33.13,66.26A33.13,33.13,0,1,1,66.26,33.13,33.168,33.168,0,0,1,33.13,66.26m0-64.79A31.66,31.66,0,1,0,64.79,33.13,31.7,31.7,0,0,0,33.13,1.47" transform="translate(-12576.755 -7336.418)" fill="#fff"/>
|
||||
<path id="Path_1580" data-name="Path 1580" d="M38.211,64.379A29.768,29.768,0,1,1,67.978,34.611,29.8,29.8,0,0,1,38.211,64.379m0-58.261A28.493,28.493,0,1,0,66.705,34.611,28.525,28.525,0,0,0,38.211,6.118" transform="translate(-12579.124 -7337.777)" fill="#fff"/>
|
||||
<path id="Path_1581" data-name="Path 1581" d="M43.293,62.5a26.4,26.4,0,1,1,26.4-26.4,26.433,26.433,0,0,1-26.4,26.4m0-51.731A25.327,25.327,0,1,0,68.619,36.092,25.355,25.355,0,0,0,43.293,10.765" transform="translate(-12581.493 -7339.136)" fill="#fff"/>
|
||||
<path id="Path_1582" data-name="Path 1582" d="M48.374,60.616A23.043,23.043,0,1,1,71.415,37.574,23.069,23.069,0,0,1,48.374,60.616m0-45.2a22.161,22.161,0,1,0,22.16,22.161,22.186,22.186,0,0,0-22.16-22.161" transform="translate(-12583.862 -7340.495)" fill="#fff"/>
|
||||
<path id="Path_1583" data-name="Path 1583" d="M53.454,58.735a19.68,19.68,0,1,1,19.68-19.68,19.7,19.7,0,0,1-19.68,19.68m0-38.674A18.994,18.994,0,1,0,72.448,39.055,19.015,19.015,0,0,0,53.454,20.061" transform="translate(-12586.231 -7341.854)" fill="#fff"/>
|
||||
<path id="Path_1584" data-name="Path 1584" d="M58.535,56.853A16.317,16.317,0,1,1,74.853,40.535,16.336,16.336,0,0,1,58.535,56.853m0-32.144A15.827,15.827,0,1,0,74.363,40.535,15.845,15.845,0,0,0,58.535,24.709" transform="translate(-12588.601 -7343.213)" fill="#fff"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.7 KiB |
|
@ -1,66 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="327" height="271" viewBox="0 0 327 271">
|
||||
<g id="Group_3236" data-name="Group 3236" transform="translate(-294 -1344)">
|
||||
<g id="Group_3083" data-name="Group 3083" transform="translate(15640 10955.632)">
|
||||
<rect id="Rectangle_1624" data-name="Rectangle 1624" width="144" height="35" transform="translate(-15254 -9484.632)" fill="#e72850" opacity="0.147"/>
|
||||
<rect id="Rectangle_1626" data-name="Rectangle 1626" width="74" height="35" transform="translate(-15110 -9449.632) rotate(90)" fill="#e72850" opacity="0.147"/>
|
||||
<rect id="Rectangle_1627" data-name="Rectangle 1627" width="74" height="35" transform="translate(-15219 -9449.632) rotate(90)" fill="#e72850" opacity="0.147"/>
|
||||
<rect id="Rectangle_1625" data-name="Rectangle 1625" width="144" height="35" transform="translate(-15254 -9375.632)" fill="#e72850" opacity="0.147"/>
|
||||
<circle id="Ellipse_146" data-name="Ellipse 146" cx="17.5" cy="17.5" r="17.5" transform="translate(-15184 -9429.632)" fill="#e72850" opacity="0.15"/>
|
||||
<circle id="Ellipse_147" data-name="Ellipse 147" cx="17.5" cy="17.5" r="17.5" transform="translate(-15145 -9375.632)" fill="#e72850" opacity="0.15"/>
|
||||
<circle id="Ellipse_150" data-name="Ellipse 150" cx="17.5" cy="17.5" r="17.5" transform="translate(-15254 -9375.632)" fill="#e72850" opacity="0.15"/>
|
||||
<circle id="Ellipse_148" data-name="Ellipse 148" cx="17.5" cy="17.5" r="17.5" transform="translate(-15145 -9484.632)" fill="#e72850" opacity="0.15"/>
|
||||
<circle id="Ellipse_149" data-name="Ellipse 149" cx="17.5" cy="17.5" r="17.5" transform="translate(-15254 -9484.632)" fill="#e72850" opacity="0.15"/>
|
||||
<g id="Group_3082" data-name="Group 3082" transform="translate(-15218.682 -9449.713)">
|
||||
<path id="Path_1579" data-name="Path 1579" d="M36.856,73.711A36.856,36.856,0,1,1,73.711,36.856,36.9,36.9,0,0,1,36.856,73.711m0-72.076a35.22,35.22,0,1,0,35.22,35.22,35.261,35.261,0,0,0-35.22-35.22" transform="translate(0 0)" fill="#fff"/>
|
||||
<path id="Path_1580" data-name="Path 1580" d="M41.559,71.074A33.115,33.115,0,1,1,74.674,37.959,33.153,33.153,0,0,1,41.559,71.074m0-64.813a31.7,31.7,0,1,0,31.7,31.7,31.733,31.733,0,0,0-31.7-31.7" transform="translate(-1.686 -0.968)" fill="#fff"/>
|
||||
<path id="Path_1581" data-name="Path 1581" d="M46.262,68.435A29.374,29.374,0,1,1,75.635,39.062,29.406,29.406,0,0,1,46.262,68.435m0-57.549A28.175,28.175,0,1,0,74.436,39.062,28.207,28.207,0,0,0,46.262,10.886" transform="translate(-3.371 -1.934)" fill="#fff"/>
|
||||
<path id="Path_1582" data-name="Path 1582" d="M50.965,65.8A25.634,25.634,0,1,1,76.6,40.165,25.663,25.663,0,0,1,50.965,65.8m0-50.287A24.653,24.653,0,1,0,75.617,40.165,24.681,24.681,0,0,0,50.965,15.512" transform="translate(-5.058 -2.901)" fill="#fff"/>
|
||||
<path id="Path_1583" data-name="Path 1583" d="M55.667,63.161A21.893,21.893,0,1,1,77.56,41.268,21.918,21.918,0,0,1,55.667,63.161m0-43.023A21.13,21.13,0,1,0,76.8,41.268a21.153,21.153,0,0,0-21.13-21.13" transform="translate(-6.744 -3.868)" fill="#fff"/>
|
||||
<path id="Path_1584" data-name="Path 1584" d="M60.37,60.523A18.152,18.152,0,1,1,78.523,42.37,18.173,18.173,0,0,1,60.37,60.523m0-35.759A17.607,17.607,0,1,0,77.978,42.37,17.627,17.627,0,0,0,60.37,24.764" transform="translate(-8.43 -4.836)" fill="#fff"/>
|
||||
</g>
|
||||
<line id="Line_96" data-name="Line 96" x2="144" transform="translate(-15254 -9449.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<line id="Line_97" data-name="Line 97" x2="144" transform="translate(-15254 -9375.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<line id="Line_94" data-name="Line 94" y2="144" transform="translate(-15219 -9484.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<line id="Line_95" data-name="Line 95" y2="144" transform="translate(-15145 -9484.632)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<text id="x" transform="translate(-15169 -9409.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-2" data-name="x" transform="translate(-15131 -9464.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-3" data-name="x" transform="translate(-15131 -9355.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-4" data-name="x" transform="translate(-15241 -9464.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-5" data-name="x" transform="translate(-15241 -9355.632)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
</g>
|
||||
<g id="Group_3084" data-name="Group 3084" transform="translate(15615 10965)">
|
||||
<rect id="Rectangle_1620" data-name="Rectangle 1620" width="327" height="23" transform="translate(-15321 -9621)" fill="#e72850" opacity="0.147"/>
|
||||
<rect id="Rectangle_1622" data-name="Rectangle 1622" width="23" height="50" transform="translate(-15321 -9598)" fill="#e72850" opacity="0.147"/>
|
||||
<rect id="Rectangle_1623" data-name="Rectangle 1623" width="23" height="50" transform="translate(-15017 -9598)" fill="#e72850" opacity="0.147"/>
|
||||
<rect id="Rectangle_1621" data-name="Rectangle 1621" width="327" height="23" transform="translate(-15321 -9548)" fill="#e72850" opacity="0.147"/>
|
||||
<circle id="Ellipse_145" data-name="Ellipse 145" cx="11.5" cy="11.5" r="11.5" transform="translate(-15275 -9584)" fill="#e72850" opacity="0.15"/>
|
||||
<path id="Path_1571" data-name="Path 1571" d="M149.063,29.417l-6.384,18.054a.413.413,0,0,1-.424.281h-.484a.445.445,0,0,1-.432-.281l-4.786-12.662-4.778,12.662a.429.429,0,0,1-.424.281h-.492a.425.425,0,0,1-.424-.281l-6.384-18.047c-.1-.28.008-.454.281-.454h1.976a.411.411,0,0,1,.432.281l4.551,13.669L135.916,30.4a.438.438,0,0,1,.432-.28h.416a.429.429,0,0,1,.424.28l4.764,12.518L146.4,29.251a.411.411,0,0,1,.432-.281h1.946c.281,0,.386.174.288.447" transform="translate(-15356.057 -9611.165)" fill="#fff"/>
|
||||
<path id="Path_1572" data-name="Path 1572" d="M207.207,37.966a9.421,9.421,0,1,1-18.841,0,9.421,9.421,0,1,1,18.841,0m-2.612,0c0-4.377-2.855-7.391-6.808-7.391s-6.808,3.014-6.808,7.391,2.855,7.391,6.808,7.391,6.808-3.014,6.808-7.391" transform="translate(-15386.412 -9610.922)" fill="#fff"/>
|
||||
<path id="Path_1573" data-name="Path 1573" d="M258.548,46.7a.455.455,0,0,1-.4.75h-1.78a.351.351,0,0,1-.288-.166l-4.468-6.74h-4.8v6.528a.385.385,0,0,1-.379.379H244.7a.385.385,0,0,1-.378-.379V29.349a.385.385,0,0,1,.378-.379h6.839c4.786,0,7.149,2.515,7.149,5.786a5.446,5.446,0,0,1-4.491,5.483Zm-7.5-8.277c3.764,0,5.028-1.56,5.028-3.665s-1.265-3.665-5.028-3.665h-4.233v7.331Z" transform="translate(-15412.805 -9611.165)" fill="#fff"/>
|
||||
<path id="Path_1574" data-name="Path 1574" d="M310.336,28.4h.568a.358.358,0,0,1,.379.379V46.8a.358.358,0,0,1-.379.379H309.17a.358.358,0,0,1-.379-.379V34.009l-7.005,10.14a.287.287,0,0,1-.522,0l-7-10.14V46.8a.358.358,0,0,1-.379.379h-1.734a.358.358,0,0,1-.379-.379V28.776a.358.358,0,0,1,.379-.379h.561a.57.57,0,0,1,.47.257l8.345,11.655,8.353-11.655a.547.547,0,0,1,.462-.257" transform="translate(-15435.187 -9610.896)" fill="#fff"/>
|
||||
<path id="Path_1575" data-name="Path 1575" d="M367.182,29.349V47.069a.385.385,0,0,1-.379.379H365.07a.385.385,0,0,1-.379-.379V39h-11.5v8.073a.385.385,0,0,1-.379.379h-1.734a.385.385,0,0,1-.379-.379V29.349a.385.385,0,0,1,.379-.379h1.734a.385.385,0,0,1,.379.379v7.528h11.5V29.349a.385.385,0,0,1,.379-.379H366.8a.385.385,0,0,1,.379.379" transform="translate(-15462.983 -9611.165)" fill="#fff"/>
|
||||
<path id="Path_1576" data-name="Path 1576" d="M421.031,37.966a9.421,9.421,0,1,1-18.841,0,9.421,9.421,0,1,1,18.841,0m-2.612,0c0-4.377-2.855-7.391-6.808-7.391s-6.808,3.014-6.808,7.391,2.855,7.391,6.808,7.391,6.808-3.014,6.808-7.391" transform="translate(-15487.273 -9610.922)" fill="#fff"/>
|
||||
<path id="Path_1577" data-name="Path 1577" d="M471.221,45.706v1.363a.358.358,0,0,1-.379.379H458.521a.385.385,0,0,1-.379-.379V29.349a.385.385,0,0,1,.379-.379h1.734a.385.385,0,0,1,.378.379V45.328h10.208a.358.358,0,0,1,.379.379" transform="translate(-15513.667 -9611.165)" fill="#fff"/>
|
||||
<path id="Path_1578" data-name="Path 1578" d="M515.781,45.706v1.363a.358.358,0,0,1-.379.379H502.1a.385.385,0,0,1-.379-.379V29.349a.385.385,0,0,1,.379-.379h13a.358.358,0,0,1,.379.379v1.363a.358.358,0,0,1-.379.379H504.21v5.786h9.678a.356.356,0,0,1,.378.371v1.371a.357.357,0,0,1-.378.378H504.21v6.331H515.4a.358.358,0,0,1,.379.379" transform="translate(-15534.222 -9611.165)" fill="#fff"/>
|
||||
<path id="Path_1579-2" data-name="Path 1579" d="M24.328,48.656A24.328,24.328,0,1,1,48.656,24.328,24.356,24.356,0,0,1,24.328,48.656m0-47.577A23.249,23.249,0,1,0,47.577,24.328,23.275,23.275,0,0,0,24.328,1.079" transform="translate(-15297.559 -9597.5)" fill="#fff"/>
|
||||
<path id="Path_1580-2" data-name="Path 1580" d="M30.3,48.562A21.859,21.859,0,1,1,52.161,26.7,21.884,21.884,0,0,1,30.3,48.562m0-42.782A20.923,20.923,0,1,0,51.226,26.7,20.947,20.947,0,0,0,30.3,5.78" transform="translate(-15301.542 -9599.785)" fill="#fff"/>
|
||||
<path id="Path_1581-2" data-name="Path 1581" d="M36.277,48.466A19.389,19.389,0,1,1,55.666,29.077,19.411,19.411,0,0,1,36.277,48.466m0-37.988a18.6,18.6,0,1,0,18.6,18.6,18.619,18.619,0,0,0-18.6-18.6" transform="translate(-15305.524 -9602.069)" fill="#fff"/>
|
||||
<path id="Path_1582-2" data-name="Path 1582" d="M42.252,48.372a16.921,16.921,0,1,1,16.92-16.921,16.94,16.94,0,0,1-16.92,16.921m0-33.194A16.273,16.273,0,1,0,58.524,31.452,16.292,16.292,0,0,0,42.252,15.179" transform="translate(-15309.508 -9604.354)" fill="#fff"/>
|
||||
<path id="Path_1583-2" data-name="Path 1583" d="M48.226,48.278A14.452,14.452,0,1,1,62.677,33.827,14.468,14.468,0,0,1,48.226,48.278m0-28.4A13.948,13.948,0,1,0,62.173,33.827,13.963,13.963,0,0,0,48.226,19.879" transform="translate(-15313.49 -9606.64)" fill="#fff"/>
|
||||
<path id="Path_1584-2" data-name="Path 1584" d="M54.2,48.183A11.982,11.982,0,1,1,66.182,36.2,12,12,0,0,1,54.2,48.183m0-23.6A11.622,11.622,0,1,0,65.823,36.2,11.635,11.635,0,0,0,54.2,24.578" transform="translate(-15317.473 -9608.924)" fill="#fff"/>
|
||||
<circle id="Ellipse_141" data-name="Ellipse 141" cx="11.5" cy="11.5" r="11.5" transform="translate(-15321 -9548)" fill="#e72850" opacity="0.15"/>
|
||||
<circle id="Ellipse_144" data-name="Ellipse 144" cx="11.5" cy="11.5" r="11.5" transform="translate(-15017 -9548)" fill="#e72850" opacity="0.15"/>
|
||||
<circle id="Ellipse_142" data-name="Ellipse 142" cx="11.5" cy="11.5" r="11.5" transform="translate(-15321 -9621)" fill="#e72850" opacity="0.15"/>
|
||||
<circle id="Ellipse_143" data-name="Ellipse 143" cx="11.5" cy="11.5" r="11.5" transform="translate(-15017 -9621)" fill="#e72850" opacity="0.15"/>
|
||||
<line id="Line_90" data-name="Line 90" x2="327" transform="translate(-15321 -9598)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<line id="Line_91" data-name="Line 91" x2="327" transform="translate(-15321 -9548)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<line id="Line_92" data-name="Line 92" y2="96" transform="translate(-15298 -9621)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<line id="Line_93" data-name="Line 93" y2="96" transform="translate(-15017 -9621)" fill="none" stroke="#e72850" stroke-width="0.3"/>
|
||||
<text id="x-6" data-name="x" transform="translate(-15266 -9570)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-7" data-name="x" transform="translate(-15313 -9607)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-8" data-name="x" transform="translate(-15009 -9607)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-9" data-name="x" transform="translate(-15313 -9533)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
<text id="x-10" data-name="x" transform="translate(-15009 -9533)" fill="#e72850" font-size="12" font-family="DMSans-Bold, DM Sans" font-weight="700" letter-spacing="-0.015em"><tspan x="0" y="0">x</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 12 KiB |
|
@ -1,252 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 26.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 469.2 241.6" style="enable-background:new 0 0 469.2 241.6;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{filter:url(#Rectangle_1586);}
|
||||
.st1{fill:#FFFFFF;}
|
||||
.st2{fill:url(#Rectangle_1588_00000072984838052793609770000016580739207881068976_);}
|
||||
.st3{fill:#17153F;}
|
||||
.st4{clip-path:url(#SVGID_00000111894869100567970070000008178852524558605244_);}
|
||||
.st5{opacity:0.679;fill:url(#Path_1972_00000078045868472253129160000018245583812902236570_);enable-background:new ;}
|
||||
.st6{fill:url(#Path_1973_00000063591956186286342630000005807507703255243909_);}
|
||||
</style>
|
||||
<filter filterUnits="userSpaceOnUse" height="190.251" id="Rectangle_1586" width="303.541" x="0" y="0">
|
||||
<feOffset input="SourceAlpha"></feOffset>
|
||||
<feGaussianBlur result="blur" stdDeviation="12.5"></feGaussianBlur>
|
||||
<feFlood flood-opacity="0.161"></feFlood>
|
||||
<feComposite in2="blur" operator="in"></feComposite>
|
||||
<feComposite in="SourceGraphic" operator="over"></feComposite>
|
||||
</filter>
|
||||
<g id="Group_3240" transform="translate(-721.5 -880.803)">
|
||||
<g id="Group_3238">
|
||||
<g id="Group_3237">
|
||||
<g transform="matrix(1, 0, 0, 1, 721.5, 880.8)" class="st0">
|
||||
<path id="Rectangle_1586-2_00000101083937350879403790000003057290472737524649_" class="st1" d="M13.1,1.4h206.5
|
||||
c6.1,0,11,4.9,11,11v93.3c0,6.1-4.9,11-11,11H13.1c-6.1,0-11-4.9-11-11V12.4C2.1,6.3,7.1,1.4,13.1,1.4z"/>
|
||||
</g>
|
||||
<path id="Rectangle_1587" d="M975.2,882.2h202.5c7.2,0,13,5.8,13,13v89.3c0,7.2-5.8,13-13,13H975.2c-7.2,0-13-5.8-13-13v-89.3
|
||||
C962.2,888,968,882.2,975.2,882.2z"/>
|
||||
|
||||
<linearGradient id="Rectangle_1588_00000137823246902477658210000013075911900380249477_" gradientUnits="userSpaceOnUse" x1="258.4623" y1="1365.9044" x2="258.8013" y2="1366.8724" gradientTransform="matrix(228.541 0 0 -115.251 -58007.6953 158508.0938)">
|
||||
<stop offset="0" style="stop-color:#26276F"/>
|
||||
<stop offset="1" style="stop-color:#5189C8"/>
|
||||
</linearGradient>
|
||||
<path id="Rectangle_1588" style="fill:url(#Rectangle_1588_00000137823246902477658210000013075911900380249477_);" d="
|
||||
M975.2,1007.2h202.5c7.2,0,13,5.8,13,13v89.3c0,7.2-5.8,13-13,13H975.2c-7.2,0-13-5.8-13-13v-89.3
|
||||
C962.2,1013,968,1007.2,975.2,1007.2z"/>
|
||||
<path id="Rectangle_1674" class="st3" d="M736.6,1007.2h202.5c7.2,0,13,5.8,13,13v89.3c0,7.2-5.8,13-13,13H736.6
|
||||
c-7.2,0-13-5.8-13-13v-89.3C723.6,1013,729.5,1007.2,736.6,1007.2z"/>
|
||||
</g>
|
||||
<g>
|
||||
<defs>
|
||||
<path id="SVGID_1_" d="M734.6,1007.2h206.5c6.1,0,11,4.9,11,11v93.3c0,6.1-4.9,11-11,11H734.6c-6.1,0-11-4.9-11-11v-93.3
|
||||
C723.6,1012.1,728.6,1007.2,734.6,1007.2z"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_00000116213729444295010020000007503588847360528798_">
|
||||
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
|
||||
</clipPath>
|
||||
|
||||
<g id="Mask_Group_14" transform="translate(759.003 1043.281)" style="clip-path:url(#SVGID_00000116213729444295010020000007503588847360528798_);">
|
||||
|
||||
<radialGradient id="Path_1972_00000146462170496474873880000014798572949226437285_" cx="-499.7274" cy="325.4244" r="0.5" gradientTransform="matrix(128.1554 128.1554 186.8015 -186.8015 3299.9165 124836.1875)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" style="stop-color:#5189C8"/>
|
||||
<stop offset="1" style="stop-color:#5189C8;stop-opacity:0"/>
|
||||
</radialGradient>
|
||||
|
||||
<path id="Path_1972" style="opacity:0.679;fill:url(#Path_1972_00000146462170496474873880000014798572949226437285_);enable-background:new ;" d="
|
||||
M132.4-97.4c32.2,38,20,114.1-27.2,169.9S-6.4,142.7-38.6,104.6S-58.6-9.5-11.4-65.3S100.2-135.4,132.4-97.4z"/>
|
||||
|
||||
<radialGradient id="Path_1973_00000165935009589748603650000011754558051740521130_" cx="-500.2261" cy="324.892" r="0.5" gradientTransform="matrix(202.9145 112.4726 69.4791 -125.3489 79066.0078 97066)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" style="stop-color:#E72850"/>
|
||||
<stop offset="1" style="stop-color:#E72850;stop-opacity:0"/>
|
||||
</radialGradient>
|
||||
<path id="Path_1973" style="fill:url(#Path_1973_00000165935009589748603650000011754558051740521130_);" d="M166.4,14.9
|
||||
c53.7,35.2,83.7,92.6,66.9,128.2s-73.8,36-127.5,0.9S22.1,51.4,38.9,15.7S112.7-20.3,166.4,14.9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group_3239">
|
||||
<g id="Component_11_1" transform="translate(816.956 1091.09)">
|
||||
<path id="Path_1692" class="st1" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
|
||||
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
|
||||
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
|
||||
<path id="Path_1693" class="st1" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
|
||||
c2.1,0,3.8,1.6,3.8,3.7C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
|
||||
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
|
||||
<path id="Path_1694" class="st1" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9v2.6
|
||||
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3c0,1.1-0.7,2-1.8,2.2
|
||||
L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
|
||||
<path id="Path_1695" class="st1" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-0.7
|
||||
c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2c0,0.1-0.1,0.1-0.1,0.2
|
||||
c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2c0.1,0,0.1,0,0.2,0.1l3.4,4.7
|
||||
l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
|
||||
<path id="Path_1696" class="st1" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
|
||||
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
|
||||
<path id="Path_1697" class="st1" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
|
||||
c2.1,0,3.8,1.6,3.8,3.7C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
|
||||
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
|
||||
<path id="Path_1698" class="st1" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
|
||||
<path id="Path_1699" class="st1" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
|
||||
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
|
||||
C77.3-23.2,77.3-23.2,77.3-23.2"/>
|
||||
<path id="Path_1700" class="st1" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
|
||||
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
|
||||
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
|
||||
<path id="Path_1701" class="st1" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
|
||||
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
|
||||
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
|
||||
<path id="Path_1702" class="st1" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
|
||||
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
|
||||
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
|
||||
<path id="Path_1703" class="st1" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
|
||||
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
|
||||
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
|
||||
<path id="Path_1704" class="st1" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
|
||||
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
|
||||
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
|
||||
<path id="Path_1705" class="st1" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
|
||||
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
|
||||
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
|
||||
</g>
|
||||
<g id="Group_3076" transform="translate(1055.437 1091.09)">
|
||||
<path id="Path_1692-2" class="st1" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
|
||||
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
|
||||
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
|
||||
<path id="Path_1693-2" class="st1" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
|
||||
c2.1,0,3.8,1.6,3.8,3.7C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
|
||||
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
|
||||
<path id="Path_1694-2" class="st1" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9
|
||||
v2.6c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3
|
||||
c0,1.1-0.7,2-1.8,2.2L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
|
||||
<path id="Path_1695-2" class="st1" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0
|
||||
h-0.7c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2
|
||||
c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2
|
||||
c0.1,0,0.1,0,0.2,0.1l3.4,4.7l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
|
||||
<path id="Path_1696-2" class="st1" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
|
||||
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
|
||||
<path id="Path_1697-2" class="st1" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
|
||||
c2.1,0,3.8,1.6,3.8,3.7C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
|
||||
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
|
||||
<path id="Path_1698-2" class="st1" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
|
||||
<path id="Path_1699-2" class="st1" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
|
||||
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
|
||||
C77.3-23.2,77.3-23.2,77.3-23.2"/>
|
||||
<path id="Path_1700-2" class="st1" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
|
||||
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
|
||||
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
|
||||
<path id="Path_1701-2" class="st1" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
|
||||
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
|
||||
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
|
||||
<path id="Path_1702-2" class="st1" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
|
||||
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
|
||||
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
|
||||
<path id="Path_1703-2" class="st1" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
|
||||
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
|
||||
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
|
||||
<path id="Path_1704-2" class="st1" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
|
||||
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
|
||||
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
|
||||
<path id="Path_1705-2" class="st1" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
|
||||
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
|
||||
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
|
||||
</g>
|
||||
<g id="Group_3077" transform="translate(1055.437 967.111)">
|
||||
<path id="Path_1692-3" class="st1" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
|
||||
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
|
||||
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
|
||||
<path id="Path_1693-3" class="st1" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
|
||||
c2.1,0,3.8,1.6,3.8,3.7C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
|
||||
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
|
||||
<path id="Path_1694-3" class="st1" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9
|
||||
v2.6c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3
|
||||
c0,1.1-0.7,2-1.8,2.2L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
|
||||
<path id="Path_1695-3" class="st1" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0
|
||||
h-0.7c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2
|
||||
c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2
|
||||
c0.1,0,0.1,0,0.2,0.1l3.4,4.7l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
|
||||
<path id="Path_1696-3" class="st1" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
|
||||
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
|
||||
<path id="Path_1697-3" class="st1" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8
|
||||
c2.1,0,3.8,1.6,3.8,3.7C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5
|
||||
c-0.1,1.5,1,2.8,2.5,3c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
|
||||
<path id="Path_1698-3" class="st1" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
|
||||
<path id="Path_1699-3" class="st1" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
|
||||
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
|
||||
C77.3-23.2,77.3-23.2,77.3-23.2"/>
|
||||
<path id="Path_1700-3" class="st1" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
|
||||
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
|
||||
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
|
||||
<path id="Path_1701-3" class="st1" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
|
||||
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
|
||||
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
|
||||
<path id="Path_1702-3" class="st1" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
|
||||
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
|
||||
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
|
||||
<path id="Path_1703-3" class="st1" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
|
||||
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
|
||||
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
|
||||
<path id="Path_1704-3" class="st1" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
|
||||
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
|
||||
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
|
||||
<path id="Path_1705-3" class="st1" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
|
||||
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
|
||||
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
|
||||
</g>
|
||||
<g id="Component_10_1" transform="translate(816.956 967.111)">
|
||||
<path id="Path_1692-4" d="M1.2-29.7l-2.6,7.3c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-1.9-5.1l-1.9,5.1
|
||||
c0,0.1-0.1,0.1-0.2,0.1h-0.2c-0.1,0-0.1,0-0.2-0.1l-2.6-7.3c0-0.1,0-0.2,0.1-0.2H-8c0.1,0,0.1,0,0.2,0.1l1.8,5.5l1.9-5.1
|
||||
c0-0.1,0.1-0.1,0.2-0.1h0.2c0.1,0,0.1,0,0.2,0.1l1.9,5.1l1.8-5.5c0-0.1,0.1-0.1,0.2-0.1h0.8C1.2-29.9,1.2-29.8,1.2-29.7"/>
|
||||
<path id="Path_1693-4" d="M12.4-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.6,3.8,3.7
|
||||
C12.4-26.3,12.4-26.2,12.4-26.2 M11.4-26.2c0.1-1.5-1-2.8-2.5-3c-1.5-0.1-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5c-0.1,1.5,1,2.8,2.5,3
|
||||
c1.5,0.1,2.8-1,3-2.5C11.4-25.9,11.4-26,11.4-26.2"/>
|
||||
<path id="Path_1694-4" d="M22.5-22.8c0.1,0.1,0.1,0.2,0,0.3c0,0-0.1,0-0.1,0h-0.7c0,0-0.1,0-0.1-0.1l-1.8-2.7h-1.9v2.6
|
||||
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.1c0-0.1,0.1-0.2,0.2-0.2h2.8c1.9,0,2.9,1,2.9,2.3c0,1.1-0.7,2-1.8,2.2
|
||||
L22.5-22.8z M19.4-26.1c1.5,0,2-0.6,2-1.5s-0.5-1.5-2-1.5h-1.7v3H19.4z"/>
|
||||
<path id="Path_1695-4" d="M34.3-30h0.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v7.3c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-0.7
|
||||
c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-5.2l-2.8,4.1c0,0.1-0.1,0.1-0.2,0.1c0,0,0,0-0.1-0.1l-2.8-4.1v5.2c0,0.1-0.1,0.1-0.1,0.2
|
||||
c0,0,0,0,0,0H27c-0.1,0-0.1-0.1-0.2-0.1c0,0,0,0,0,0v-7.3c0-0.1,0.1-0.1,0.1-0.2c0,0,0,0,0,0h0.2c0.1,0,0.1,0,0.2,0.1l3.4,4.7
|
||||
l3.4-4.7C34.2-30,34.3-30,34.3-30"/>
|
||||
<path id="Path_1696-4" d="M46.1-29.8v7.2c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-3.3h-4.6v3.3
|
||||
c0,0.1-0.1,0.2-0.2,0.2h-0.7c-0.1,0-0.2-0.1-0.2-0.2v-7.2c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v3h4.6v-3
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7C46-29.9,46.1-29.9,46.1-29.8"/>
|
||||
<path id="Path_1697-4" d="M58-26.2c0,2.1-1.7,3.8-3.8,3.8c-2.1,0-3.8-1.7-3.8-3.8c0-2.1,1.7-3.8,3.8-3.8c2.1,0,3.8,1.6,3.8,3.7
|
||||
C58-26.3,58-26.2,58-26.2 M56.9-26.2c0.1-1.5-1-2.8-2.5-3s-2.8,1-3,2.5c0,0.2,0,0.3,0,0.5c-0.1,1.5,1,2.8,2.5,3
|
||||
c1.5,0.1,2.8-1,3-2.5C56.9-25.9,56.9-26,56.9-26.2"/>
|
||||
<path id="Path_1698-4" d="M67.6-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2h0.7c0.1,0,0.2,0.1,0.2,0.2v6.4h4.1C67.5-23.3,67.6-23.3,67.6-23.2C67.6-23.2,67.6-23.2,67.6-23.2"/>
|
||||
<path id="Path_1699-4" d="M77.3-23.2v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-5.4c-0.1,0-0.2-0.1-0.2-0.2v-7.2
|
||||
c0-0.1,0.1-0.2,0.2-0.2H77c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.5c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-4.4v2.3h3.9
|
||||
c0.1,0,0.1,0.1,0.2,0.1c0,0,0,0,0,0v0.6c0,0.1-0.1,0.1-0.1,0.2c0,0,0,0,0,0h-3.9v2.6h4.5C77.2-23.3,77.3-23.3,77.3-23.2
|
||||
C77.3-23.2,77.3-23.2,77.3-23.2"/>
|
||||
<path id="Path_1700-4" d="M-25.5-16.5c-5.4,0-9.8-4.4-9.8-9.8s4.4-9.8,9.8-9.8s9.8,4.4,9.8,9.8l0,0
|
||||
C-15.7-20.9-20.1-16.5-25.5-16.5 M-25.5-35.7c-5.2,0-9.4,4.2-9.4,9.4s4.2,9.4,9.4,9.4c5.2,0,9.4-4.2,9.4-9.4
|
||||
C-16.2-31.5-20.4-35.7-25.5-35.7"/>
|
||||
<path id="Path_1701-4" d="M-24.7-17.4c-4.9,0-8.8-3.9-8.8-8.8s3.9-8.8,8.8-8.8s8.8,3.9,8.8,8.8l0,0
|
||||
C-15.9-21.4-19.9-17.4-24.7-17.4 M-24.7-34.7c-4.7,0-8.4,3.8-8.4,8.4s3.8,8.4,8.4,8.4s8.4-3.8,8.4-8.4
|
||||
C-16.3-30.9-20.1-34.7-24.7-34.7"/>
|
||||
<path id="Path_1702-4" d="M-23.9-18.4c-4.3,0-7.8-3.5-7.8-7.8s3.5-7.8,7.8-7.8s7.8,3.5,7.8,7.8l0,0
|
||||
C-16.1-21.9-19.6-18.4-23.9-18.4 M-23.9-33.7c-4.1,0-7.5,3.4-7.5,7.5s3.4,7.5,7.5,7.5c4.1,0,7.5-3.4,7.5-7.5
|
||||
C-16.4-30.3-19.8-33.7-23.9-33.7"/>
|
||||
<path id="Path_1703-4" d="M-23.1-19.3c-3.8,0-6.8-3.1-6.8-6.8s3.1-6.8,6.8-6.8c3.8,0,6.8,3.1,6.8,6.8v0
|
||||
C-16.3-22.4-19.4-19.3-23.1-19.3 M-23.1-32.7c-3.6,0-6.6,2.9-6.6,6.6c0,3.6,2.9,6.6,6.6,6.6c3.6,0,6.6-2.9,6.6-6.6c0,0,0,0,0,0
|
||||
C-16.6-29.8-19.5-32.7-23.1-32.7"/>
|
||||
<path id="Path_1704-4" d="M-22.3-20.3c-3.2,0-5.8-2.6-5.8-5.8c0-3.2,2.6-5.8,5.8-5.8c3.2,0,5.8,2.6,5.8,5.8l0,0
|
||||
C-16.5-22.9-19.1-20.3-22.3-20.3 M-22.3-31.8c-3.1,0-5.6,2.5-5.6,5.6s2.5,5.6,5.6,5.6c3.1,0,5.6-2.5,5.6-5.6l0,0
|
||||
C-16.7-29.2-19.2-31.8-22.3-31.8"/>
|
||||
<path id="Path_1705-4" d="M-21.5-21.3c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8v0
|
||||
C-16.7-23.4-18.9-21.3-21.5-21.3 M-21.5-30.8c-2.6,0-4.7,2.1-4.7,4.7s2.1,4.7,4.7,4.7c2.6,0,4.7-2.1,4.7-4.7c0,0,0,0,0,0
|
||||
C-16.8-28.7-18.9-30.8-21.5-30.8"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 17 KiB |
|
@ -1,12 +0,0 @@
|
|||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M20.3025 0L9.67897 6.12683L13.5847 8.39024L20.3025 4.52683L27.0204 8.39024L30.9261 6.12683L20.3025 0Z" fill="#F0B90B"/>
|
||||
<path d="M27.0204 11.5902L30.9261 13.8537V18.3805L24.2083 22.2439V29.9707L20.3025 32.2341L16.3968 29.9707V22.2439L9.67897 18.3805V13.8537L13.5847 11.5902L20.3025 15.4537L27.0204 11.5902Z" fill="#F0B90B"/>
|
||||
<path d="M30.9261 21.5805V26.1073L27.0204 28.3707V23.8439L30.9261 21.5805Z" fill="#F0B90B"/>
|
||||
<path d="M26.9814 31.5707L33.6992 27.7073V19.9805L37.605 17.7171V29.9707L26.9814 36.0976V31.5707Z" fill="#F0B90B"/>
|
||||
<path d="M33.6992 12.2537L29.7935 9.99025L33.6992 7.72683L37.605 9.99025V14.5171L33.6992 16.7805V12.2537Z" fill="#F0B90B"/>
|
||||
<path d="M16.3968 37.7366V33.2098L20.3025 35.4732L24.2083 33.2098V37.7366L20.3025 40L16.3968 37.7366Z" fill="#F0B90B"/>
|
||||
<path d="M13.5847 28.3707L9.67897 26.1073V21.5805L13.5847 23.8439V28.3707Z" fill="#F0B90B"/>
|
||||
<path d="M20.3025 12.2537L16.3968 9.99025L20.3025 7.72683L24.2083 9.99025L20.3025 12.2537Z" fill="#F0B90B"/>
|
||||
<path d="M10.8116 9.99025L6.90586 12.2537V16.7805L3.00012 14.5171V9.99025L6.90586 7.72683L10.8116 9.99025Z" fill="#F0B90B"/>
|
||||
<path d="M3.00012 17.7171L6.90586 19.9805V27.7073L13.6237 31.5707V36.0976L3.00012 29.9707V17.7171Z" fill="#F0B90B"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.1 MiB |
|
@ -1,38 +0,0 @@
|
|||
<svg id="Component_15_7" data-name="Component 15 – 7" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="29.147" height="35.297" viewBox="0 0 29.147 35.297">
|
||||
<defs>
|
||||
<linearGradient id="linear-gradient" x1="0.5" x2="1" y2="0.59" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#374b92"/>
|
||||
<stop offset="1" stop-color="#e72850"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip-path">
|
||||
<rect id="Rectangle_1497" data-name="Rectangle 1497" width="29.147" height="35.297" fill="url(#linear-gradient)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Group_2819" data-name="Group 2819" clip-path="url(#clip-path)">
|
||||
<path id="Path_1873" data-name="Path 1873" d="M318.532,92.137l-.555,17.346-.555-17.346a.58.58,0,0,1,.536-.615.573.573,0,0,1,.574.575c0,.013,0,.028,0,.041" transform="translate(-289.385 -82.859)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1874" data-name="Path 1874" d="M305.306,84.516l-.555,18.791L304.2,84.516a.579.579,0,0,1,.538-.614.573.573,0,0,1,.573.576c0,.012,0,.026,0,.038" transform="translate(-277.328 -75.96)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1875" data-name="Path 1875" d="M292.081,76.893l-.555,20.237-.555-20.237a.557.557,0,1,1,1.11-.035c0,.011,0,.024,0,.035" transform="translate(-265.27 -69.06)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1876" data-name="Path 1876" d="M278.855,69.269,278.3,90.952l-.555-21.682a.557.557,0,1,1,1.11-.033c0,.01,0,.023,0,.033" transform="translate(-253.213 -62.159)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1877" data-name="Path 1877" d="M265.629,61.642l-.555,23.128-.555-23.128a.557.557,0,1,1,1.11-.031c0,.01,0,.021,0,.031" transform="translate(-241.155 -55.255)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1878" data-name="Path 1878" d="M252.4,54.016l-.555,24.573-.555-24.573a.557.557,0,1,1,1.11-.029c0,.009,0,.02,0,.029" transform="translate(-229.098 -48.351)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1879" data-name="Path 1879" d="M239.178,46.387l-.555,26.019-.555-26.019a.557.557,0,1,1,1.11-.027c0,.009,0,.019,0,.027" transform="translate(-217.04 -41.445)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1880" data-name="Path 1880" d="M225.952,38.759,225.4,66.224l-.555-27.464a.557.557,0,1,1,1.11-.026c0,.008,0,.018,0,.026" transform="translate(-204.982 -34.54)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1881" data-name="Path 1881" d="M212.727,31.13l-.555,28.91-.555-28.91a.557.557,0,1,1,1.11-.025c0,.007,0,.017,0,.025" transform="translate(-192.926 -27.634)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1882" data-name="Path 1882" d="M199.5,23.5l-.555,30.355L198.391,23.5a.557.557,0,1,1,1.11-.023c0,.007,0,.016,0,.023" transform="translate(-180.868 -20.726)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1883" data-name="Path 1883" d="M186.275,15.869l-.555,31.8-.555-31.8a.557.557,0,1,1,1.11-.022c0,.007,0,.016,0,.022" transform="translate(-168.81 -13.818)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1884" data-name="Path 1884" d="M173.049,8.238l-.555,33.246-.555-33.246a.557.557,0,1,1,1.11-.021c0,.006,0,.015,0,.021" transform="translate(-156.752 -6.91)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1885" data-name="Path 1885" d="M159.824.605,159.268,35.3,158.713.605a.557.557,0,1,1,1.11-.02c0,.006,0,.014,0,.02" transform="translate(-144.695 0)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1886" data-name="Path 1886" d="M146.6,8.238l-.555,33.246-.555-33.246a.557.557,0,1,1,1.11-.021c0,.006,0,.015,0,.021" transform="translate(-132.637 -6.91)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1887" data-name="Path 1887" d="M133.371,15.869l-.555,31.8-.555-31.8a.557.557,0,1,1,1.11-.022c0,.007,0,.016,0,.022" transform="translate(-120.579 -13.818)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1888" data-name="Path 1888" d="M120.145,23.5l-.555,30.355L119.035,23.5a.557.557,0,1,1,1.11-.023c0,.007,0,.016,0,.023" transform="translate(-108.521 -20.726)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1889" data-name="Path 1889" d="M106.92,31.13l-.555,28.91-.555-28.91a.557.557,0,1,1,1.11-.025c0,.007,0,.017,0,.025" transform="translate(-96.464 -27.634)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1890" data-name="Path 1890" d="M93.694,38.759l-.555,27.464-.555-27.464a.557.557,0,1,1,1.11-.026c0,.008,0,.018,0,.026" transform="translate(-84.406 -34.54)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1891" data-name="Path 1891" d="M80.468,46.387l-.555,26.019-.555-26.019a.557.557,0,1,1,1.11-.027c0,.008,0,.019,0,.027" transform="translate(-72.348 -41.445)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1892" data-name="Path 1892" d="M67.242,54.016l-.555,24.573-.555-24.573a.557.557,0,1,1,1.11-.029c0,.009,0,.02,0,.029" transform="translate(-60.29 -48.351)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1893" data-name="Path 1893" d="M54.015,61.642,53.46,84.77l-.555-23.128a.557.557,0,1,1,1.11-.031c0,.01,0,.021,0,.031" transform="translate(-48.232 -55.255)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1894" data-name="Path 1894" d="M40.789,69.269l-.555,21.682-.555-21.682a.557.557,0,1,1,1.11-.033c0,.01,0,.023,0,.033" transform="translate(-36.174 -62.159)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1895" data-name="Path 1895" d="M27.563,76.893,27.008,97.13l-.555-20.237a.557.557,0,1,1,1.11-.035c0,.011,0,.024,0,.035" transform="translate(-24.116 -69.06)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1896" data-name="Path 1896" d="M14.336,84.516l-.555,18.791-.555-18.791a.579.579,0,0,1,.538-.614.573.573,0,0,1,.573.576c0,.012,0,.026,0,.038" transform="translate(-12.058 -75.96)" fill="url(#linear-gradient)"/>
|
||||
<path id="Path_1897" data-name="Path 1897" d="M1.11,92.137.555,109.483,0,92.137a.58.58,0,0,1,.536-.615.573.573,0,0,1,.574.575c0,.013,0,.028,0,.041" transform="translate(0.001 -82.859)" fill="url(#linear-gradient)"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 645 KiB |
|
@ -1,13 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 1920 1920" enable-background="new 0 0 1920 1920" xml:space="preserve">
|
||||
<g>
|
||||
<polygon fill="#8A92B2" points="959.8,80.7 420.1,976.3 959.8,731 "/>
|
||||
<polygon fill="#62688F" points="959.8,731 420.1,976.3 959.8,1295.4 "/>
|
||||
<polygon fill="#62688F" points="1499.6,976.3 959.8,80.7 959.8,731 "/>
|
||||
<polygon fill="#454A75" points="959.8,1295.4 1499.6,976.3 959.8,731 "/>
|
||||
<polygon fill="#8A92B2" points="420.1,1078.7 959.8,1839.3 959.8,1397.6 "/>
|
||||
<polygon fill="#62688F" points="959.8,1397.6 959.8,1839.3 1499.9,1078.7 "/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 807 B |
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}.cls-2{fill:#13b5ec;}.cls-3{mask:url(#mask);}</style><mask id="mask" x="10" y="6" width="93.1" height="20" maskUnits="userSpaceOnUse"><g id="a"><path class="cls-1" d="M10,6h93.1V26H10Z"/></g></mask></defs><title>fa</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><circle class="cls-2" cx="16" cy="16" r="16"/><g class="cls-3"><path class="cls-1" d="M17.2,12.9l3.6-2.1V15Zm3.6,9L16,24.7l-4.8-2.8V17L16,19.8,20.8,17ZM11.2,10.8l3.6,2.1L11.2,15Zm5.4,3.1L20.2,16l-3.6,2.1Zm-1.2,4.2L11.8,16l3.6-2.1Zm4.8-8.3L16,12.2,11.8,9.8,16,7.3ZM10,9.4V22.5l6,3.4,6-3.4V9.4L16,6Z"/></g></g></g></svg>
|
Before Width: | Height: | Size: 766 B |
|
@ -1,9 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1867.323" height="1841.268" viewBox="0 0 1867.323 1841.268">
|
||||
<defs>
|
||||
<radialGradient id="radial-gradient" cx="0.5" cy="0.5" r="0.5" gradientUnits="objectBoundingBox">
|
||||
<stop offset="0" stop-color="#5189c8"/>
|
||||
<stop offset="1" stop-color="#5189c8" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<ellipse id="Ellipse_98" data-name="Ellipse 98" cx="568.484" cy="744.5" rx="568.484" ry="744.5" transform="translate(1106.543) rotate(48)" opacity="0.697" fill="url(#radial-gradient)"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 598 B |
Before Width: | Height: | Size: 2.2 MiB |
|
@ -1,17 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="25" height="25" viewBox="0 0 25 25">
|
||||
<defs>
|
||||
<clipPath id="clip-path">
|
||||
<rect id="Rectangle_1344" data-name="Rectangle 1344" width="25" height="25" fill="#fff"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Group_2626" data-name="Group 2626" transform="translate(0 0)">
|
||||
<g id="Group_2625" data-name="Group 2625" transform="translate(0 0)" clip-path="url(#clip-path)">
|
||||
<path id="Path_1586" data-name="Path 1586" d="M12.5,25A12.5,12.5,0,1,1,25,12.5,12.514,12.514,0,0,1,12.5,25M12.5.555A11.945,11.945,0,1,0,24.446,12.5,11.959,11.959,0,0,0,12.5.555" transform="translate(0 0)" fill="#fff"/>
|
||||
<path id="Path_1587" data-name="Path 1587" d="M14.124,25.385A11.231,11.231,0,1,1,25.356,14.153,11.244,11.244,0,0,1,14.124,25.385m0-21.982A10.751,10.751,0,1,0,24.875,14.153,10.763,10.763,0,0,0,14.124,3.4" transform="translate(-1.591 -1.607)" fill="#fff"/>
|
||||
<path id="Path_1588" data-name="Path 1588" d="M15.748,25.769a9.963,9.963,0,1,1,9.963-9.963,9.974,9.974,0,0,1-9.963,9.963m0-19.519A9.556,9.556,0,1,0,25.3,15.806,9.567,9.567,0,0,0,15.748,6.25" transform="translate(-3.182 -3.214)" fill="#fff"/>
|
||||
<path id="Path_1589" data-name="Path 1589" d="M17.373,26.153a8.694,8.694,0,1,1,8.694-8.694,8.7,8.7,0,0,1-8.694,8.694m0-17.055a8.361,8.361,0,1,0,8.361,8.362A8.371,8.371,0,0,0,17.373,9.1" transform="translate(-4.773 -4.82)" fill="#fff"/>
|
||||
<path id="Path_1590" data-name="Path 1590" d="M19,26.538a7.425,7.425,0,1,1,7.425-7.425A7.434,7.434,0,0,1,19,26.538m0-14.592a7.166,7.166,0,1,0,7.166,7.166A7.174,7.174,0,0,0,19,11.946" transform="translate(-6.364 -6.427)" fill="#fff"/>
|
||||
<path id="Path_1591" data-name="Path 1591" d="M20.621,26.921a6.157,6.157,0,1,1,6.156-6.157,6.164,6.164,0,0,1-6.156,6.157m0-12.128a5.972,5.972,0,1,0,5.972,5.971,5.978,5.978,0,0,0-5.972-5.971" transform="translate(-7.955 -8.034)" fill="#fff"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 128 KiB |
Before Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 271 KiB |
Before Width: | Height: | Size: 500 KiB |
Before Width: | Height: | Size: 268 KiB |
Before Width: | Height: | Size: 391 KiB |