From f35a993f7721877c5e2a767890e93f57c93960b5 Mon Sep 17 00:00:00 2001 From: Jon Michael Aanes Date: Sat, 8 Jun 2024 16:40:07 +0200 Subject: [PATCH] Basic contract state fetching implemented. Need to extend --- src/main/shared/LedgerIntegration.ts | 4 +- src/main/shared/MetaMaskIntegration.ts | 4 +- src/main/shared/MpcWalletIntegration.ts | 4 +- src/main/shared/PrivateKeyIntegration.ts | 4 +- src/main/swap/Main.ts | 59 ++++++++++++++++------ src/main/token/AppState.ts | 4 +- src/main/token/contract/TokenV2Contract.ts | 4 +- 7 files changed, 56 insertions(+), 27 deletions(-) diff --git a/src/main/shared/LedgerIntegration.ts b/src/main/shared/LedgerIntegration.ts index 1074d6e..83c70d5 100644 --- a/src/main/shared/LedgerIntegration.ts +++ b/src/main/shared/LedgerIntegration.ts @@ -25,7 +25,7 @@ import { listen } from "@ledgerhq/logs"; import { CryptoUtils } from "../client/CryptoUtils"; import { Rpc, TransactionPayload } from "../client/TransactionData"; import { serializeTransaction } from "../client/TransactionSerialization"; -import { NETWORK_ID } from "../constant"; +import { NETWORK } from "../constant"; import TransportWebUSB from "@ledgerhq/hw-transport-webusb"; //import TransportWebHID from "@ledgerhq/hw-transport-webhid"; @@ -73,7 +73,7 @@ async function signAndSendTransaction( ); // Use ledger device to sign transaction - const signature = await ledgerClient.signTransaction(DEFAULT_KEYPATH, serializedTx, NETWORK_ID); + const signature = await ledgerClient.signTransaction(DEFAULT_KEYPATH, serializedTx, NETWORK.network_id); const signatureBuffer = CryptoUtils.signatureToBuffer(signature); diff --git a/src/main/shared/MetaMaskIntegration.ts b/src/main/shared/MetaMaskIntegration.ts index 331b496..f32dca3 100644 --- a/src/main/shared/MetaMaskIntegration.ts +++ b/src/main/shared/MetaMaskIntegration.ts @@ -20,7 +20,7 @@ import { ConnectedWallet } from "./ConnectedWallet"; import { serializeTransaction } from "../client/TransactionSerialization"; import { TransactionApi } from "../client/TransactionApi"; import { ShardedClient } from "../client/ShardedClient"; -import { NETWORK_ID } from "../constant"; +import { NETWORK } from "../constant"; interface MetamaskRequestArguments { /** The RPC method to request. */ @@ -88,7 +88,7 @@ export const connectMetaMask = async (): Promise => { method: "sign_transaction", params: { payload: serializedTx.toString("hex"), - chainId: NETWORK_ID, + chainId: NETWORK.network_id, }, }, }, diff --git a/src/main/shared/MpcWalletIntegration.ts b/src/main/shared/MpcWalletIntegration.ts index 9715a52..104fcd3 100644 --- a/src/main/shared/MpcWalletIntegration.ts +++ b/src/main/shared/MpcWalletIntegration.ts @@ -21,7 +21,7 @@ import { serializeTransaction } from "../client/TransactionSerialization"; import { TransactionApi } from "../client/TransactionApi"; import { ShardedClient } from "../client/ShardedClient"; import PartisiaSdk from "partisia-blockchain-applications-sdk"; -import { NETWORK_ID } from "../constant"; +import { NETWORK } from "../constant"; /** * Initializes a new ConnectedWallet by connecting to Partisia Blockchain @@ -37,7 +37,7 @@ export const connectMpcWallet = async (): Promise => { // eslint-disable-next-line permissions: ["sign" as any], dappName: "Wallet integration demo", - chainId: NETWORK_ID, + chainId: NETWORK.network_id, }) .then(() => { const connection = partisiaSdk.connection; diff --git a/src/main/shared/PrivateKeyIntegration.ts b/src/main/shared/PrivateKeyIntegration.ts index 0c19c7a..544b19a 100644 --- a/src/main/shared/PrivateKeyIntegration.ts +++ b/src/main/shared/PrivateKeyIntegration.ts @@ -24,7 +24,7 @@ import { Rpc, TransactionPayload } from "../client/TransactionData"; import { BigEndianByteOutput } from "@secata-public/bitmanipulation-ts"; import { CryptoUtils } from "../client/CryptoUtils"; import { ec } from "elliptic"; -import { NETWORK_ID } from "../constant"; +import { NETWORK } from "../constant"; /** * Initializes a ConnectedWallet by inputting the private key directly. @@ -54,7 +54,7 @@ export const connectPrivateKey = async ( ); const hash = CryptoUtils.hashBuffers([ serializedTx, - BigEndianByteOutput.serialize((out) => out.writeString(NETWORK_ID)), + BigEndianByteOutput.serialize((out) => out.writeString(NETWORK.network_id)), ]); const signature = keyPair.sign(hash); const signatureBuffer = CryptoUtils.signatureToBuffer(signature); diff --git a/src/main/swap/Main.ts b/src/main/swap/Main.ts index 75b1fb5..adc1e11 100644 --- a/src/main/swap/Main.ts +++ b/src/main/swap/Main.ts @@ -3,37 +3,66 @@ */ import BN from "bn.js"; -import { BlockchainAddress } from "@partisiablockchain/abi-client"; +import { BlockchainAddress, StateBytes } from "@partisiablockchain/abi-client"; import { TransactionFailedError } from "../client/TransactionApi"; import { PutTransactionWasSuccessful } from "../client/TransactionData"; +import { ShardedClient } from "../client/ShardedClient"; +import { RouterState, deserializeRouterState } from "../abi/SwapRouter"; +import { LiquiditySwapContractState, deserializeLiquiditySwapContractState } from "../abi/LiquiditySwapContract"; +import { TokenState, deserializeTokenState } from "../abi/TokenV1"; +import { NETWORK } from "../constant"; -import { transfer, TokenState, deserializeTokenState } from "../abi/SwapRouter"; +interface ContractState { + latest_state: TokenState | LiquiditySwapContractState | null; +} const ROUTERS: BlockchainAddress[] = [BlockchainAddress.fromString("02f8eb18e09dfe6797880c952527747202560338bf")]; -const TOKENS: BlockchainAddress[] = []; +type BlockchainAddressKey = string; -const SWAPS: BlockchainAddress[] = []; +const TOKENS: Record = {}; -function get_router_state(contractAddress: BlockchainAddress): Promise { -return this.shardedClient - .getContractData(contractAddress.asString()) - .then((contract) => { - if (contract == null) { - throw new Error("Could not find data for contract"); - } +const SWAPS: Record = {}; - // Reads the state of the contract - const stateBuffer = Buffer.from(contract.serializedContract.state.data, "base64"); +const SHARDED_CLIENT: ShardedClient = new ShardedClient(NETWORK.node_base_url, NETWORK.network_shards); - return deserializeTokenState({ state: stateBuffer }); - }); +interface RawContractData { + state: { data: string }; +} + +function get_contract_state(contractAddress: BlockchainAddress, deserialize: (state_bytes: StateBytes) => T): Promise { + return SHARDED_CLIENT + .getContractData(contractAddress.asString()) + .then((contract) => { + if (contract == null) { + throw new Error("Could not find data for contract"); + } + + // Reads the state of the contract + const stateBuffer = Buffer.from(contract.serializedContract.state.data, "base64"); + + return deserialize({ state: stateBuffer }); + }); } function setup() { for (let router of ROUTERS) { console.log(router); + get_contract_state(router, deserializeRouterState).then((state) => { + console.log(state); + + for (let swapInfo of state.swapContracts) { + SWAPS[swapInfo.swapAddress.asString()] = { latest_state: null }; + TOKENS[swapInfo.tokenAAddress.asString()] = { latest_state: null }; + TOKENS[swapInfo.tokenBAddress.asString()] = { latest_state: null }; + + // TODO: Deduplicate tokens + get_contract_state(swapInfo.swapAddress, deserializeLiquiditySwapContractState).then(console.log); + get_contract_state(swapInfo.tokenAAddress, deserializeTokenState).then(console.log); + get_contract_state(swapInfo.tokenBAddress, deserializeTokenState).then(console.log); + } + }); } } diff --git a/src/main/token/AppState.ts b/src/main/token/AppState.ts index 1698d51..5fc2f90 100644 --- a/src/main/token/AppState.ts +++ b/src/main/token/AppState.ts @@ -22,9 +22,9 @@ import { ShardedClient } from "../client/ShardedClient"; import { TokenContract } from "../shared/TokenContract"; import { TransactionApi } from "../client/TransactionApi"; import { updateContractState } from "./WalletIntegration"; -import { NODE_BASE_URL, NETWORK_SHARDS } from "../constant"; +import { NETWORK } from "../constant"; -export const CLIENT = new ShardedClient(NODE_BASE_URL, NETWORK_SHARDS); +export const CLIENT = new ShardedClient(NETWORK.node_base_url, NETWORK.network_shards); type TokenContractCreator = ( client: ShardedClient, diff --git a/src/main/token/contract/TokenV2Contract.ts b/src/main/token/contract/TokenV2Contract.ts index 4ee12b7..bee6f0e 100644 --- a/src/main/token/contract/TokenV2Contract.ts +++ b/src/main/token/contract/TokenV2Contract.ts @@ -30,9 +30,9 @@ import { } from "../../shared/TokenContract"; import { ShardedClient } from "../../client/ShardedClient"; import { PutTransactionWasSuccessful } from "../../client/TransactionData"; -import { NODE_BASE_URL, NETWORK_SHARDS } from "../../constant"; +import { NETWORK } from "../../constant"; -const AVL_CLIENT = new AvlClient(NODE_BASE_URL, NETWORK_SHARDS); +const AVL_CLIENT = new AvlClient(NETWORK .node_base_url, NETWORK.network_shards); /** * Structure of the raw data from a WASM contract.