From 4ceb0cee2018c4ba8f01b1feb447e369be6e6656 Mon Sep 17 00:00:00 2001 From: Hammad-Mubeen Date: Mon, 6 Dec 2021 22:01:15 +0500 Subject: [PATCH] code reverted backed to previous commit(listener and mutation for that removed from backend), router Js client code added adjusted according to backend setup requirement, listener added of erc20, pair and factory events, figured out all events according all router functions and code added (everything is without testing) --- .env | 137 ++- JsClients/ERC20/test/installed.ts | 46 +- JsClients/ERC20/wasm/erc20-token.wasm | Bin 380200 -> 387573 bytes JsClients/ERC20/wasm/erc20-tokenevents.wasm | Bin 0 -> 380200 bytes JsClients/Events/src/event.ts | 193 ---- JsClients/Events/src/types.d.ts | 6 - JsClients/Events/src/utils.ts | 54 - JsClients/Events/test/installed.ts | 313 ------ JsClients/ROUTER/dist/constants.js | 24 + JsClients/ROUTER/dist/constants.js.map | 1 + JsClients/ROUTER/dist/index.js | 32 + JsClients/ROUTER/dist/index.js.map | 1 + .../ROUTER/dist/uniswap-router-client.js | 959 +++++++++++++++++ .../ROUTER/dist/uniswap-router-client.js.map | 1 + JsClients/ROUTER/dist/utils.js | 177 ++++ JsClients/ROUTER/dist/utils.js.map | 1 + JsClients/ROUTER/keys/public_key.pem | 3 + JsClients/ROUTER/keys/public_key_hex | 1 + JsClients/ROUTER/keys/secret_key.pem | 3 + JsClients/{Events => ROUTER}/src/constants.ts | 4 +- JsClients/{Events => ROUTER}/src/index.ts | 4 +- JsClients/ROUTER/src/types.d.ts | 9 + JsClients/ROUTER/src/uniswap-router-client.ts | 988 ++++++++++++++++++ JsClients/ROUTER/src/utils.ts | 125 +++ JsClients/ROUTER/test/install.ts | 94 ++ JsClients/ROUTER/test/installed.ts | 789 ++++++++++++++ JsClients/{Events => ROUTER}/test/utils.ts | 5 +- graphql/mutations.js | 35 - graphql/schema.js | 2 - 29 files changed, 3371 insertions(+), 636 deletions(-) create mode 100644 JsClients/ERC20/wasm/erc20-tokenevents.wasm delete mode 100644 JsClients/Events/src/event.ts delete mode 100644 JsClients/Events/src/types.d.ts delete mode 100644 JsClients/Events/src/utils.ts delete mode 100644 JsClients/Events/test/installed.ts create mode 100644 JsClients/ROUTER/dist/constants.js create mode 100644 JsClients/ROUTER/dist/constants.js.map create mode 100644 JsClients/ROUTER/dist/index.js create mode 100644 JsClients/ROUTER/dist/index.js.map create mode 100644 JsClients/ROUTER/dist/uniswap-router-client.js create mode 100644 JsClients/ROUTER/dist/uniswap-router-client.js.map create mode 100644 JsClients/ROUTER/dist/utils.js create mode 100644 JsClients/ROUTER/dist/utils.js.map create mode 100644 JsClients/ROUTER/keys/public_key.pem create mode 100644 JsClients/ROUTER/keys/public_key_hex create mode 100644 JsClients/ROUTER/keys/secret_key.pem rename JsClients/{Events => ROUTER}/src/constants.ts (84%) rename JsClients/{Events => ROUTER}/src/index.ts (57%) create mode 100644 JsClients/ROUTER/src/types.d.ts create mode 100644 JsClients/ROUTER/src/uniswap-router-client.ts create mode 100644 JsClients/ROUTER/src/utils.ts create mode 100644 JsClients/ROUTER/test/install.ts create mode 100644 JsClients/ROUTER/test/installed.ts rename JsClients/{Events => ROUTER}/test/utils.ts (87%) diff --git a/.env b/.env index 62a896cc..2ca2190d 100644 --- a/.env +++ b/.env @@ -8,7 +8,6 @@ PAIR_CONTRACT_PACKAGE=106dbf09aac7eb0ed2d41f4026fe2d8cd5f492b17c5050db9c519591c6 CALLEE_CONTRACT=fbfeda8b97f056f526f20c2fc2b486d9bdbfb3e46b9a164527e57c0c86e68612 TOKEN0_CONTRACT=f5b45ffd5273c94befa572ca4b3f05a57892611aa7c668a021eed2be93e9b76e TOKEN1_CONTRACT=c5afe9ac0deddaf3090603b1cc1b71b9c030218ff97f7c4067a48402803fea16 -EXTERNAL_CONTRACT=0A01Dd10Ef3562112818F91af977f10EA12BB4417AdFd9aF0ff4f3824862E3CC GRAPHQL=http://localhost:3000/graphql CHAIN_NAME=casper-test @@ -19,11 +18,12 @@ RECEIVER_ACCOUNT_ONE=017e82abcc9539a01cfd9d63ae8c9c8b3a752a6f75ba1ab148714eea03e ERC20_WASM_PATH=JsClients/ERC20/wasm/erc20-token.wasm FACTORY_WASM_PATH=JsClients/FACTORY/wasm/factory.wasm PAIR_WASM_PATH=JsClients/PAIR/wasm/pair-token.wasm +WASM_PATH=JsClients/ROUTER/wasm/uniswap-v2-router.wasm ERC20_MASTER_KEY_PAIR_PATH=JsClients/ERC20/keys/ FACTORY_MASTER_KEY_PAIR_PATH=JsClients/FACTORY/keys/ PAIR_MASTER_KEY_PAIR_PATH=JsClients/PAIR/keys/ - +MASTER_KEY_PAIR_PATH=JsClients/ROUTER/keys/ ERC20_CONTRACT_NAME=erc20 ERC20_TOKEN_NAME=token0 @@ -71,3 +71,136 @@ SET_TREASURY_FEE_PERCENT_PAYMENT_AMOUNT=5000000000 SET_FEE_TO_PAYMENT_AMOUNT=5000000000 SET_FEE_TO_SETTER_PAYMENT_AMOUNT=5000000000 CREATE_PAIR_PAYMENT_AMOUNT=5000000000 + + + +TOKEN_NAME=uniswap-router +TOKEN_SYMBOL=DRAG +TOKEN_META=origin fire,lifetime infinite + +FACTORY=c2b7c5cd223a6bdf18ac363ff0d808c92cf3eb95ca3f54264d7285a0aa1a74fe +WCSPR=f08f486ae224a551e0a383e195fa9504d0a70686a11c462f0a8599a75a45bc04 +LIBRARY=301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +CONTRACT_NAME=UniswapRouter + +CONTRACT_HASH=8ce941b03b71dfbf65261e662fd5b47c78e9156ed4b048acdd33ef1934b26e79 +INSTALL_PAYMENT_AMOUNT=200000000000 +MINT_ONE_PAYMENT_AMOUNT=2000000000 +MINT_COPIES_PAYMENT_AMOUNT=100000000000 +BURN_ONE_PAYMENT_AMOUNT=12000000000 +MINT_ONE_META_SIZE=1 +MINT_COPIES_META_SIZE=10 +MINT_COPIES_COUNT=20 +MINT_MANY_META_SIZE=5 +MINT_MANY_META_COUNT=5 + +TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +DEADLINE = 1642699999000 + +# add_liquidity + +TOKEN_A = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +TOKEN_B = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +AMOUNT_A_DESIRED = 500 +AMOUNT_B_DESIRED = 600 +AMOUNT_A_MIN = 250 +AMOUNT_B_MIN = 300 + + +# add_liquidity_cspr +TOKEN = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +AMOUNT_TOKEN_DESIRED = 500 +AMOUNT_CSPR_DESIRED = 600 +AMOUNT_TOKEN_MIN = 250 +AMOUNT_CSPR_MIN = 300 + + + +# remove_liquidiy +RL_TOKEN_A = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RL_TOKEN_B = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RL_LIQUIDITY = 500 +RL_AMOUNT_A_MIN = 550 +RL_AMOUNT_B_MIN = 550 +RL_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb + + +# remove_liquidiy_cspr +RLC_TOKEN = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RLC_LIQUIDITY = 500 +RLC_AMOUNT_TOKEN_MIN = 250 +RLC_AMOUNT_CSPR_MIN = 300 +RLC_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb + + +# remove_liquidity_with_permit + +RLWP_TOKEN_A = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RLWP_TOKEN_B = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RLWP_LIQUIDITY = 500 +RLWP_AMOUNT_A_MIN = 250 +RLWP_AMOUNT_B_MIN = 250 +RLWP_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RLWP_APPROVE_MAX = false +RLWP_V = 10 +RLWP_R = 100 +RLWP_S = 100 + + + +# remove_liquidity_cspr_with_permit + +RLCWP_TOKEN = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RLCWP_LIQUIDITY = 500 +RLCWP_AMOUNT_TOKEN_MIN = 250 +RLCWP_AMOUNT_CSPR_MIN = 250 +RLCWP_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +RLCWP_APPROVE_MAX = false +RLCWP_V = 10 +RLCWP_R = 100 +RLCWP_S = 100 + + +# swap_exact_tokens_for_tokens + +SETFT_AMOUNT_IN = 500 +SETFT_AMOUNT_OUT_MIN = 600 + +# comma seperated list of paths +SETFT_PATH = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +SETFT_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb + + +# swap_tokens_for_exact_tokens +STFET_AMOUNT_OUT = 500 +STFET_AMOUNT_IN_MAX = 600 +STFET_PATH = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +STFET_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb + + +# swap_exact_cspr_for_tokens +SECFT_AMOUNT_OUT_MIN = 250 +SECFT_AMOUNT_IN = 400 +SECFT_PATH = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +SECFT_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb + + +# swap_tokens_for_exact_cspr +STFEC_AMOUNT_OUT = 250 +STFEC_AMOUNT_IN_MAX = 300 +STFEC_PATH = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +STFEC_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb + + +# swap_exact_tokens_for_cspr +SETFC_AMOUNT_IN = 250 +SETFC_AMOUNT_OUT_MIN = 350 +SETFC_PATH = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +SETFC_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb + + +# swap_cspr_for_exact_tokens +SCFET_AMOUNT_OUT = 250 +SCFET_AMOUNT_IN_MAX = 300 +SCFET_PATH = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb,301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb +SCFET_TO = 301167268ec00eeb7edf7d12d9419921e15dbd7b145e454d94540aa91c260edb \ No newline at end of file diff --git a/JsClients/ERC20/test/installed.ts b/JsClients/ERC20/test/installed.ts index 2e179ff9..86dfd4ea 100644 --- a/JsClients/ERC20/test/installed.ts +++ b/JsClients/ERC20/test/installed.ts @@ -9,6 +9,7 @@ import { CLPublicKey, CLAccountHash, CLPublicKeyType, + Contracts, } from "casper-js-sdk"; const { ERC20Events } = constants; @@ -31,7 +32,6 @@ const { TRANSFER_FROM_AMOUNT, TOKEN0_CONTRACT, TOKEN1_CONTRACT, - EXTERNAL_CONTRACT, PAIR_CONTRACT } = process.env; @@ -80,23 +80,23 @@ const test = async () => { ); console.log("listener: ",listener); - // await sleep(5 * 1000); + await sleep(5 * 1000); - // let accountInfo = await utils.getAccountInfo(NODE_ADDRESS!, KEYS.publicKey); + let accountInfo = await utils.getAccountInfo(NODE_ADDRESS!, KEYS.publicKey); - // console.log(`... Account Info: `); - // console.log(JSON.stringify(accountInfo, null, 2)); + console.log(`... Account Info: `); + console.log(JSON.stringify(accountInfo, null, 2)); - // const contractHash = await utils.getAccountNamedKeyValue( - // accountInfo, - // `${ERC20_CONTRACT_NAME!}_contract_hash` - // ); + const contractHash = await utils.getAccountNamedKeyValue( + accountInfo, + `${ERC20_CONTRACT_NAME!}_contract_hash` + ); - // console.log(`... Contract Hash: ${contractHash}`); + console.log(`... Contract Hash: ${contractHash}`); - // // // We don't need hash- prefix so i'm removing it - // // //await erc20.setContractHash(contractHash.slice(5)); - // await erc20.setContractHash(EXTERNAL_CONTRACT!); + // // We don't need hash- prefix so i'm removing it + // //await erc20.setContractHash(contractHash.slice(5)); + await erc20.setContractHash(TOKEN0_CONTRACT!); // // //name // // const name = await erc20.name(); @@ -159,16 +159,16 @@ const test = async () => { // // console.log(`... Total supply: ${totalSupply}`); //approve - // const approveDeployHash = await erc20.approve( - // KEYS, - // KEYS.publicKey, - // APPROVE_AMOUNT!, - // APPROVE_PAYMENT_AMOUNT! - // ); - // console.log("... Approve deploy hash: ", approveDeployHash); - - // await getDeploy(NODE_ADDRESS!, approveDeployHash); - // console.log("... Token approved successfully"); + const approveDeployHash = await erc20.approve( + KEYS, + KEYS.publicKey, + APPROVE_AMOUNT!, + APPROVE_PAYMENT_AMOUNT! + ); + console.log("... Approve deploy hash: ", approveDeployHash); + + await getDeploy(NODE_ADDRESS!, approveDeployHash); + console.log("... Token approved successfully"); // // //transfer // // const transferDeployHash = await erc20.transfer( diff --git a/JsClients/ERC20/wasm/erc20-token.wasm b/JsClients/ERC20/wasm/erc20-token.wasm index 08105c65b6755ba763b6b9ef77150daa03f0a554..dc7d747b96f3cac1892793a7041873b863b63639 100755 GIT binary patch delta 87389 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 VN@_&m$iFPVK|^ndC40>={|7N0PVxW% delta 80741 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 diff --git a/JsClients/ERC20/wasm/erc20-tokenevents.wasm b/JsClients/ERC20/wasm/erc20-tokenevents.wasm new file mode 100644 index 0000000000000000000000000000000000000000..08105c65b6755ba763b6b9ef77150daa03f0a554 GIT binary patch literal 380200 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 { - if (LIST_OF_NAMED_KEYS.includes(val.name)) { - return { ...acc, [utils.camelCased(val.name)]: val.key }; - } - return acc; - }, {}); - } - - public onEvent( - eventNames: Events[], - callback: ( - eventName: Events, - deployStatus: { - deployHash: string; - success: boolean; - error: string | null; - }, - result: any | null - ) => void - ): any { - if (!this.eventStreamAddress) { - throw Error("Please set eventStreamAddress before!"); - } - if (this.isListening) { - throw Error( - "Only one event listener can be create at a time. Remove the previous one and start new." - ); - } - const es = new EventStream(this.eventStreamAddress); - this.isListening = true; - - es.subscribe(EventName.DeployProcessed, (value: any) => { - const deployHash = value.body.DeployProcessed.deploy_hash; - - const pendingDeploy = this.pendingDeploys.find( - (pending) => pending.deployHash === deployHash - ); - - if (!pendingDeploy) { - return; - } - - if ( - !value.body.DeployProcessed.execution_result.Success && - value.body.DeployProcessed.execution_result.Failure - ) { - callback( - pendingDeploy.deployType, - { - deployHash, - error: - value.body.DeployProcessed.execution_result.Failure.error_message, - success: false, - }, - null - ); - } else { - const { transforms } = - value.body.DeployProcessed.execution_result.Success.effect; - - const Events = transforms.reduce((acc: any, val: any) => { - if ( - val.transform.hasOwnProperty("WriteCLValue") && - typeof val.transform.WriteCLValue.parsed === "object" && - val.transform.WriteCLValue.parsed !== null - ) { - const maybeCLValue = CLValueParsers.fromJSON( - val.transform.WriteCLValue - ); - const clValue = maybeCLValue.unwrap(); - if (clValue && clValue instanceof CLMap) { - const hash = clValue.get( - CLValueBuilder.string("contract_package_hash") - ); - const event = clValue.get(CLValueBuilder.string("event_type")); - if ( - hash && - // NOTE: Calling toLowerCase() because current JS-SDK doesn't support checksumed hashes and returns all lower case value - // Remove it after updating SDK - hash.value() === this.contractPackageHash.toLowerCase() && - event && - eventNames.includes(event.value()) - ) { - acc = [...acc, { name: event.value(), clValue }]; - } - } - } - return acc; - }, []); - - Events.forEach((d: any) => - callback( - d.name, - { deployHash, error: null, success: true }, - d.clValue - ) - ); - } - - this.pendingDeploys = this.pendingDeploys.filter( - (pending) => pending.deployHash !== deployHash - ); - }); - es.start(); - - return { - stopListening: () => { - es.unsubscribe(EventName.DeployProcessed); - es.stop(); - this.isListening = false; - this.pendingDeploys = []; - }, - }; - } - - public addPendingDeploy(deployType: Events, deployHash: string) { - this.pendingDeploys = [...this.pendingDeploys, { deployHash, deployType }]; - } -} - -export default Client; diff --git a/JsClients/Events/src/types.d.ts b/JsClients/Events/src/types.d.ts deleted file mode 100644 index 906adb2c..00000000 --- a/JsClients/Events/src/types.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import {Events} from "./constants"; - -export interface IPendingDeploy { - deployHash: string; - deployType: Events; -} diff --git a/JsClients/Events/src/utils.ts b/JsClients/Events/src/utils.ts deleted file mode 100644 index b20ea73b..00000000 --- a/JsClients/Events/src/utils.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - CasperServiceByJsonRPC -} from "casper-js-sdk"; - - -export const camelCased = (myString: string) => - myString.replace(/_([a-z])/g, (g) => g[1].toUpperCase()); - -/** - * Returns global state root hash at current block. - * @param {Object} client - JS SDK client for interacting with a node. - * @return {String} Root hash of global state at most recent block. - */ -export const getStateRootHash = async (nodeAddress: string) => { - const client = new CasperServiceByJsonRPC(nodeAddress); - const { block } = await client.getLatestBlockInfo(); - if (block) { - return block.header.state_root_hash; - } else { - throw Error("Problem when calling getLatestBlockInfo"); - } -}; - -/** - * Returns a value under an on-chain account's storage. - * @param accountInfo - On-chain account's info. - * @param namedKey - A named key associated with an on-chain account. - */ -export const getAccountNamedKeyValue = (accountInfo: any, namedKey: string) => { - const found = accountInfo.namedKeys.find((i: any) => i.name === namedKey); - if (found) { - return found.key; - } - return undefined; -}; - -export const getContractData = async ( - nodeAddress: string, - stateRootHash: string, - contractHash: string, - path: string[] = [] -) => { - const client = new CasperServiceByJsonRPC(nodeAddress); - const blockState = await client.getBlockState( - stateRootHash, - `hash-${contractHash}`, - path - ); - return blockState; -}; - - - - diff --git a/JsClients/Events/test/installed.ts b/JsClients/Events/test/installed.ts deleted file mode 100644 index 310467cb..00000000 --- a/JsClients/Events/test/installed.ts +++ /dev/null @@ -1,313 +0,0 @@ -import { config } from "dotenv"; -config(); -import { Client ,constants} from "../src"; -import { getDeploy } from "./utils"; -import { request } from 'graphql-request'; - -const { Events } = constants; - -const { - NODE_ADDRESS, - EVENT_STREAM_ADDRESS, - CHAIN_NAME, - GRAPHQL -} = process.env; - -const erc20 = new Client( - NODE_ADDRESS!, - CHAIN_NAME!, - EVENT_STREAM_ADDRESS! -); - -function splitdata(data:string) -{ - var temp=data.split('('); - var result=temp[1].split(')'); - return result[0]; -} -const listener = async () => { - - const listener = erc20.onEvent( - [ - Events.Approval, - Events.Transfer - ], - async (eventName, deploy, result) => { - if (deploy.success) { - console.log(`Successfull deploy of: ${eventName}, deployHash: ${deploy.deployHash}`); - const [timestamp,block_hash]= await getDeploy(NODE_ADDRESS!, deploy.deployHash); - console.log("... Deployhash: ", deploy.deployHash); - console.log("... Timestamp: ", timestamp); - console.log("... Block hash: ", block_hash); - console.log("result.value(): ",result.value()); - let newData = JSON.parse(JSON.stringify(result.value())); - - if(eventName =="pair_created") - { - console.log(eventName+ " Event result: "); - console.log(newData[0][0].data + " = " + newData[0][1].data); - console.log(newData[1][0].data + " = " + newData[1][1].data); - console.log(newData[2][0].data + " = " + newData[2][1].data); - console.log(newData[3][0].data + " = " + newData[3][1].data); - console.log(newData[4][0].data + " = " + newData[4][1].data); - console.log(newData[5][0].data + " = " + newData[5][1].data); - - var allpairslength=parseInt(newData[0][1].data); - var pair=splitdata(newData[3][1].data); - var token0=splitdata(newData[4][1].data); - var token1=splitdata(newData[5][1].data); - - console.log("allpairslength: ", allpairslength); - console.log("pair splited: ", pair); - console.log("token0 splited: ", token0); - console.log("token1 splited: ", token1); - - request(GRAPHQL!, - `mutation handleNewPair( $token0: String!, $token1: String!, $pair: String!, $all_pairs_length: Int!, $timeStamp: String!, $blockHash: String!){ - handleNewPair( token0: $token0, token1: $token1, pair: $pair, all_pairs_length: $all_pairs_length, timeStamp: $timeStamp, blockHash: $blockHash) { - result - } - - }`, - {token0:token0, token1:token1, pair: pair, all_pairs_length: allpairslength, timeStamp:timestamp.toString(), blockHash:block_hash}) - .then(data => console.log(data)) - .catch(error => console.error(error)); - } - else if(eventName=="approve") - { - console.log(eventName+ " Event result: "); - console.log(newData[0][0].data + " = " + newData[0][1].data); - console.log(newData[1][0].data + " = " + newData[1][1].data); - console.log(newData[2][0].data + " = " + newData[2][1].data); - console.log(newData[3][0].data + " = " + newData[3][1].data); - console.log(newData[4][0].data + " = " + newData[4][1].data); - } - else if(eventName=="transfer") - { - console.log(eventName+ " Event result: "); - console.log(newData[0][0].data + " = " + newData[0][1].data); - console.log(newData[1][0].data + " = " + newData[1][1].data); - - console.log(newData[2][0].data + " = " + newData[2][1].data); - console.log(newData[3][0].data + " = " + newData[3][1].data); - console.log(newData[4][0].data + " = " + newData[4][1].data); - console.log(newData[5][0].data + " = " + newData[5][1].data); - - var from=splitdata(newData[2][1].data); - var to=splitdata(newData[4][1].data); - var value=parseInt(newData[5][1].data); - var pair=splitdata(newData[3][1].data); - - console.log("from: ", from); - console.log("to: ", to); - console.log("value: ",value); - console.log("pair: ", pair); - - request(GRAPHQL!, - `mutation handleTransfer( $from: String!, $to: String!, $value: Int!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ - handleTransfer( from: $from, to: $to, value: $value, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { - result - } - - }`, - {from:from, to: to, value: value, pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) - .then(data => console.log(data)) - .catch(error => console.error(error)); - } - else if (eventName=="mint") - { - - console.log(eventName+ " Event result: "); - console.log(newData[0][0].data + " = " + newData[0][1].data); - console.log(newData[1][0].data + " = " + newData[1][1].data); - console.log(newData[2][0].data + " = " + newData[2][1].data); - console.log(newData[3][0].data + " = " + newData[3][1].data); - console.log(newData[4][0].data + " = " + newData[4][1].data); - console.log(newData[5][0].data + " = " + newData[5][1].data); - - var amount0=parseInt(newData[0][1].data); - var amount1=parseInt(newData[1][1].data); - var pair=splitdata(newData[4][1].data); - var sender=splitdata(newData[5][1].data); - - console.log("amount0: ", amount0); - console.log("amount1: ", amount1); - console.log("pair: ",pair); - console.log("sender: ", sender); - - request(GRAPHQL!, - `mutation handleMint( $amount0: Int!, $amount1: Int!, $sender: String!,$logIndex: Int!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ - handleMint( amount0: $amount0, amount1: $amount1, sender: $sender, logIndex: $logIndex, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { - result - } - - }`, - {amount0:amount0, amount1: amount1, sender: sender,logIndex:0, pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) - .then(data => console.log(data)) - .catch(error => console.error(error)); - } - else if (eventName=="burn") - { - - console.log(eventName+ " Event result: "); - console.log(newData[0][0].data + " = " + newData[0][1].data); - console.log(newData[1][0].data + " = " + newData[1][1].data); - console.log(newData[2][0].data + " = " + newData[2][1].data); - console.log(newData[3][0].data + " = " + newData[3][1].data); - console.log(newData[4][0].data + " = " + newData[4][1].data); - console.log(newData[5][0].data + " = " + newData[5][1].data); - console.log(newData[6][0].data + " = " + newData[6][1].data); - - var amount0=parseInt(newData[0][1].data); - var amount1=parseInt(newData[1][1].data); - var pair=splitdata(newData[4][1].data); - var sender=splitdata(newData[5][1].data); - var to=splitdata(newData[6][1].data); - - console.log("amount0: ", amount0); - console.log("amount1: ", amount1); - console.log("pair: ",pair); - console.log("sender: ", sender); - console.log("to: ", to); - - request(GRAPHQL!, - `mutation handleBurn( $amount0: Int!, $amount1: Int!, $sender: String!,$logIndex: Int!,$to: String!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ - handleBurn( amount0: $amount0, amount1: $amount1, sender: $sender, logIndex: $logIndex, to:$to, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { - result - } - - }`, - {amount0:amount0, amount1: amount1, sender: sender,logIndex:0, to:to,pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) - .then(data => console.log(data)) - .catch(error => console.error(error)); - } - else if (eventName=="sync") - { - - console.log(eventName+ " Event result: "); - console.log(newData[0][0].data + " = " + newData[0][1].data); - console.log(newData[1][0].data + " = " + newData[1][1].data); - console.log(newData[2][0].data + " = " + newData[2][1].data); - console.log(newData[3][0].data + " = " + newData[3][1].data); - console.log(newData[4][0].data + " = " + newData[4][1].data); - - var reserve0=parseInt(newData[3][1].data); - var reserve1=parseInt(newData[4][1].data); - var pair=splitdata(newData[2][1].data); - - console.log("reserve0: ", reserve0); - console.log("reserve1: ", reserve1); - console.log("pair: ",pair); - - - request(GRAPHQL!, - `mutation handleSync( $reserve0: Int!, $reserve1: Int!, $pairAddress: String!){ - handleSync( reserve0: $reserve0, reserve1: $reserve1, pairAddress: $pairAddress) { - result - } - - }`, - {reserve0:reserve0, reserve1: reserve1, pairAddress: pair}) - .then(data => console.log(data)) - .catch(error => console.error(error)); - } - else if (eventName=="swap") - { - - console.log(eventName+ " Event result: "); - console.log(newData[0][0].data + " = " + newData[0][1].data); - console.log(newData[1][0].data + " = " + newData[1][1].data); - console.log(newData[2][0].data + " = " + newData[2][1].data); - console.log(newData[3][0].data + " = " + newData[3][1].data); - console.log(newData[4][0].data + " = " + newData[4][1].data); - console.log(newData[5][0].data + " = " + newData[5][1].data); - console.log(newData[6][0].data + " = " + newData[6][1].data); - console.log(newData[7][0].data + " = " + newData[7][1].data); - console.log(newData[8][0].data + " = " + newData[8][1].data); - console.log(newData[9][0].data + " = " + newData[9][1].data); - - var amount0In=parseInt(newData[0][1].data); - var amount1In=parseInt(newData[1][1].data); - var amount0Out=parseInt(newData[2][1].data); - var amount1Out=parseInt(newData[3][1].data); - var from=splitdata(newData[6][1].data); - var pair=splitdata(newData[7][1].data); - var sender=splitdata(newData[8][1].data); - var to=splitdata(newData[9][1].data); - - console.log("amount0In: ", amount0In); - console.log("amount1In: ", amount1In); - console.log("amount0Out: ", amount0Out); - console.log("amount1Out: ", amount1Out); - console.log("from: ",from); - console.log("pair: ",pair); - console.log("sender: ", sender); - console.log("to: ", to); - - request(GRAPHQL!, - `mutation handleSwap( $amount0In: Int!, $amount1In: Int!, $amount0Out: Int!, $amount1Out: Int!, $to: String!,$from: String!,$sender: String!,$logIndex: Int!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ - handleSwap( amount0In: $amount0In, amount1In: $amount1In, amount0Out: $amount0Out, amount1Out: $amount1Out, to:$to, from:$from,sender: $sender,logIndex: $logIndex, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { - result - } - - }`, - {amount0In:amount0In, amount1In: amount1In,amount0Out:amount0Out, amount1Out: amount1Out,to:to,from:from, sender: sender,logIndex:0,pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) - .then(data => console.log(data)) - .catch(error => console.error(error)); - } - - } else { - console.log(`Failed deploy of ${eventName}, deployHash: ${deploy.deployHash}`); - console.log(`Error: ${deploy.error}`); - } - } - ); - console.log("listener: ",listener); - -}; - -listener(); - -export const addpendingDeploy = async (event:string,contract_Hash:string,deployHash:string) => { - - await erc20.setContractHash(contract_Hash); - - if(event == Events.Approval) - { - erc20.addPendingDeploy(Events.Approval,deployHash); - console.log("approve"); - } - else if (event == Events.Transfer){ - erc20.addPendingDeploy(Events.Transfer,deployHash); - console.log("transfer"); - - } - else if (event == Events.PairCreated){ - erc20.addPendingDeploy(Events.PairCreated,deployHash); - console.log("pair created"); - - } - else if (event == Events.Mint){ - erc20.addPendingDeploy(Events.Mint,deployHash); - console.log("mint"); - - } - else if (event == Events.Burn){ - erc20.addPendingDeploy(Events.Burn,deployHash); - console.log("burn"); - - } - else if (event == Events.Sync){ - erc20.addPendingDeploy(Events.Sync,deployHash); - console.log("sync"); - - } - else if (event == Events.Swap){ - erc20.addPendingDeploy(Events.Swap,deployHash); - console.log("swap"); - - } - - await getDeploy(NODE_ADDRESS!, deployHash); - console.log("Get Deploy successfull"); -}; diff --git a/JsClients/ROUTER/dist/constants.js b/JsClients/ROUTER/dist/constants.js new file mode 100644 index 00000000..cb0d16e5 --- /dev/null +++ b/JsClients/ROUTER/dist/constants.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RouterEvents = void 0; +var RouterEvents; +(function (RouterEvents) { + RouterEvents["AddLiquidity"] = "uniswap_router_add_liquidity"; + RouterEvents["AddLiquidityCSPR"] = "uniswap_router_add_liquidity_cspr"; + RouterEvents["RemoveLiquidity"] = "uniswap_router_remove_liquidity"; + RouterEvents["RemoveLiquidityCSPR"] = "uniswap_router_remove_liquidity_cspr"; + RouterEvents["RemoveLiquidityWithPermit"] = "uniswap_router_remove_liquidity_with_permit"; + RouterEvents["RemoveLiquidityCSPRWithPermit"] = "uniswap_router_remove_liquidity_cspr_with_permit"; + RouterEvents["SwapExactTokensForTokens"] = "swap_exact_tokens_for_tokens"; + RouterEvents["SwapTokensForExactTokens"] = "swap_tokens_for_exact_tokens"; + RouterEvents["SwapExactCSPRForTokens"] = "swap_exact_cspr_for_tokens"; + RouterEvents["SwapTokensForExactCSPR"] = "swap_tokens_for_exact_cspr"; + RouterEvents["SwapExactTokensForCSPR"] = "swap_exact_cspr_for_tokens"; + RouterEvents["SwapCSPRForExactTokens"] = "swap_tokens_for_exact_cspr"; + RouterEvents["Quote"] = "quote"; + RouterEvents["GetAmountOut"] = "get_amount_out"; + RouterEvents["GetAmountIn"] = "get_amount_in"; + RouterEvents["GetAmountsOut"] = "get_amounts_out"; + RouterEvents["GetAmountsIn"] = "get_amounts_in"; +})(RouterEvents = exports.RouterEvents || (exports.RouterEvents = {})); +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/JsClients/ROUTER/dist/constants.js.map b/JsClients/ROUTER/dist/constants.js.map new file mode 100644 index 00000000..3cfad295 --- /dev/null +++ b/JsClients/ROUTER/dist/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,IAAY,YAkBX;AAlBD,WAAY,YAAY;IACtB,6DAA6C,CAAA;IAC7C,sEAAsD,CAAA;IACtD,mEAAmD,CAAA;IACnD,4EAA4D,CAAA;IAC5D,yFAAyE,CAAA;IACzE,kGAAkF,CAAA;IAClF,yEAAyD,CAAA;IACzD,yEAAyD,CAAA;IACzD,qEAAqD,CAAA;IACrD,qEAAqD,CAAA;IACrD,qEAAqD,CAAA;IACrD,qEAAqD,CAAA;IACrD,+BAAe,CAAA;IACf,+CAA+B,CAAA;IAC/B,6CAA6B,CAAA;IAC7B,iDAAiC,CAAA;IACjC,+CAA+B,CAAA;AACjC,CAAC,EAlBW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAkBvB"} \ No newline at end of file diff --git a/JsClients/ROUTER/dist/index.js b/JsClients/ROUTER/dist/index.js new file mode 100644 index 00000000..5676f11a --- /dev/null +++ b/JsClients/ROUTER/dist/index.js @@ -0,0 +1,32 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.constants = exports.utils = exports.UniswapRouterClient = void 0; +var uniswap_router_client_1 = __importDefault(require("./uniswap-router-client")); +exports.UniswapRouterClient = uniswap_router_client_1.default; +var utils = __importStar(require("./utils")); +exports.utils = utils; +var constants = __importStar(require("./constants")); +exports.constants = constants; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/JsClients/ROUTER/dist/index.js.map b/JsClients/ROUTER/dist/index.js.map new file mode 100644 index 00000000..0d0e9cd0 --- /dev/null +++ b/JsClients/ROUTER/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kFAA0D;AAKtD,8BALG,+BAAmB,CAKH;AAJvB,6CAAiC;AAK7B,sBAAK;AAJT,qDAAyC;AAKrC,8BAAS"} \ No newline at end of file diff --git a/JsClients/ROUTER/dist/uniswap-router-client.js b/JsClients/ROUTER/dist/uniswap-router-client.js new file mode 100644 index 00000000..c516640b --- /dev/null +++ b/JsClients/ROUTER/dist/uniswap-router-client.js @@ -0,0 +1,959 @@ +"use strict"; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var casper_js_sdk_1 = require("casper-js-sdk"); +var constants_1 = require("./constants"); +var utils = __importStar(require("./utils")); +var UniswapRouterClient = /** @class */ (function () { + function UniswapRouterClient(nodeAddress, chainName, eventStreamAddress) { + this.nodeAddress = nodeAddress; + this.chainName = chainName; + this.eventStreamAddress = eventStreamAddress; + this.contractName = "uniswap_router"; + this.isListening = false; + this.pendingDeploys = []; + } + UniswapRouterClient.prototype.install = function (keys, // Have Public/Private Key Pair + tokenName, factory, libraryHash, paymentAmount, wasmPath) { + return __awaiter(this, void 0, void 0, function () { + var runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + this.contractHash; + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + token_name: casper_js_sdk_1.CLValueBuilder.string(tokenName), + _factory: casper_js_sdk_1.CLValueBuilder.string(factory), + library_hash: casper_js_sdk_1.CLValueBuilder.string(libraryHash), + }); + return [4 /*yield*/, installWasmFile({ + chainName: this.chainName, + paymentAmount: paymentAmount, + nodeAddress: this.nodeAddress, + keys: keys, + pathToContract: wasmPath, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + return [2 /*return*/, deployHash]; + } + else { + throw Error("Problem with installation"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.setContractHash = function (hash) { + return __awaiter(this, void 0, void 0, function () { + var stateRootHash, contractData, _a, contractPackageHash, namedKeys, LIST_OF_NAMED_KEYS; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: return [4 /*yield*/, utils.getStateRootHash(this.nodeAddress)]; + case 1: + stateRootHash = _b.sent(); + return [4 /*yield*/, utils.getContractData(this.nodeAddress, stateRootHash, hash)]; + case 2: + contractData = _b.sent(); + _a = contractData.Contract, contractPackageHash = _a.contractPackageHash, namedKeys = _a.namedKeys; + this.contractHash = hash; + this.contractPackageHash = contractPackageHash.replace("contract-package-wasm", ""); + LIST_OF_NAMED_KEYS = [ + this.contractName + "_package_hash", + this.contractName + "_package_hash_wrapped", + this.contractName + "_contract_hash", + this.contractName + "_contract_hash_wrapped", + this.contractName + "_package_access_token", + ]; + // @ts-ignore + this.namedKeys = namedKeys.reduce(function (acc, val) { + var _a; + if (LIST_OF_NAMED_KEYS.includes(val.name)) { + return __assign(__assign({}, acc), (_a = {}, _a[utils.camelCased(val.name)] = val.key, _a)); + } + return acc; + }, {}); + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.add_liquidity = function (keys, token_a, token_b, amount_a_desired, // using string instead of 'number' because number is 64 bit in TS, we need 256 bits + amount_b_desired, amount_a_min, amount_b_min, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + token_a: utils.createRecipientAddress(token_a), + token_b: utils.createRecipientAddress(token_b), + amount_a_desired: casper_js_sdk_1.CLValueBuilder.u256(amount_a_desired), + amount_b_desired: casper_js_sdk_1.CLValueBuilder.u256(amount_b_desired), + amount_a_min: casper_js_sdk_1.CLValueBuilder.u256(amount_a_min), + amount_b_min: casper_js_sdk_1.CLValueBuilder.u256(amount_b_min), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "add_liquidity", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.AddLiquidity, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.add_liquidity_cspr = function (keys, token, amount_token_desired, amount_cspr_desired, amount_token_min, amount_cspr_min, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + token: utils.createRecipientAddress(token), + amount_token_desired: casper_js_sdk_1.CLValueBuilder.u256(amount_token_desired), + amount_cspr_desired: casper_js_sdk_1.CLValueBuilder.u256(amount_cspr_desired), + amount_token_min: casper_js_sdk_1.CLValueBuilder.u256(amount_token_min), + amount_cspr_min: casper_js_sdk_1.CLValueBuilder.u256(amount_cspr_min), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "add_liquidity_cspr", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.AddLiquidityCSPR, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.remove_liquidity = function (keys, token_a, token_b, liquidity, amount_a_min, amount_b_min, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + token_a: utils.createRecipientAddress(token_a), + token_b: utils.createRecipientAddress(token_b), + liquidity: casper_js_sdk_1.CLValueBuilder.u256(liquidity), + amount_a_min: casper_js_sdk_1.CLValueBuilder.u256(amount_a_min), + amount_b_min: casper_js_sdk_1.CLValueBuilder.u256(amount_b_min), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.RemoveLiquidity, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.remove_liquidity_cspr = function (keys, token, liquidity, amount_token_min, amount_cspr_min, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + token: utils.createRecipientAddress(token), + liquidity: casper_js_sdk_1.CLValueBuilder.u256(liquidity), + amount_token_min: casper_js_sdk_1.CLValueBuilder.u256(amount_token_min), + amount_cspr_min: casper_js_sdk_1.CLValueBuilder.u256(amount_cspr_min), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity_cspr", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.RemoveLiquidityCSPR, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + // Buffer.from(string) but it converts the string + // We want the actual bytes value from something.. + UniswapRouterClient.prototype.remove_liquidity_with_permit = function (keys, token_a, token_b, liquidity, amount_a_min, amount_b_min, to, deadline, approve_max, v, r, s, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var r_bytes, s_bytes, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + r_bytes = r.map(casper_js_sdk_1.CLValueBuilder.u8); + s_bytes = s.map(casper_js_sdk_1.CLValueBuilder.u8); + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + token_a: utils.createRecipientAddress(token_a), + token_b: utils.createRecipientAddress(token_b), + liquidity: casper_js_sdk_1.CLValueBuilder.u256(liquidity), + amount_a_min: casper_js_sdk_1.CLValueBuilder.u256(amount_a_min), + amount_b_min: casper_js_sdk_1.CLValueBuilder.u256(amount_b_min), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline), + approve_max: casper_js_sdk_1.CLValueBuilder.bool(approve_max), + v: casper_js_sdk_1.CLValueBuilder.u8(v), + r: casper_js_sdk_1.CLValueBuilder.list(r_bytes), + s: casper_js_sdk_1.CLValueBuilder.list(s_bytes) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity_with_permit", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.RemoveLiquidityWithPermit, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.remove_liquidity_cspr_with_permit = function (keys, token, liquidity, amount_token_min, amount_cspr_min, to, deadline, approve_max, v, r, s, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var r_bytes, s_bytes, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + r_bytes = r.map(casper_js_sdk_1.CLValueBuilder.u8); + s_bytes = s.map(casper_js_sdk_1.CLValueBuilder.u8); + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + token: utils.createRecipientAddress(token), + liquidity: casper_js_sdk_1.CLValueBuilder.u256(liquidity), + amount_token_min: casper_js_sdk_1.CLValueBuilder.u256(amount_token_min), + amount_cspr_min: casper_js_sdk_1.CLValueBuilder.u256(amount_cspr_min), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline), + approve_max: casper_js_sdk_1.CLValueBuilder.bool(approve_max), + v: casper_js_sdk_1.CLValueBuilder.u8(v), + r: casper_js_sdk_1.CLValueBuilder.list(r_bytes), + s: casper_js_sdk_1.CLValueBuilder.list(s_bytes) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity_cspr_with_permit", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.RemoveLiquidityCSPRWithPermit, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.swap_exact_tokens_for_tokens = function (keys, amount_in, amount_out_min, path, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var _paths, i, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _paths = []; + for (i = 0; i < path.length; i++) { + _paths.push(utils.createRecipientAddress(path[i])); + } + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + amount_in: casper_js_sdk_1.CLValueBuilder.u256(amount_in), + amount_out_min: casper_js_sdk_1.CLValueBuilder.u256(amount_out_min), + path: casper_js_sdk_1.CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_exact_tokens_for_tokens", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.SwapExactTokensForTokens, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.swap_tokens_for_exact_tokens = function (keys, amount_out, amount_in_max, path, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var _paths, i, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _paths = []; + for (i = 0; i < path.length; i++) { + _paths.push(utils.createRecipientAddress(path[i])); + } + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + amount_out: casper_js_sdk_1.CLValueBuilder.u256(amount_out), + amount_in_max: casper_js_sdk_1.CLValueBuilder.u256(amount_in_max), + path: casper_js_sdk_1.CLValueBuilder.list(_paths), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline), + to: utils.createRecipientAddress(to) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_tokens_for_exact_tokens", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.SwapTokensForExactTokens, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.swap_exact_cspr_for_tokens = function (keys, amount_out_min, amount_in, path, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var _path, i, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _path = []; + for (i = 0; i < path.length; i++) { + _path.push(utils.createRecipientAddress(path[i])); + } + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + amount_out_min: casper_js_sdk_1.CLValueBuilder.u256(amount_out_min), + amount_in: casper_js_sdk_1.CLValueBuilder.u256(amount_in), + path: casper_js_sdk_1.CLValueBuilder.list(_path), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline), + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_exact_cspr_for_tokens", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.SwapExactCSPRForTokens, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.swap_tokens_for_exact_cspr = function (keys, amount_out, amount_in_max, path, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var _paths, i, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _paths = []; + for (i = 0; i < path.length; i++) { + _paths.push(utils.createRecipientAddress(path[i])); + } + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + amount_out: casper_js_sdk_1.CLValueBuilder.u256(amount_out), + amount_in_max: casper_js_sdk_1.CLValueBuilder.u256(amount_in_max), + path: casper_js_sdk_1.CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_tokens_for_exact_cspr", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.SwapTokensForExactCSPR, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.swap_exact_tokens_for_cspr = function (keys, amount_in, amount_out_min, path, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var _paths, i, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _paths = []; + for (i = 0; i < path.length; i++) { + _paths.push(utils.createRecipientAddress(path[i])); + } + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + amount_in: casper_js_sdk_1.CLValueBuilder.u256(amount_in), + amount_out_min: casper_js_sdk_1.CLValueBuilder.u256(amount_out_min), + path: casper_js_sdk_1.CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_exact_tokens_for_cspr", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.SwapExactTokensForCSPR, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + UniswapRouterClient.prototype.swap_cspr_for_exact_tokens = function (keys, amount_out, amount_in_max, path, to, deadline, paymentAmount) { + return __awaiter(this, void 0, void 0, function () { + var _paths, i, runtimeArgs, deployHash; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + _paths = []; + for (i = 0; i < path.length; i++) { + _paths.push(utils.createRecipientAddress(path[i])); + } + runtimeArgs = casper_js_sdk_1.RuntimeArgs.fromMap({ + amount_out: casper_js_sdk_1.CLValueBuilder.u256(amount_out), + amount_in_max: casper_js_sdk_1.CLValueBuilder.u256(amount_in_max), + path: casper_js_sdk_1.CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(to), + deadline: casper_js_sdk_1.CLValueBuilder.u256(deadline) + }); + return [4 /*yield*/, contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_cspr_for_exact_tokens", + keys: keys, + nodeAddress: this.nodeAddress, + paymentAmount: paymentAmount, + runtimeArgs: runtimeArgs, + })]; + case 1: + deployHash = _a.sent(); + if (deployHash !== null) { + this.addPendingDeploy(constants_1.RouterEvents.SwapCSPRForExactTokens, deployHash); + return [2 /*return*/, deployHash]; + } + else { + throw Error("Invalid Deploy"); + } + return [2 /*return*/]; + } + }); + }); + }; + /* + public async quote( + keys: Keys.AsymmetricKey, + amount_a: string, + reserve_a: string, + reserve_b: string, + paymentAmount: string + ) { + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_a: CLValueBuilder.u256(amount_a), + reserve_a: CLValueBuilder.u256(reserve_a), + reserve_b: CLValueBuilder.u256(reserve_b), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "quote", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Quote, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + + } + + public async get_amount_out( + keys: Keys.AsymmetricKey, + amount_in: string, + reserve_in: string, + reserve_out: string, + paymentAmount: string + ) { + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_in: CLValueBuilder.u256(amount_in), + reserve_in: CLValueBuilder.u256(reserve_in), + reserve_out: CLValueBuilder.u256(reserve_out), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "get_amount_out", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.GetAmountOut, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + + } + + public async get_amount_in( + keys: Keys.AsymmetricKey, + amount_out: string, + reserve_in: string, + reserve_out: string, + paymentAmount: string + ) { + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_out: CLValueBuilder.u256(amount_out), + reserve_in: CLValueBuilder.u256(reserve_in), + reserve_out: CLValueBuilder.u256(reserve_out), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "get_amount_in", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.GetAmountIn, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + + } + + public async get_amounts_out( + keys: Keys.AsymmetricKey, + amount_in: string, + path: RecipientType[], + paymentAmount: string + ) { + + // MAPPED THIS ACCORDING TO UTIL createRecipientAddress function + let _paths:CLKey[] = []; + for(let i = 0; i < path.length; i++){ + _paths.push(utils.createRecipientAddress(path[i])); + } + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_in: CLValueBuilder.u256(amount_in), + path: CLValueBuilder.list(_paths) + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "get_amounts_out", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.GetAmountsOut, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + + } + + public async get_amounts_in( + keys: Keys.AsymmetricKey, + amount_out: string, + path: RecipientType[], + paymentAmount: string + ) { + + // MAPPED THIS ACCORDING TO UTIL createRecipientAddress function + let _paths:CLKey[] = []; + for(let i = 0; i < path.length; i++){ + _paths.push(utils.createRecipientAddress(path[i])); + } + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_out: CLValueBuilder.u256(amount_out), + path: CLValueBuilder.list(_paths) + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "get_amounts_in", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.GetAmountsIn, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + + } + */ + UniswapRouterClient.prototype.onEvent = function (eventNames, callback) { + var _this = this; + if (!this.eventStreamAddress) { + throw Error("Please set eventStreamAddress before!"); + } + if (this.isListening) { + throw Error("Only one event listener can be create at a time. Remove the previous one and start new."); + } + var es = new casper_js_sdk_1.EventStream(this.eventStreamAddress); + this.isListening = true; + es.subscribe(casper_js_sdk_1.EventName.DeployProcessed, function (value) { + var deployHash = value.body.DeployProcessed.deploy_hash; + var pendingDeploy = _this.pendingDeploys.find(function (pending) { return pending.deployHash === deployHash; }); + if (!pendingDeploy) { + return; + } + if (!value.body.DeployProcessed.execution_result.Success && + value.body.DeployProcessed.execution_result.Failure) { + callback(pendingDeploy.deployType, { + deployHash: deployHash, + error: value.body.DeployProcessed.execution_result.Failure.error_message, + success: false, + }, null); + } + else { + var transforms = value.body.DeployProcessed.execution_result.Success.effect.transforms; + var cep47Events = transforms.reduce(function (acc, val) { + if (val.transform.hasOwnProperty("WriteCLValue") && + typeof val.transform.WriteCLValue.parsed === "object" && + val.transform.WriteCLValue.parsed !== null) { + var maybeCLValue = casper_js_sdk_1.CLValueParsers.fromJSON(val.transform.WriteCLValue); + var clValue = maybeCLValue.unwrap(); + if (clValue && clValue instanceof casper_js_sdk_1.CLMap) { + var hash = clValue.get(casper_js_sdk_1.CLValueBuilder.string("contract_package_hash")); + var event_1 = clValue.get(casper_js_sdk_1.CLValueBuilder.string("event_type")); + if (hash && + hash.value() === _this.contractPackageHash && + event_1 && + eventNames.includes(event_1.value())) { + acc = __spreadArray(__spreadArray([], acc, true), [{ name: event_1.value(), clValue: clValue }], false); + } + } + } + return acc; + }, []); + cep47Events.forEach(function (d) { + return callback(d.name, { deployHash: deployHash, error: null, success: true }, d.clValue); + }); + } + _this.pendingDeploys = _this.pendingDeploys.filter(function (pending) { return pending.deployHash !== deployHash; }); + }); + es.start(); + return { + stopListening: function () { + es.unsubscribe(casper_js_sdk_1.EventName.DeployProcessed); + es.stop(); + _this.isListening = false; + _this.pendingDeploys = []; + }, + }; + }; + UniswapRouterClient.prototype.addPendingDeploy = function (deployType, deployHash) { + this.pendingDeploys = __spreadArray(__spreadArray([], this.pendingDeploys, true), [{ deployHash: deployHash, deployType: deployType }], false); + }; + return UniswapRouterClient; +}()); +var installWasmFile = function (_a) { + var nodeAddress = _a.nodeAddress, keys = _a.keys, chainName = _a.chainName, pathToContract = _a.pathToContract, runtimeArgs = _a.runtimeArgs, paymentAmount = _a.paymentAmount; + return __awaiter(void 0, void 0, void 0, function () { + var client, deploy; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + client = new casper_js_sdk_1.CasperClient(nodeAddress); + deploy = casper_js_sdk_1.DeployUtil.makeDeploy(new casper_js_sdk_1.DeployUtil.DeployParams(casper_js_sdk_1.CLPublicKey.fromHex(keys.publicKey.toHex()), chainName), casper_js_sdk_1.DeployUtil.ExecutableDeployItem.newModuleBytes(utils.getBinary(pathToContract), runtimeArgs), casper_js_sdk_1.DeployUtil.standardPayment(paymentAmount)); + // Sign deploy. + deploy = client.signDeploy(deploy, keys); + return [4 /*yield*/, client.putDeploy(deploy)]; + case 1: + // Dispatch deploy to node. + return [2 /*return*/, _b.sent()]; + } + }); + }); +}; +var contractCall = function (_a) { + var nodeAddress = _a.nodeAddress, keys = _a.keys, chainName = _a.chainName, contractHash = _a.contractHash, entryPoint = _a.entryPoint, runtimeArgs = _a.runtimeArgs, paymentAmount = _a.paymentAmount; + return __awaiter(void 0, void 0, void 0, function () { + var client, contractHashAsByteArray, deploy, deployHash; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + client = new casper_js_sdk_1.CasperClient(nodeAddress); + contractHashAsByteArray = utils.contractHashToByteArray(contractHash); + deploy = casper_js_sdk_1.DeployUtil.makeDeploy(new casper_js_sdk_1.DeployUtil.DeployParams(keys.publicKey, chainName), casper_js_sdk_1.DeployUtil.ExecutableDeployItem.newStoredContractByHash(contractHashAsByteArray, entryPoint, runtimeArgs), casper_js_sdk_1.DeployUtil.standardPayment(paymentAmount)); + // Sign deploy. + deploy = client.signDeploy(deploy, keys); + return [4 /*yield*/, client.putDeploy(deploy)]; + case 1: + deployHash = _b.sent(); + return [2 /*return*/, deployHash]; + } + }); + }); +}; +var contractSimpleGetter = function (nodeAddress, contractHash, key) { return __awaiter(void 0, void 0, void 0, function () { + var stateRootHash, clValue; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, utils.getStateRootHash(nodeAddress)]; + case 1: + stateRootHash = _a.sent(); + return [4 /*yield*/, utils.getContractData(nodeAddress, stateRootHash, contractHash, key)]; + case 2: + clValue = _a.sent(); + if (clValue && clValue.CLValue instanceof casper_js_sdk_1.CLValue) { + return [2 /*return*/, clValue.CLValue]; + } + else { + throw Error("Invalid stored value"); + } + return [2 /*return*/]; + } + }); +}); }; +var toCLMap = function (map) { + var clMap = casper_js_sdk_1.CLValueBuilder.map([ + casper_js_sdk_1.CLTypeBuilder.string(), + casper_js_sdk_1.CLTypeBuilder.string(), + ]); + for (var _i = 0, _a = Array.from(map.entries()); _i < _a.length; _i++) { + var _b = _a[_i], key = _b[0], value = _b[1]; + clMap.set(casper_js_sdk_1.CLValueBuilder.string(key), casper_js_sdk_1.CLValueBuilder.string(value)); + } + return clMap; +}; +var fromCLMap = function (map) { + var jsMap = new Map(); + for (var _i = 0, _a = Array.from(map.entries()); _i < _a.length; _i++) { + var _b = _a[_i], key = _b[0], value = _b[1]; + jsMap.set(key.value(), value.value()); + } + return jsMap; +}; +exports.default = UniswapRouterClient; +//# sourceMappingURL=uniswap-router-client.js.map \ No newline at end of file diff --git a/JsClients/ROUTER/dist/uniswap-router-client.js.map b/JsClients/ROUTER/dist/uniswap-router-client.js.map new file mode 100644 index 00000000..50f1e73d --- /dev/null +++ b/JsClients/ROUTER/dist/uniswap-router-client.js.map @@ -0,0 +1 @@ +{"version":3,"file":"uniswap-router-client.js","sourceRoot":"","sources":["../src/uniswap-router-client.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/JsClients/ROUTER/dist/utils.js b/JsClients/ROUTER/dist/utils.js new file mode 100644 index 00000000..b0a6aea2 --- /dev/null +++ b/JsClients/ROUTER/dist/utils.js @@ -0,0 +1,177 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sleep = exports.contractHashToByteArray = exports.contractDictionaryGetter = exports.getContractData = exports.getAccountNamedKeyValue = exports.getAccountInfo = exports.getStateRootHash = exports.getBinary = exports.getKeyPairOfContract = exports.createRecipientAddress = exports.camelCased = void 0; +var casper_js_sdk_1 = require("casper-js-sdk"); +var fs_1 = __importDefault(require("fs")); +var camelCased = function (myString) { + return myString.replace(/_([a-z])/g, function (g) { return g[1].toUpperCase(); }); +}; +exports.camelCased = camelCased; +var createRecipientAddress = function (recipient) { + if (recipient instanceof casper_js_sdk_1.CLPublicKey) { + return new casper_js_sdk_1.CLKey(new casper_js_sdk_1.CLAccountHash(recipient.toAccountHash())); + } + else { + return new casper_js_sdk_1.CLKey(recipient); + } +}; +exports.createRecipientAddress = createRecipientAddress; +/** + * Returns an ECC key pair mapped to an NCTL faucet account. + * @param pathToFaucet - Path to NCTL faucet directory. + */ +var getKeyPairOfContract = function (pathToFaucet) { + return casper_js_sdk_1.Keys.Ed25519.parseKeyFiles(pathToFaucet + "/public_key.pem", pathToFaucet + "/secret_key.pem"); +}; +exports.getKeyPairOfContract = getKeyPairOfContract; +/** + * Returns a binary as u8 array. + * @param pathToBinary - Path to binary file to be loaded into memory. + * @return Uint8Array Byte array. + */ +var getBinary = function (pathToBinary) { + return new Uint8Array(fs_1.default.readFileSync(pathToBinary, null).buffer); +}; +exports.getBinary = getBinary; +/** + * Returns global state root hash at current block. + * @param {Object} client - JS SDK client for interacting with a node. + * @return {String} Root hash of global state at most recent block. + */ +var getStateRootHash = function (nodeAddress) { return __awaiter(void 0, void 0, void 0, function () { + var client, block; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + client = new casper_js_sdk_1.CasperServiceByJsonRPC(nodeAddress); + return [4 /*yield*/, client.getLatestBlockInfo()]; + case 1: + block = (_a.sent()).block; + if (block) { + return [2 /*return*/, block.header.state_root_hash]; + } + else { + throw Error("Problem when calling getLatestBlockInfo"); + } + return [2 /*return*/]; + } + }); +}); }; +exports.getStateRootHash = getStateRootHash; +var getAccountInfo = function (nodeAddress, publicKey) { return __awaiter(void 0, void 0, void 0, function () { + var stateRootHash, client, accountHash, blockState; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (0, exports.getStateRootHash)(nodeAddress)]; + case 1: + stateRootHash = _a.sent(); + client = new casper_js_sdk_1.CasperServiceByJsonRPC(nodeAddress); + accountHash = publicKey.toAccountHashStr(); + return [4 /*yield*/, client.getBlockState(stateRootHash, accountHash, [])]; + case 2: + blockState = _a.sent(); + return [2 /*return*/, blockState.Account]; + } + }); +}); }; +exports.getAccountInfo = getAccountInfo; +/** + * Returns a value under an on-chain account's storage. + * @param accountInfo - On-chain account's info. + * @param namedKey - A named key associated with an on-chain account. + */ +var getAccountNamedKeyValue = function (accountInfo, namedKey) { + var found = accountInfo.namedKeys.find(function (i) { return i.name === namedKey; }); + if (found) { + return found.key; + } + return undefined; +}; +exports.getAccountNamedKeyValue = getAccountNamedKeyValue; +var getContractData = function (nodeAddress, stateRootHash, contractHash, path) { + if (path === void 0) { path = []; } + return __awaiter(void 0, void 0, void 0, function () { + var client, blockState; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + client = new casper_js_sdk_1.CasperServiceByJsonRPC(nodeAddress); + return [4 /*yield*/, client.getBlockState(stateRootHash, "hash-" + contractHash, path)]; + case 1: + blockState = _a.sent(); + return [2 /*return*/, blockState]; + } + }); + }); +}; +exports.getContractData = getContractData; +var contractDictionaryGetter = function (nodeAddress, dictionaryItemKey, seedUref) { return __awaiter(void 0, void 0, void 0, function () { + var stateRootHash, client, storedValue; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, (0, exports.getStateRootHash)(nodeAddress)]; + case 1: + stateRootHash = _a.sent(); + client = new casper_js_sdk_1.CasperServiceByJsonRPC(nodeAddress); + return [4 /*yield*/, client.getDictionaryItemByURef(stateRootHash, dictionaryItemKey, seedUref)]; + case 2: + storedValue = _a.sent(); + if (storedValue && storedValue.CLValue instanceof casper_js_sdk_1.CLValue) { + return [2 /*return*/, storedValue.CLValue]; + } + else { + throw Error("Invalid stored value"); + } + return [2 /*return*/]; + } + }); +}); }; +exports.contractDictionaryGetter = contractDictionaryGetter; +var contractHashToByteArray = function (contractHash) { + return Uint8Array.from(Buffer.from(contractHash, "hex")); +}; +exports.contractHashToByteArray = contractHashToByteArray; +var sleep = function (num) { + return new Promise(function (resolve) { return setTimeout(resolve, num); }); +}; +exports.sleep = sleep; +//# sourceMappingURL=utils.js.map \ No newline at end of file diff --git a/JsClients/ROUTER/dist/utils.js.map b/JsClients/ROUTER/dist/utils.js.map new file mode 100644 index 00000000..42ca967b --- /dev/null +++ b/JsClients/ROUTER/dist/utils.js.map @@ -0,0 +1 @@ +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/JsClients/ROUTER/keys/public_key.pem b/JsClients/ROUTER/keys/public_key.pem new file mode 100644 index 00000000..b029671b --- /dev/null +++ b/JsClients/ROUTER/keys/public_key.pem @@ -0,0 +1,3 @@ +-----BEGIN PUBLIC KEY----- +MCowBQYDK2VwAyEAwrapZ6QuZF+X1hsNluiXmdCWRAc+syfKTmQ9Tau9NPE= +-----END PUBLIC KEY----- diff --git a/JsClients/ROUTER/keys/public_key_hex b/JsClients/ROUTER/keys/public_key_hex new file mode 100644 index 00000000..781fa1fa --- /dev/null +++ b/JsClients/ROUTER/keys/public_key_hex @@ -0,0 +1 @@ +01c2b6a967a42e645f97d61b0d96e89799d09644073eb327ca4e643d4dabbd34f1 \ No newline at end of file diff --git a/JsClients/ROUTER/keys/secret_key.pem b/JsClients/ROUTER/keys/secret_key.pem new file mode 100644 index 00000000..d6d1434c --- /dev/null +++ b/JsClients/ROUTER/keys/secret_key.pem @@ -0,0 +1,3 @@ +-----BEGIN PRIVATE KEY----- +MC4CAQAwBQYDK2VwBCIEIH+6suzRo2fHjw2YK+ffdBcIxoFYrugGW6smkIxCFNH0 +-----END PRIVATE KEY----- diff --git a/JsClients/Events/src/constants.ts b/JsClients/ROUTER/src/constants.ts similarity index 84% rename from JsClients/Events/src/constants.ts rename to JsClients/ROUTER/src/constants.ts index 9d0375d3..cbee4de5 100644 --- a/JsClients/Events/src/constants.ts +++ b/JsClients/ROUTER/src/constants.ts @@ -1,4 +1,4 @@ -export enum Events { +export enum RouterEvents { PairCreated="pair_created", Approval = 'approve', Transfer = 'transfer', @@ -6,6 +6,4 @@ export enum Events { Burn = 'burn', Sync = 'sync', Swap = 'swap' - } - diff --git a/JsClients/Events/src/index.ts b/JsClients/ROUTER/src/index.ts similarity index 57% rename from JsClients/Events/src/index.ts rename to JsClients/ROUTER/src/index.ts index 44f27c2e..c4321bc7 100644 --- a/JsClients/Events/src/index.ts +++ b/JsClients/ROUTER/src/index.ts @@ -1,9 +1,9 @@ -import Client from "./event"; +import UniswapRouterClient from "./uniswap-router-client"; import * as utils from "./utils"; import * as constants from "./constants"; export { - Client, + UniswapRouterClient, utils, constants }; diff --git a/JsClients/ROUTER/src/types.d.ts b/JsClients/ROUTER/src/types.d.ts new file mode 100644 index 00000000..15cbf6ba --- /dev/null +++ b/JsClients/ROUTER/src/types.d.ts @@ -0,0 +1,9 @@ +import { CLAccountHash, CLByteArray, CLPublicKey } from "casper-js-sdk"; +import {RouterEvents} from "./constants"; + +export type RecipientType = CLPublicKey | CLAccountHash | CLByteArray; + +export interface IPendingDeploy { + deployHash: string; + deployType: RouterEvents; +} diff --git a/JsClients/ROUTER/src/uniswap-router-client.ts b/JsClients/ROUTER/src/uniswap-router-client.ts new file mode 100644 index 00000000..1ac1c1bb --- /dev/null +++ b/JsClients/ROUTER/src/uniswap-router-client.ts @@ -0,0 +1,988 @@ +import { + CasperClient, + CLPublicKey, + CLAccountHash, + CLByteArray, + CLKey, + CLString, + CLTypeBuilder, + CLValue, + CLValueBuilder, + CLValueParsers, + CLMap, + DeployUtil, + EventName, + EventStream, + Keys, + RuntimeArgs, + CLKeyParameters, + CLKeyType, + CLList, + CLBoolBytesParser, +} from "casper-js-sdk"; +import { Some, None } from "ts-results"; +import { RouterEvents } from "./constants"; +import * as utils from "./utils"; +import { RecipientType, IPendingDeploy } from "./types"; +import { ContractType } from "casper-js-sdk/dist/lib/DeployUtil"; +const axios = require("axios").default; + +class UniswapRouterClient { + private contractName: string = "uniswap_router"; + private contractHash: string; // Hash type is string + private contractPackageHash: string; + private namedKeys: { + balances: string; + metadata: string; + ownedTokens: string; + owners: string; + paused: string; + }; + private isListening = false; + private pendingDeploys: IPendingDeploy[] = []; + + constructor( + private nodeAddress: string, + private chainName: string, + private eventStreamAddress?: string + ) {} + + public async install( + keys: Keys.AsymmetricKey, // Have Public/Private Key Pair + factory: string, + wcspr: string, + library: string, + _contract_name: string, + paymentAmount: string, + wasmPath: string + ) { + // convert string addresses to 8 bits hex arrays + const _factory = new CLByteArray( + Uint8Array.from(Buffer.from(factory, "hex")) + ); + const _wcspr = new CLByteArray(Uint8Array.from(Buffer.from(wcspr, "hex"))); + const _library = new CLByteArray( + Uint8Array.from(Buffer.from(library, "hex")) + ); + + const runtimeArgs = RuntimeArgs.fromMap({ + factory: CLValueBuilder.key(_factory), + wcspr: CLValueBuilder.key(_wcspr), + library: CLValueBuilder.key(_library), + contract_name: CLValueBuilder.string(_contract_name), + }); + + const deployHash = await installWasmFile({ + chainName: this.chainName, + paymentAmount, + nodeAddress: this.nodeAddress, + keys, + pathToContract: wasmPath, + runtimeArgs, + }); + + if (deployHash !== null) { + return deployHash; + } else { + throw Error("Problem with installation"); + } + } + + public async setContractHash(hash: string) { + const stateRootHash = await utils.getStateRootHash(this.nodeAddress); + + const contractData = await utils.getContractData( + this.nodeAddress, + stateRootHash, + hash + ); + + const { contractPackageHash, namedKeys } = contractData.Contract!; + this.contractHash = hash; + this.contractPackageHash = contractPackageHash.replace( + "contract-package-wasm", + "" + ); + const LIST_OF_NAMED_KEYS = [ + `${this.contractName}_package_hash`, + `${this.contractName}_package_hash_wrapped`, + `${this.contractName}_contract_hash`, + `${this.contractName}_contract_hash_wrapped`, + `${this.contractName}_package_access_token`, + ]; + // @ts-ignore + this.namedKeys = namedKeys.reduce((acc, val) => { + if (LIST_OF_NAMED_KEYS.includes(val.name)) { + return { ...acc, [utils.camelCased(val.name)]: val.key }; + } + return acc; + }, {}); + } + + // using string instead of 'number' because number is 64 bit in TS, we need 256 bits + public async add_liquidity( + keys: Keys.AsymmetricKey, + token_a: string, + token_b: string, + amount_a_desired: string, + amount_b_desired: string, + amount_a_min: string, + amount_b_min: string, + to: string, + deadline: string, + paymentAmount: string + ) { + const _token_a = new CLByteArray( + Uint8Array.from(Buffer.from(token_a, "hex")) + ); + const _token_b = new CLByteArray( + Uint8Array.from(Buffer.from(token_b, "hex")) + ); + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + token_a: new CLKey(_token_a), + token_b: new CLKey(_token_b), + amount_a_desired: CLValueBuilder.u256(amount_a_desired), + amount_b_desired: CLValueBuilder.u256(amount_b_desired), + amount_a_min: CLValueBuilder.u256(amount_a_min), + amount_b_min: CLValueBuilder.u256(amount_b_min), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "add_liquidity", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.PairCreated, deployHash); + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Mint, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async add_liquidity_cspr( + keys: Keys.AsymmetricKey, + token: string, + amount_token_desired: string, + amount_cspr_desired: string, + amount_token_min: string, + amount_cspr_min: string, + to: string, + deadline: string, + paymentAmount: string + ) { + const _token = new CLByteArray(Uint8Array.from(Buffer.from(token, "hex"))); + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + token: new CLKey(_token), + amount_token_desired: CLValueBuilder.u256(amount_token_desired), + amount_cspr_desired: CLValueBuilder.u256(amount_cspr_desired), + amount_token_min: CLValueBuilder.u256(amount_token_min), + amount_cspr_min: CLValueBuilder.u256(amount_cspr_min), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "add_liquidity_cspr", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.PairCreated, deployHash); + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Mint, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async remove_liquidity( + keys: Keys.AsymmetricKey, + token_a: string, + token_b: string, + liquidity: string, + amount_a_min: string, + amount_b_min: string, + to: string, + deadline: string, + paymentAmount: string + ) { + const _token_a = new CLByteArray( + Uint8Array.from(Buffer.from(token_a, "hex")) + ); + const _token_b = new CLByteArray( + Uint8Array.from(Buffer.from(token_b, "hex")) + ); + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + token_a: new CLKey(_token_a), + token_b: new CLKey(_token_b), + liquidity: CLValueBuilder.u256(liquidity), + amount_a_min: CLValueBuilder.u256(amount_a_min), + amount_b_min: CLValueBuilder.u256(amount_b_min), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Burn, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async remove_liquidity_cspr( + keys: Keys.AsymmetricKey, + token: string, + liquidity: string, + amount_token_min: string, + amount_cspr_min: string, + to: string, + deadline: string, + paymentAmount: string + ) { + const _token = new CLByteArray(Uint8Array.from(Buffer.from(token, "hex"))); + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + token: new CLKey(_token), + liquidity: CLValueBuilder.u256(liquidity), + amount_token_min: CLValueBuilder.u256(amount_token_min), + amount_cspr_min: CLValueBuilder.u256(amount_cspr_min), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity_cspr", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Burn, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + // Buffer.from(string) but it converts the string, we want the actual bytes value from something.. + public async remove_liquidity_with_permit( + keys: Keys.AsymmetricKey, + token_a: string, + token_b: string, + liquidity: string, + amount_a_min: string, + amount_b_min: string, + to: string, + deadline: string, + approve_max: boolean, + v: string, + r: string, + s: string, + paymentAmount: string + ) { + const _token_a = new CLByteArray( + Uint8Array.from(Buffer.from(token_a, "hex")) + ); + const _token_b = new CLByteArray( + Uint8Array.from(Buffer.from(token_b, "hex")) + ); + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + token_a: new CLKey(_token_a), + token_b: new CLKey(_token_b), + liquidity: CLValueBuilder.u256(liquidity), + amount_a_min: CLValueBuilder.u256(amount_a_min), + amount_b_min: CLValueBuilder.u256(amount_b_min), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + approve_max: CLValueBuilder.bool(approve_max), + v: CLValueBuilder.u8(v), + r: CLValueBuilder.u32(r), + s: CLValueBuilder.u32(s), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity_with_permit", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Approval, deployHash); + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Burn, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async remove_liquidity_cspr_with_permit( + keys: Keys.AsymmetricKey, + token: string, + liquidity: string, + amount_token_min: string, + amount_cspr_min: string, + to: string, + deadline: string, + approve_max: boolean, + v: string, + r: string, + s: string, + paymentAmount: string + ) { + const _token = new CLByteArray(Uint8Array.from(Buffer.from(token, "hex"))); + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + token: new CLKey(_token), + liquidity: CLValueBuilder.u256(liquidity), + amount_token_min: CLValueBuilder.u256(amount_token_min), + amount_cspr_min: CLValueBuilder.u256(amount_cspr_min), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + approve_max: CLValueBuilder.bool(approve_max), + v: CLValueBuilder.u8(v), + r: CLValueBuilder.u32(r), + s: CLValueBuilder.u32(s), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "remove_liquidity_cspr_with_permit", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Approval, deployHash); + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Burn, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async swap_exact_tokens_for_tokens( + keys: Keys.AsymmetricKey, + amount_in: string, + amount_out_min: string, + path: string[], + to: string, + deadline: string, + paymentAmount: string + ) { + console.log("Path (before): ", path[0]); + console.log("to (before): ", to); + + // MAPPED THIS ACCORDING TO UTIL createRecipientAddress function + let _paths: CLKey[] = []; + for (let i = 0; i < path.length; i++) { + const p = new CLByteArray(Uint8Array.from(Buffer.from(path[i], "hex"))); + _paths.push(utils.createRecipientAddress(p)); + } + + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + console.log("\n_to (After): ", utils.createRecipientAddress(_to)); + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_in: CLValueBuilder.u256(amount_in), + amount_out_min: CLValueBuilder.u256(amount_out_min), + path: new CLList(_paths), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_exact_tokens_for_tokens", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Swap, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async swap_tokens_for_exact_tokens( + keys: Keys.AsymmetricKey, + amount_out: string, + amount_in_max: string, + path: string[], + to: string, + deadline: string, + paymentAmount: string + ) { + let _paths: CLKey[] = []; + for (let i = 0; i < path.length; i++) { + const p = new CLByteArray(Uint8Array.from(Buffer.from(path[i], "hex"))); + _paths.push(utils.createRecipientAddress(p)); + } + + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_out: CLValueBuilder.u256(amount_out), + amount_in_max: CLValueBuilder.u256(amount_in_max), + path: CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_tokens_for_exact_tokens", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Swap, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async swap_exact_cspr_for_tokens( + keys: Keys.AsymmetricKey, + amount_out_min: string, + amount_in: string, + path: string[], + to: string, + deadline: string, + paymentAmount: string + ) { + let _paths: CLKey[] = []; + for (let i = 0; i < path.length; i++) { + const p = new CLByteArray(Uint8Array.from(Buffer.from(path[i], "hex"))); + _paths.push(utils.createRecipientAddress(p)); + } + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_out_min: CLValueBuilder.u256(amount_out_min), + amount_in: CLValueBuilder.u256(amount_in), + path: CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_exact_cspr_for_tokens", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Swap, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async swap_tokens_for_exact_cspr( + keys: Keys.AsymmetricKey, + amount_out: string, + amount_in_max: string, + path: string[], + to: string, + deadline: string, + paymentAmount: string + ) { + let _paths: CLKey[] = []; + for (let i = 0; i < path.length; i++) { + const p = new CLByteArray(Uint8Array.from(Buffer.from(path[i], "hex"))); + _paths.push(utils.createRecipientAddress(p)); + } + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_out: CLValueBuilder.u256(amount_out), + amount_in_max: CLValueBuilder.u256(amount_in_max), + path: CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_tokens_for_exact_cspr", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Swap, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async swap_exact_tokens_for_cspr( + keys: Keys.AsymmetricKey, + amount_in: string, + amount_out_min: string, + path: string[], + to: string, + deadline: string, + paymentAmount: string + ) { + let _paths: CLKey[] = []; + for (let i = 0; i < path.length; i++) { + const p = new CLByteArray(Uint8Array.from(Buffer.from(path[i], "hex"))); + _paths.push(utils.createRecipientAddress(p)); + } + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_in: CLValueBuilder.u256(amount_in), + amount_out_min: CLValueBuilder.u256(amount_out_min), + path: CLValueBuilder.list(_paths), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_exact_tokens_for_cspr", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Swap, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public async swap_cspr_for_exact_tokens( + keys: Keys.AsymmetricKey, + amount_out: string, + amount_in_max: string, + path: string[], + to: string, + deadline: string, + paymentAmount: string + ) { + let _paths: CLKey[] = []; + console.log("Output\n"); + + for (let i = 0; i < path.length; i++) { + const p = new CLByteArray(Uint8Array.from(Buffer.from(path[i], "hex"))); + _paths.push(utils.createRecipientAddress(p)); + } + + const _to = new CLByteArray(Uint8Array.from(Buffer.from(to, "hex"))); + console.log("To: ", utils.createRecipientAddress(_to)); + console.log( + "Path:\n", + CLValueBuilder.list(CLValueBuilder.list(_paths).data) + ); + + const runtimeArgs = RuntimeArgs.fromMap({ + amount_out: CLValueBuilder.u256(amount_out), + amount_in_max: CLValueBuilder.u256(amount_in_max), + path: CLValueBuilder.list(CLValueBuilder.list(_paths).data), + to: utils.createRecipientAddress(_to), + deadline: CLValueBuilder.u256(deadline), + }); + + const deployHash = await contractCall({ + chainName: this.chainName, + contractHash: this.contractHash, + entryPoint: "swap_cspr_for_exact_tokens", + keys, + nodeAddress: this.nodeAddress, + paymentAmount, + runtimeArgs, + }); + + if (deployHash !== null) { + this.addPendingDeploy(RouterEvents.Transfer, deployHash); + this.addPendingDeploy(RouterEvents.Sync, deployHash); + this.addPendingDeploy(RouterEvents.Swap, deployHash); + return deployHash; + } else { + throw Error("Invalid Deploy"); + } + } + + public onEvent( + eventNames: RouterEvents[], + callback: ( + eventName: RouterEvents, + deployStatus: { + deployHash: string; + success: boolean; + error: string | null; + }, + result: any | null + ) => void + ): any { + if (!this.eventStreamAddress) { + throw Error("Please set eventStreamAddress before!"); + } + if (this.isListening) { + throw Error( + "Only one event listener can be create at a time. Remove the previous one and start new." + ); + } + const es = new EventStream(this.eventStreamAddress); + this.isListening = true; + + es.subscribe(EventName.DeployProcessed, (value: any) => { + const deployHash = value.body.DeployProcessed.deploy_hash; + + const pendingDeploy = this.pendingDeploys.find( + (pending) => pending.deployHash === deployHash + ); + + if (!pendingDeploy) { + return; + } + + if ( + !value.body.DeployProcessed.execution_result.Success && + value.body.DeployProcessed.execution_result.Failure + ) { + callback( + pendingDeploy.deployType, + { + deployHash, + error: + value.body.DeployProcessed.execution_result.Failure.error_message, + success: false, + }, + null + ); + } else { + const { transforms } = + value.body.DeployProcessed.execution_result.Success.effect; + + const cep47Events = transforms.reduce((acc: any, val: any) => { + if ( + val.transform.hasOwnProperty("WriteCLValue") && + typeof val.transform.WriteCLValue.parsed === "object" && + val.transform.WriteCLValue.parsed !== null + ) { + const maybeCLValue = CLValueParsers.fromJSON( + val.transform.WriteCLValue + ); + const clValue = maybeCLValue.unwrap(); + if (clValue && clValue instanceof CLMap) { + const hash = clValue.get( + CLValueBuilder.string("contract_package_hash") + ); + const event = clValue.get(CLValueBuilder.string("event_type")); + if ( + hash && + // NOTE: Calling toLowerCase() because current JS-SDK doesn't support checksumed hashes and returns all lower case value + // Remove it after updating SDK + hash.value() === this.contractPackageHash.toLowerCase() && + event && + eventNames.includes(event.value()) + ) { + acc = [...acc, { name: event.value(), clValue }]; + } + } + } + return acc; + }, []); + + cep47Events.forEach((d: any) => + callback( + d.name, + { deployHash, error: null, success: true }, + d.clValue + ) + ); + } + + this.pendingDeploys = this.pendingDeploys.filter( + (pending) => pending.deployHash !== deployHash + ); + }); + es.start(); + + return { + stopListening: () => { + es.unsubscribe(EventName.DeployProcessed); + es.stop(); + this.isListening = false; + this.pendingDeploys = []; + }, + }; + } + + private addPendingDeploy(deployType: RouterEvents, deployHash: string) { + this.pendingDeploys = [...this.pendingDeploys, { deployHash, deployType }]; + } + + public async registerWebHook(backendLink: String, endpointLink: String) { + let axiosStatus; + await axios({ + method: "post", + url: "https://createpairapi.herokuapp.com/register", + data: { + backendLink: backendLink, + endpointLink: endpointLink, + }, + }) + .then(function (response: any) { + console.log("Data : " + JSON.stringify(response.data)); + console.log("Status : " + response.status); + console.log("Status Text : " + response.statusText); + console.log("Header : " + response.headers); + // console.log(response.config); + axiosStatus = true; + }) + .catch(function (error: any) { + console.log(error); + axiosStatus = false; + }); + + return axiosStatus; + } + + public async CreatePairApi( + factorycontracthash: String, + flashswappercontractash: String + ) { + let axiosStatus; + await axios({ + method: "post", + url: "https://createpairapi.herokuapp.com/deployPairContract", + data: { + factoryContractHash: factorycontracthash, + flashswapperContractHash: flashswappercontractash, + }, + }) + .then(function (response: any) { + console.log("Data : " + JSON.stringify(response.data)); + console.log("Status : " + response.status); + console.log("Status Text : " + response.statusText); + console.log("Header : " + response.headers); + // console.log(response.config); + axiosStatus = true; + }) + .catch(function (error: any) { + console.log(error); + axiosStatus = false; + }); + + return axiosStatus; + } +} + +interface IInstallParams { + nodeAddress: string; + keys: Keys.AsymmetricKey; + chainName: string; + pathToContract: string; + runtimeArgs: RuntimeArgs; + paymentAmount: string; +} + +const installWasmFile = async ({ + nodeAddress, + keys, + chainName, + pathToContract, + runtimeArgs, + paymentAmount, +}: IInstallParams): Promise => { + const client = new CasperClient(nodeAddress); + + // Set contract installation deploy (unsigned). + let deploy = DeployUtil.makeDeploy( + new DeployUtil.DeployParams( + CLPublicKey.fromHex(keys.publicKey.toHex()), + chainName + ), + DeployUtil.ExecutableDeployItem.newModuleBytes( + utils.getBinary(pathToContract), + runtimeArgs + ), + DeployUtil.standardPayment(paymentAmount) + ); + + // Sign deploy. + deploy = client.signDeploy(deploy, keys); + + // Dispatch deploy to node. + return await client.putDeploy(deploy); +}; + +interface IContractCallParams { + nodeAddress: string; + keys: Keys.AsymmetricKey; + chainName: string; + entryPoint: string; + runtimeArgs: RuntimeArgs; + paymentAmount: string; + contractHash: string; +} + +const contractCall = async ({ + nodeAddress, + keys, + chainName, + contractHash, + entryPoint, + runtimeArgs, + paymentAmount, +}: IContractCallParams) => { + const client = new CasperClient(nodeAddress); + const contractHashAsByteArray = utils.contractHashToByteArray(contractHash); + + let deploy = DeployUtil.makeDeploy( + new DeployUtil.DeployParams(keys.publicKey, chainName), + DeployUtil.ExecutableDeployItem.newStoredContractByHash( + contractHashAsByteArray, + entryPoint, + runtimeArgs + ), + DeployUtil.standardPayment(paymentAmount) + ); + + // Sign deploy. + deploy = client.signDeploy(deploy, keys); + + // Dispatch deploy to node. + const deployHash = await client.putDeploy(deploy); + + return deployHash; +}; + +const contractSimpleGetter = async ( + nodeAddress: string, + contractHash: string, + key: string[] +) => { + const stateRootHash = await utils.getStateRootHash(nodeAddress); + const clValue = await utils.getContractData( + nodeAddress, + stateRootHash, + contractHash, + key + ); + + if (clValue && clValue.CLValue instanceof CLValue) { + return clValue.CLValue!; + } else { + throw Error("Invalid stored value"); + } +}; + +const toCLMap = (map: Map) => { + const clMap = CLValueBuilder.map([ + CLTypeBuilder.string(), + CLTypeBuilder.string(), + ]); + for (const [key, value] of Array.from(map.entries())) { + clMap.set(CLValueBuilder.string(key), CLValueBuilder.string(value)); + } + return clMap; +}; + +const fromCLMap = (map: Map) => { + const jsMap = new Map(); + for (const [key, value] of Array.from(map.entries())) { + jsMap.set(key.value(), value.value()); + } + return jsMap; +}; + +export default UniswapRouterClient; diff --git a/JsClients/ROUTER/src/utils.ts b/JsClients/ROUTER/src/utils.ts new file mode 100644 index 00000000..909a7d64 --- /dev/null +++ b/JsClients/ROUTER/src/utils.ts @@ -0,0 +1,125 @@ +import { + CasperServiceByJsonRPC, + CLValue, + CLKey, + CLAccountHash, + Keys, + CLPublicKey, +} from "casper-js-sdk"; +import fs from "fs"; + +import { RecipientType } from "./types"; + +export const camelCased = (myString: string) => + myString.replace(/_([a-z])/g, (g) => g[1].toUpperCase()); + +export const createRecipientAddress = (recipient: RecipientType): CLKey => { + if (recipient instanceof CLPublicKey) { + return new CLKey(new CLAccountHash(recipient.toAccountHash())); + } else { + return new CLKey(recipient); + } +}; + +/** + * Returns an ECC key pair mapped to an NCTL faucet account. + * @param pathToFaucet - Path to NCTL faucet directory. + */ +export const getKeyPairOfContract = (pathToFaucet: string) => + Keys.Ed25519.parseKeyFiles( + `${pathToFaucet}/public_key.pem`, + `${pathToFaucet}/secret_key.pem` + ); + +/** + * Returns a binary as u8 array. + * @param pathToBinary - Path to binary file to be loaded into memory. + * @return Uint8Array Byte array. + */ +export const getBinary = (pathToBinary: string) => { + return new Uint8Array(fs.readFileSync(pathToBinary, null).buffer); +}; + +/** + * Returns global state root hash at current block. + * @param {Object} client - JS SDK client for interacting with a node. + * @return {String} Root hash of global state at most recent block. + */ +export const getStateRootHash = async (nodeAddress: string) => { + const client = new CasperServiceByJsonRPC(nodeAddress); + const { block } = await client.getLatestBlockInfo(); + if (block) { + return block.header.state_root_hash; + } else { + throw Error("Problem when calling getLatestBlockInfo"); + } +}; + +export const getAccountInfo = async ( + nodeAddress: string, + publicKey: CLPublicKey +) => { + const stateRootHash = await getStateRootHash(nodeAddress); + const client = new CasperServiceByJsonRPC(nodeAddress); + const accountHash = publicKey.toAccountHashStr(); + const blockState = await client.getBlockState(stateRootHash, accountHash, []); + return blockState.Account; +}; + +/** + * Returns a value under an on-chain account's storage. + * @param accountInfo - On-chain account's info. + * @param namedKey - A named key associated with an on-chain account. + */ +export const getAccountNamedKeyValue = (accountInfo: any, namedKey: string) => { + const found = accountInfo.namedKeys.find((i: any) => i.name === namedKey); + if (found) { + return found.key; + } + return undefined; +}; + +export const getContractData = async ( + nodeAddress: string, + stateRootHash: string, + contractHash: string, + path: string[] = [] +) => { + const client = new CasperServiceByJsonRPC(nodeAddress); + const blockState = await client.getBlockState( + stateRootHash, + `hash-${contractHash}`, + path + ); + return blockState; +}; + +export const contractDictionaryGetter = async ( + nodeAddress: string, + dictionaryItemKey: string, + seedUref: string, +) => { + const stateRootHash = await getStateRootHash(nodeAddress); + + const client = new CasperServiceByJsonRPC(nodeAddress); + + const storedValue = await client.getDictionaryItemByURef( + stateRootHash, + dictionaryItemKey, + seedUref + ); + + if (storedValue && storedValue.CLValue instanceof CLValue) { + return storedValue.CLValue!; + } else { + throw Error("Invalid stored value"); + } +}; + + +export const contractHashToByteArray = (contractHash: string) => + Uint8Array.from(Buffer.from(contractHash, "hex")); + +export const sleep = (num: number) => { + return new Promise((resolve) => setTimeout(resolve, num)); +}; diff --git a/JsClients/ROUTER/test/install.ts b/JsClients/ROUTER/test/install.ts new file mode 100644 index 00000000..6db58e63 --- /dev/null +++ b/JsClients/ROUTER/test/install.ts @@ -0,0 +1,94 @@ +import { config } from "dotenv"; +config(); +import { UniswapRouterClient, utils, constants } from "../src"; +import { parseTokenMeta, sleep, getDeploy } from "./utils"; + +import { + CLValueBuilder, + Keys, + CLPublicKey, + CLPublicKeyType, +} from "casper-js-sdk"; + +const { + NODE_ADDRESS, + EVENT_STREAM_ADDRESS, + CHAIN_NAME, + WASM_PATH, + MASTER_KEY_PAIR_PATH, + TOKEN_NAME, + TOKEN_SYMBOL, + FACTORY, + WCSPR, + LIBRARY, + CONTRACT_NAME, + CONTRACT_HASH, + INSTALL_PAYMENT_AMOUNT, + MINT_ONE_PAYMENT_AMOUNT, + MINT_COPIES_PAYMENT_AMOUNT, + BURN_ONE_PAYMENT_AMOUNT, + MINT_ONE_META_SIZE, + MINT_COPIES_META_SIZE, + MINT_COPIES_COUNT, + MINT_MANY_META_SIZE, + MINT_MANY_META_COUNT, + + // LIQUIDITY + TOKEN_A, + TOKEN_B, + AMOUNT_A_DESIRED, + AMOUNT_B_DESIRED, + AMOUNT_A_MIN, + AMOUNT_B_MIN, + TO, + DEADLINE +} = process.env; + +const KEYS = Keys.Ed25519.parseKeyFiles( + `${MASTER_KEY_PAIR_PATH}public_key.pem`, + `${MASTER_KEY_PAIR_PATH}secret_key.pem` +); + +const test = async () => { + + const uniswapRouter = new UniswapRouterClient( + NODE_ADDRESS!, + CHAIN_NAME!, + EVENT_STREAM_ADDRESS! + ); + + const installDeployHash = await uniswapRouter.install( + KEYS, + FACTORY!, + WCSPR!, + LIBRARY!, + 'UniSwapRouter', + INSTALL_PAYMENT_AMOUNT!, + WASM_PATH! + ); + + console.log("Passed Parameters: \nfactory: \t", FACTORY, + "\nwcspr: \t", WCSPR, + "\nlibrary: \t", LIBRARY, + "\ncontract_name: \t", CONTRACT_NAME, "\n"); + + console.log(`... Contract installation deployHash: ${installDeployHash}\n`); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + + console.log(`... Contract installed successfully.`); + + + let accountInfo = await utils.getAccountInfo(NODE_ADDRESS!, KEYS.publicKey); + console.log(`... Account Info: `); + console.log(JSON.stringify(accountInfo, null, 2)); + + const contractHash = await utils.getAccountNamedKeyValue( + accountInfo, + `${TOKEN_NAME!}_contract` + ); + + console.log(`... Contract Hash: ${contractHash}`); +}; + +//test(); diff --git a/JsClients/ROUTER/test/installed.ts b/JsClients/ROUTER/test/installed.ts new file mode 100644 index 00000000..632ea407 --- /dev/null +++ b/JsClients/ROUTER/test/installed.ts @@ -0,0 +1,789 @@ +import { config } from "dotenv"; +config(); +import { UniswapRouterClient, utils, constants } from "../src"; +import { parseTokenMeta, sleep, getDeploy } from "./utils"; +import { request } from 'graphql-request'; + +import { + CLValueBuilder, + Keys, + CLPublicKey, + CLAccountHash, + CLPublicKeyType, +} from "casper-js-sdk"; + +const { RouterEvents } = constants; + +const { + NODE_ADDRESS, + EVENT_STREAM_ADDRESS, + CHAIN_NAME, + WASM_PATH, + MASTER_KEY_PAIR_PATH, + TOKEN_NAME, + TOKEN_SYMBOL, + FACTORY, + WCSPR, + LIBRARY, + CONTRACT_NAME, + CONTRACT_HASH, + INSTALL_PAYMENT_AMOUNT, + + TO, + DEADLINE, + + // add_liquidity + TOKEN_A, + TOKEN_B, + AMOUNT_A_DESIRED, + AMOUNT_B_DESIRED, + AMOUNT_A_MIN, + AMOUNT_B_MIN, + + // add_liquidity_cspr + TOKEN, + AMOUNT_TOKEN_DESIRED, + AMOUNT_CSPR_DESIRED, + AMOUNT_TOKEN_MIN, + AMOUNT_CSPR_MIN, + + // remove_liquidity + RL_TOKEN_A, + RL_TOKEN_B, + RL_LIQUIDITY, + RL_AMOUNT_A_MIN, + RL_AMOUNT_B_MIN, + RL_TO, + + // remove_liquidity_cspr + RLC_TOKEN, + RLC_LIQUIDITY, + RLC_AMOUNT_TOKEN_MIN, + RLC_AMOUNT_CSPR_MIN, + RLC_TO, + + // remove_liquidity_with_permit + RLWP_TOKEN_A, + RLWP_TOKEN_B, + RLWP_LIQUIDITY, + RLWP_AMOUNT_A_MIN, + RLWP_AMOUNT_B_MIN, + RLWP_TO, + RLWP_APPROVE_MAX, + RLWP_V, + RLWP_R, + RLWP_S, + + // remove_liquidity_cspr_with_permit + RLCWP_TOKEN, + RLCWP_LIQUIDITY, + RLCWP_AMOUNT_TOKEN_MIN, + RLCWP_AMOUNT_CSPR_MIN, + RLCWP_TO, + RLCWP_APPROVE_MAX, + RLCWP_V, + RLCWP_R, + RLCWP_S, + + // swap_exact_token_for_token + SETFT_AMOUNT_IN, + SETFT_AMOUNT_OUT_MIN, + SETFT_PATH, + SETFT_TO, + + // swap_tokens_for_exact_tokens + STFET_AMOUNT_OUT, + STFET_AMOUNT_IN_MAX, + STFET_PATH, + STFET_TO, + + // swap_exact_cspr_for_tokens + SECFT_AMOUNT_OUT_MIN, + SECFT_AMOUNT_IN, + SECFT_PATH, + SECFT_TO, + + // swap_tokens_for_exact_cspr + STFEC_AMOUNT_OUT, + STFEC_AMOUNT_IN_MAX, + STFEC_PATH, + STFEC_TO, + + // swap_exact_tokens_for_cspr + SETFC_AMOUNT_IN, + SETFC_AMOUNT_OUT_MIN, + SETFC_PATH, + SETFC_TO, + + // swap_cspr_for_exact_tokens + SCFET_AMOUNT_OUT, + SCFET_AMOUNT_IN_MAX, + SCFET_PATH, + SCFET_TO, + + GRAPHQL +} = process.env; + +const KEYS = Keys.Ed25519.parseKeyFiles( + `${MASTER_KEY_PAIR_PATH}public_key.pem`, + `${MASTER_KEY_PAIR_PATH}secret_key.pem` +); + +const swap_cspr_for_exact_tokens_test = async ( + UniswapRouter: UniswapRouterClient +) => { + let paths: string[] = SCFET_PATH!.split(","); + + return await UniswapRouter.swap_cspr_for_exact_tokens( + KEYS, + SCFET_AMOUNT_OUT!, + SCFET_AMOUNT_IN_MAX!, + paths, + SCFET_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const swap_exact_tokens_for_cspr_test = async ( + UniswapRouter: UniswapRouterClient +) => { + let paths: string[] = SETFC_PATH!.split(","); + return await UniswapRouter.swap_exact_tokens_for_cspr( + KEYS, + SETFC_AMOUNT_IN!, + SETFC_AMOUNT_OUT_MIN!, + paths, + SETFC_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const swap_tokens_for_exact_cspr_test = async ( + UniswapRouter: UniswapRouterClient +) => { + let paths: string[] = STFEC_PATH!.split(","); + return await UniswapRouter.swap_tokens_for_exact_cspr( + KEYS, + STFEC_AMOUNT_OUT!, + STFEC_AMOUNT_IN_MAX!, + paths, + STFEC_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const swap_exact_cspr_for_tokens_test = async ( + UniswapRouter: UniswapRouterClient +) => { + let paths: string[] = SECFT_PATH!.split(","); + return await UniswapRouter.swap_exact_cspr_for_tokens( + KEYS, + SECFT_AMOUNT_OUT_MIN!, + SECFT_AMOUNT_IN!, + paths, + SECFT_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const swap_tokens_for_exact_tokens_test = async ( + UniswapRouter: UniswapRouterClient +) => { + let paths: string[] = STFET_PATH!.split(","); + return await UniswapRouter.swap_tokens_for_exact_tokens( + KEYS, + STFET_AMOUNT_OUT!, + STFET_AMOUNT_IN_MAX!, + paths, + STFET_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const swap_exact_tokens_for_tokens_test = async ( + UniswapRouter: UniswapRouterClient +) => { + let paths: string[] = SETFT_PATH!.split(","); + + return await UniswapRouter.swap_exact_tokens_for_tokens( + KEYS, + SETFT_AMOUNT_IN!, + SETFT_AMOUNT_OUT_MIN!, + paths, + SETFT_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const remove_liquidity_cspr_with_permit_test = async ( + UniswapRouter: UniswapRouterClient +) => { + let approve_max: boolean = RLWP_APPROVE_MAX! == "true"; + + return await UniswapRouter.remove_liquidity_cspr_with_permit( + KEYS, + RLCWP_TOKEN!, + RLCWP_LIQUIDITY!, + RLCWP_AMOUNT_TOKEN_MIN!, + RLCWP_AMOUNT_CSPR_MIN!, + RLCWP_TO!, + DEADLINE!, + approve_max, + RLCWP_V!, + RLCWP_R!, + RLCWP_S!, + INSTALL_PAYMENT_AMOUNT! + ); +}; +const remove_liquidity_with_permit_test = async ( + uniswapRouter: UniswapRouterClient +) => { + let approve_max: boolean = RLWP_APPROVE_MAX! == "true"; + + return await uniswapRouter.remove_liquidity_with_permit( + KEYS, + RLWP_TOKEN_A!, + RLWP_TOKEN_B!, + RLWP_LIQUIDITY!, + RLWP_AMOUNT_A_MIN!, + RLWP_AMOUNT_B_MIN!, + RLWP_TO!, + DEADLINE!, + approve_max, + RLWP_V!, + RLWP_R!, + RLWP_S!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const add_liquidity_test = async (uniswapRouter: UniswapRouterClient) => { + return await uniswapRouter.add_liquidity( + KEYS, + TOKEN_A!, + TOKEN_B!, + AMOUNT_A_DESIRED!, + AMOUNT_B_DESIRED!, + AMOUNT_A_MIN!, + AMOUNT_B_MIN!, + TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const add_liquidity_cspr_test = async (uniswapRouter: UniswapRouterClient) => { + return await uniswapRouter.add_liquidity_cspr( + KEYS, + TOKEN!, + AMOUNT_TOKEN_DESIRED!, + AMOUNT_CSPR_DESIRED!, + AMOUNT_TOKEN_MIN!, + AMOUNT_CSPR_MIN!, + TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const remove_liquidity_test = async (uniswapRouter: UniswapRouterClient) => { + return await uniswapRouter.remove_liquidity( + KEYS, + RL_TOKEN_A!, + RL_TOKEN_B!, + RL_LIQUIDITY!, + RL_AMOUNT_A_MIN!, + RL_AMOUNT_B_MIN!, + RL_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; +const remove_liquidity_cspr_test = async ( + uniswapRouter: UniswapRouterClient +) => { + return await uniswapRouter.remove_liquidity_cspr( + KEYS, + RLC_TOKEN!, + RLC_LIQUIDITY!, + RLC_AMOUNT_TOKEN_MIN!, + RLC_AMOUNT_CSPR_MIN!, + RLC_TO!, + DEADLINE!, + INSTALL_PAYMENT_AMOUNT! + ); +}; + +const add_liquidity = async (uniswapRouter: UniswapRouterClient) => { + const installDeployHash = await add_liquidity_test(uniswapRouter); + console.log(`... add_liquidity deployHash: ${installDeployHash}\n`); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`add_liquidity function called successfully`); +}; + +const add_liquidity_cspr = async (uniswapRouter: UniswapRouterClient) => { + const installDeployHash = await add_liquidity_cspr_test(uniswapRouter); + console.log(`... add_liquidity_cspr deployHash: ${installDeployHash}\n`); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`add_liquidity_cspr function called successfully`); +}; + +const remove_liquidity = async (uniswapRouter: UniswapRouterClient) => { + const installDeployHash = await remove_liquidity_test(uniswapRouter); + console.log(`... remove_liquidity deployHash: ${installDeployHash}\n`); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`remove_liquidity function called successfully`); +}; + +const remove_liquidity_cspr = async (uniswapRouter: UniswapRouterClient) => { + const installDeployHash = await remove_liquidity_cspr_test(uniswapRouter); + console.log(`... remove_liquidity_cspr deployHash: ${installDeployHash}\n`); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`remove_liquidity_cspr function called successfully`); +}; + +const remove_liquidity_with_permit = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await remove_liquidity_with_permit_test( + uniswapRouter + ); + console.log( + `... remove_liquidity_with_permit deployHash: ${installDeployHash}\n` + ); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`remove_liquidity_with_permit function called successfully`); +}; + +const remove_liquidity_cspr_with_permit = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await remove_liquidity_cspr_with_permit_test( + uniswapRouter + ); + console.log( + `... remove_liquidity_cspr_with_permit deployHash: ${installDeployHash}\n` + ); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`remove_liquidity_cspr_with_permit function called successfully`); +}; + +const swap_exact_tokens_for_tokens = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await swap_exact_tokens_for_tokens_test( + uniswapRouter + ); + console.log( + `... swap_exact_tokens_for_tokens deployHash: ${installDeployHash}\n` + ); + + await sleep(7 * 1000); + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`swap_exact_tokens_for_tokens function called successfully`); +}; + +const swap_tokens_for_exact_tokens = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await swap_tokens_for_exact_tokens_test( + uniswapRouter + ); + console.log( + `... swap_tokens_for_exact_tokens deployHash: ${installDeployHash}\n` + ); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`swap_tokens_for_exact_tokens function called successfully`); +}; + +const swap_exact_cspr_for_tokens = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await swap_exact_cspr_for_tokens_test( + uniswapRouter + ); + console.log( + `... swap_exact_cspr_for_tokens deployHash: ${installDeployHash}\n` + ); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`swap_exact_cspr_for_tokens function called successfully`); +}; + +const swap_tokens_for_exact_cspr = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await swap_tokens_for_exact_cspr_test( + uniswapRouter + ); + console.log( + `... swap_tokens_for_exact_cspr deployHash: ${installDeployHash}\n` + ); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`swap_tokens_for_exact_cspr function called successfully`); +}; + +const swap_exact_tokens_for_cspr = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await swap_exact_tokens_for_cspr_test( + uniswapRouter + ); + console.log( + `... swap_exact_tokens_for_cspr deployHash: ${installDeployHash}\n` + ); + + await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`swap_exact_tokens_for_cspr function called successfully`); +}; + +const swap_cspr_for_exact_tokens = async ( + uniswapRouter: UniswapRouterClient +) => { + const installDeployHash = await swap_cspr_for_exact_tokens_test( + uniswapRouter + ); + console.log( + `... swap_cspr_for_exact_tokens deployHash: ${installDeployHash}\n` + ); + + // await sleep(7 * 1000); + // await getDeploy(NODE_ADDRESS!, installDeployHash); + console.log(`swap_cspr_for_exact_tokens function called successfully`); +}; + +function splitdata(data:string) +{ + var temp=data.split('('); + var result=temp[1].split(')'); + return result[0]; +} + +const test = async () => { + const uniswapRouter = new UniswapRouterClient( + NODE_ADDRESS!, + CHAIN_NAME!, + EVENT_STREAM_ADDRESS! + ); + + const listener = uniswapRouter.onEvent( + [ + RouterEvents.PairCreated, + RouterEvents.Transfer, + RouterEvents.Approval, + RouterEvents.Mint, + RouterEvents.Burn, + RouterEvents.Sync, + RouterEvents.Swap + ], + async (eventName, deploy, result) => { + if (deploy.success) { + console.log(`Successfull deploy of: ${eventName}, deployHash: ${deploy.deployHash}`); + const [timestamp,block_hash]= await getDeploy(NODE_ADDRESS!, deploy.deployHash); + console.log("... Deployhash: ", deploy.deployHash); + console.log("... Timestamp: ", timestamp); + console.log("... Block hash: ", block_hash); + console.log("result.value(): ",result.value()); + let newData = JSON.parse(JSON.stringify(result.value())); + + if(eventName =="pair_created") + { + console.log(eventName+ " Event result: "); + console.log(newData[0][0].data + " = " + newData[0][1].data); + console.log(newData[1][0].data + " = " + newData[1][1].data); + console.log(newData[2][0].data + " = " + newData[2][1].data); + console.log(newData[3][0].data + " = " + newData[3][1].data); + console.log(newData[4][0].data + " = " + newData[4][1].data); + console.log(newData[5][0].data + " = " + newData[5][1].data); + + var allpairslength=parseInt(newData[0][1].data); + var pair=splitdata(newData[3][1].data); + var token0=splitdata(newData[4][1].data); + var token1=splitdata(newData[5][1].data); + + console.log("allpairslength: ", allpairslength); + console.log("pair splited: ", pair); + console.log("token0 splited: ", token0); + console.log("token1 splited: ", token1); + + request(GRAPHQL!, + `mutation handleNewPair( $token0: String!, $token1: String!, $pair: String!, $all_pairs_length: Int!, $timeStamp: String!, $blockHash: String!){ + handleNewPair( token0: $token0, token1: $token1, pair: $pair, all_pairs_length: $all_pairs_length, timeStamp: $timeStamp, blockHash: $blockHash) { + result + } + + }`, + {token0:token0, token1:token1, pair: pair, all_pairs_length: allpairslength, timeStamp:timestamp.toString(), blockHash:block_hash}) + .then(data => console.log(data)) + .catch(error => console.error(error)); + } + else if(eventName=="approve") + { + console.log(eventName+ " Event result: "); + console.log(newData[0][0].data + " = " + newData[0][1].data); + console.log(newData[1][0].data + " = " + newData[1][1].data); + console.log(newData[2][0].data + " = " + newData[2][1].data); + console.log(newData[3][0].data + " = " + newData[3][1].data); + console.log(newData[4][0].data + " = " + newData[4][1].data); + } + else if(eventName=="transfer") + { + console.log(eventName+ " Event result: "); + console.log(newData[0][0].data + " = " + newData[0][1].data); + console.log(newData[1][0].data + " = " + newData[1][1].data); + + console.log(newData[2][0].data + " = " + newData[2][1].data); + console.log(newData[3][0].data + " = " + newData[3][1].data); + console.log(newData[4][0].data + " = " + newData[4][1].data); + console.log(newData[5][0].data + " = " + newData[5][1].data); + + var from=splitdata(newData[2][1].data); + var to=splitdata(newData[4][1].data); + var value=parseInt(newData[5][1].data); + var pair=splitdata(newData[3][1].data); + + console.log("from: ", from); + console.log("to: ", to); + console.log("value: ",value); + console.log("pair: ", pair); + + request(GRAPHQL!, + `mutation handleTransfer( $from: String!, $to: String!, $value: Int!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ + handleTransfer( from: $from, to: $to, value: $value, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { + result + } + + }`, + {from:from, to: to, value: value, pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) + .then(data => console.log(data)) + .catch(error => console.error(error)); + } + else if (eventName=="mint") + { + + console.log(eventName+ " Event result: "); + console.log(newData[0][0].data + " = " + newData[0][1].data); + console.log(newData[1][0].data + " = " + newData[1][1].data); + console.log(newData[2][0].data + " = " + newData[2][1].data); + console.log(newData[3][0].data + " = " + newData[3][1].data); + console.log(newData[4][0].data + " = " + newData[4][1].data); + console.log(newData[5][0].data + " = " + newData[5][1].data); + + var amount0=parseInt(newData[0][1].data); + var amount1=parseInt(newData[1][1].data); + var pair=splitdata(newData[4][1].data); + var sender=splitdata(newData[5][1].data); + + console.log("amount0: ", amount0); + console.log("amount1: ", amount1); + console.log("pair: ",pair); + console.log("sender: ", sender); + + request(GRAPHQL!, + `mutation handleMint( $amount0: Int!, $amount1: Int!, $sender: String!,$logIndex: Int!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ + handleMint( amount0: $amount0, amount1: $amount1, sender: $sender, logIndex: $logIndex, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { + result + } + + }`, + {amount0:amount0, amount1: amount1, sender: sender,logIndex:0, pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) + .then(data => console.log(data)) + .catch(error => console.error(error)); + } + else if (eventName=="burn") + { + + console.log(eventName+ " Event result: "); + console.log(newData[0][0].data + " = " + newData[0][1].data); + console.log(newData[1][0].data + " = " + newData[1][1].data); + console.log(newData[2][0].data + " = " + newData[2][1].data); + console.log(newData[3][0].data + " = " + newData[3][1].data); + console.log(newData[4][0].data + " = " + newData[4][1].data); + console.log(newData[5][0].data + " = " + newData[5][1].data); + console.log(newData[6][0].data + " = " + newData[6][1].data); + + var amount0=parseInt(newData[0][1].data); + var amount1=parseInt(newData[1][1].data); + var pair=splitdata(newData[4][1].data); + var sender=splitdata(newData[5][1].data); + var to=splitdata(newData[6][1].data); + + console.log("amount0: ", amount0); + console.log("amount1: ", amount1); + console.log("pair: ",pair); + console.log("sender: ", sender); + console.log("to: ", to); + + request(GRAPHQL!, + `mutation handleBurn( $amount0: Int!, $amount1: Int!, $sender: String!,$logIndex: Int!,$to: String!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ + handleBurn( amount0: $amount0, amount1: $amount1, sender: $sender, logIndex: $logIndex, to:$to, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { + result + } + + }`, + {amount0:amount0, amount1: amount1, sender: sender,logIndex:0, to:to,pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) + .then(data => console.log(data)) + .catch(error => console.error(error)); + } + else if (eventName=="sync") + { + + console.log(eventName+ " Event result: "); + console.log(newData[0][0].data + " = " + newData[0][1].data); + console.log(newData[1][0].data + " = " + newData[1][1].data); + console.log(newData[2][0].data + " = " + newData[2][1].data); + console.log(newData[3][0].data + " = " + newData[3][1].data); + console.log(newData[4][0].data + " = " + newData[4][1].data); + + var reserve0=parseInt(newData[3][1].data); + var reserve1=parseInt(newData[4][1].data); + var pair=splitdata(newData[2][1].data); + + console.log("reserve0: ", reserve0); + console.log("reserve1: ", reserve1); + console.log("pair: ",pair); + + + request(GRAPHQL!, + `mutation handleSync( $reserve0: Int!, $reserve1: Int!, $pairAddress: String!){ + handleSync( reserve0: $reserve0, reserve1: $reserve1, pairAddress: $pairAddress) { + result + } + + }`, + {reserve0:reserve0, reserve1: reserve1, pairAddress: pair}) + .then(data => console.log(data)) + .catch(error => console.error(error)); + } + else if (eventName=="swap") + { + + console.log(eventName+ " Event result: "); + console.log(newData[0][0].data + " = " + newData[0][1].data); + console.log(newData[1][0].data + " = " + newData[1][1].data); + console.log(newData[2][0].data + " = " + newData[2][1].data); + console.log(newData[3][0].data + " = " + newData[3][1].data); + console.log(newData[4][0].data + " = " + newData[4][1].data); + console.log(newData[5][0].data + " = " + newData[5][1].data); + console.log(newData[6][0].data + " = " + newData[6][1].data); + console.log(newData[7][0].data + " = " + newData[7][1].data); + console.log(newData[8][0].data + " = " + newData[8][1].data); + console.log(newData[9][0].data + " = " + newData[9][1].data); + + var amount0In=parseInt(newData[0][1].data); + var amount1In=parseInt(newData[1][1].data); + var amount0Out=parseInt(newData[2][1].data); + var amount1Out=parseInt(newData[3][1].data); + var from=splitdata(newData[6][1].data); + var pair=splitdata(newData[7][1].data); + var sender=splitdata(newData[8][1].data); + var to=splitdata(newData[9][1].data); + + console.log("amount0In: ", amount0In); + console.log("amount1In: ", amount1In); + console.log("amount0Out: ", amount0Out); + console.log("amount1Out: ", amount1Out); + console.log("from: ",from); + console.log("pair: ",pair); + console.log("sender: ", sender); + console.log("to: ", to); + + request(GRAPHQL!, + `mutation handleSwap( $amount0In: Int!, $amount1In: Int!, $amount0Out: Int!, $amount1Out: Int!, $to: String!,$from: String!,$sender: String!,$logIndex: Int!, $pairAddress: String!, $deployHash: String!, $timeStamp: String!, $blockHash: String!){ + handleSwap( amount0In: $amount0In, amount1In: $amount1In, amount0Out: $amount0Out, amount1Out: $amount1Out, to:$to, from:$from,sender: $sender,logIndex: $logIndex, pairAddress: $pairAddress, deployHash: $deployHash, timeStamp: $timeStamp, blockHash: $blockHash) { + result + } + + }`, + {amount0In:amount0In, amount1In: amount1In,amount0Out:amount0Out, amount1Out: amount1Out,to:to,from:from, sender: sender,logIndex:0,pairAddress: pair, deployHash:deploy.deployHash,timeStamp:timestamp.toString(), blockHash:block_hash}) + .then(data => console.log(data)) + .catch(error => console.error(error)); + } + } else { + console.log( + `Failed deploy of ${eventName}, deployHash: ${deploy.deployHash}` + ); + console.log(`Error: ${deploy.error}`); + } + } + ); + // await sleep(5 * 1000); + + // let accountInfo = await utils.getAccountInfo(NODE_ADDRESS!, KEYS.publicKey); + + // console.log(`... Account Info: `); + // console.log(JSON.stringify(accountInfo, null, 2)); + + // const contractHash = await utils.getAccountNamedKeyValue( + // accountInfo, + // "UniSwapRouter_contract_hash" + // ); + + // console.log(`... Contract Hash: ${contractHash}`); + + // await uniswapRouter.setContractHash(contractHash.slice(5)); + + // Test add_liquidity + //add_liquidity(uniswapRouter); + + // Test add_liquidity_cspr + //add_liquidity_cspr(uniswapRouter); + + // Test remove_liquidity + // remove_liquidity(uniswapRouter); + + // Test remove_liquidity_cspr + //remove_liquidity_cspr(uniswapRouter); + + // Test remove_liquidity_with_permit + //remove_liquidity_with_permit(uniswapRouter); + + // Test remove_liquidity_cspr_with_permit + //remove_liquidity_cspr_with_permit(uniswapRouter); + + // Test swap_exact_tokens_for_tokens + //swap_exact_tokens_for_tokens(uniswapRouter); + + // Test swap_tokens_for_exact_tokens + //swap_tokens_for_exact_tokens(uniswapRouter); + + // Test swap_exact_cspr_for_tokens + //swap_exact_cspr_for_tokens(uniswapRouter); + + // Test swap_tokens_for_exact_cspr + //swap_tokens_for_exact_cspr(uniswapRouter); + + // Test swap_exact_tokens_for_cspr + //swap_exact_tokens_for_cspr(uniswapRouter); + + //Test swap_cspr_for_exact_tokens + // swap_cspr_for_exact_tokens(uniswapRouter); + + // let register = await uniswapRouter.registerWebHook( + // "http://localhost:5000/", + // "http://localhost:5000/mockserver" + // ); + // console.log(`... Register Endpoint: ${register}`); + + // let createPair = await uniswapRouter.CreatePairApi( + // "c9d0268ecea8c57ed456bf56e4fba4bf285a4588fd817832230b8fd86b71c30f", + // "fbfeda8b97f056f526f20c2fc2b486d9bdbfb3e46b9a164527e57c0c86e68612" + // ); + // console.log(`... Create Pair Endpoint: ${createPair}`); +}; + +//test(); diff --git a/JsClients/Events/test/utils.ts b/JsClients/ROUTER/test/utils.ts similarity index 87% rename from JsClients/Events/test/utils.ts rename to JsClients/ROUTER/test/utils.ts index b00e42d7..e4459989 100644 --- a/JsClients/Events/test/utils.ts +++ b/JsClients/ROUTER/test/utils.ts @@ -11,14 +11,13 @@ export const sleep = (ms: number) => { export const getDeploy = async (NODE_URL: string, deployHash: string) => { const client = new CasperClient(NODE_URL); - let i = 1000; + let i = 300; while (i != 0) { const [deploy, raw] = await client.getDeploy(deployHash); if (raw.execution_results.length !== 0){ // @ts-ignore if (raw.execution_results[0].result.Success) { - - return [deploy.header.timestamp,deploy.header.gasPrice,raw.execution_results[0].block_hash]; + return [deploy.header.timestamp,raw.execution_results[0].block_hash]; } else { // @ts-ignore throw Error("Contract execution: " + raw.execution_results[0].result.Failure.error_message); diff --git a/graphql/mutations.js b/graphql/mutations.js index b1fbfa41..b2c73cfd 100644 --- a/graphql/mutations.js +++ b/graphql/mutations.js @@ -54,8 +54,6 @@ const { var PairContract = require("../JsClients/PAIR/test/installed.ts"); -var ERC20Contract = require("../JsClients/Events/test/installed.ts"); - const { getEthPriceInUSD, findEthPerToken, @@ -63,38 +61,6 @@ const { getTrackedLiquidityUSD, } = require("./pricing"); -const handlelistener = { - type: responseType, - description: "Handle listener", - args: { - - event: { type: GraphQLString }, - contractHash: { type: GraphQLString }, - deployHash: { type: GraphQLString } - - }, - async resolve(parent, args, context) { - try { - - await ERC20Contract.addpendingDeploy(args.event,args.contractHash,args.deployHash); - - let response = await Response.findOne({ id: "1" }); - if(response=== null) - { - // create new response - response = new Response({ - id: "1", - result: true - }); - await response.save(); - } - return response; - } catch (error) { - throw new Error(error); - } - }, -}; - const handleNewPair = { type: responseType, description: "Handle New Pair", @@ -1080,7 +1046,6 @@ const handleSwap = { }; module.exports = { - handlelistener, handleNewPair, updateUniswapDayData, updatePairDayData, diff --git a/graphql/schema.js b/graphql/schema.js index ff81d772..72c0365d 100644 --- a/graphql/schema.js +++ b/graphql/schema.js @@ -52,7 +52,6 @@ const { // Import mutations const { - handlelistener, handleNewPair, handleTransfer, handleSync, @@ -119,7 +118,6 @@ const MutationType = new GraphQLObjectType({ name: "MutationType", description: "Mutations", fields: { - handlelistener, handleNewPair, handleTransfer, handleSync,