From f11df09fcde6ef806234510766c38f4a5857e9ed Mon Sep 17 00:00:00 2001 From: vignesha22 <82584664+vignesha22@users.noreply.github.com> Date: Mon, 4 Jul 2022 16:54:32 +0530 Subject: [PATCH] Added Create Stream Endpoint (#139) * added new endpoint for creating Stream on supertokens --- examples/package.json | 3 +- examples/src/17-superFluids-createStream.ts | 51 +++---------------- examples/src/18-cross-chain-quote.ts | 2 +- package-lock.json | 4 +- package.json | 2 +- src/sdk/dto/create-stream-payload.dto.ts | 19 +++++++ src/sdk/dto/index.ts | 1 + src/sdk/sdk.ts | 33 +++++++++++- src/sdk/transactions/classes/index.ts | 1 + .../classes/stream-transaction-payload.ts | 10 ++++ src/sdk/transactions/transactions.service.ts | 38 +++++++++++++- 11 files changed, 113 insertions(+), 51 deletions(-) create mode 100644 src/sdk/dto/create-stream-payload.dto.ts create mode 100644 src/sdk/transactions/classes/stream-transaction-payload.ts diff --git a/examples/package.json b/examples/package.json index ccbafb1a..f1186f1a 100644 --- a/examples/package.json +++ b/examples/package.json @@ -26,7 +26,6 @@ "18-cross-chain-quote": "../node_modules/.bin/ts-node ./src/18-cross-chain-quote.ts" }, "dependencies": { - "dotenv": "^16.0.1", - "@superfluid-finance/sdk-core": "0.4.2" + "dotenv": "16.0.1" } } diff --git a/examples/src/17-superFluids-createStream.ts b/examples/src/17-superFluids-createStream.ts index 0304cf48..b2043b78 100644 --- a/examples/src/17-superFluids-createStream.ts +++ b/examples/src/17-superFluids-createStream.ts @@ -1,5 +1,4 @@ -import { Framework } from "@superfluid-finance/sdk-core"; -import { ethers } from "ethers"; +import { utils } from "ethers"; import { NetworkNames, Sdk, EnvNames } from "../../src"; import { logger } from "./common"; @@ -11,51 +10,19 @@ async function main(): Promise { try { - const provider = new ethers.providers.JsonRpcProvider('https://api.avax-test.network/ext/bc/C/rpc') const sdk = new Sdk( SENDER_PRIVATE_KEY, { networkName: NetworkNames.Fuji, env: EnvNames.TestNets }, ); // sender wallet sdk instance - await sdk.computeContractAccount(); - const senderAddress = sdk.state.accountAddress; + await sdk.computeContractAccount(); - /* - ** Initialise SuperFluid SDK with chainid and provider - ** Make sure that the chainid is supported by SuperFluid - ** You can verify the supported networks available in https://docs.superfluid.finance/superfluid/developers/networks - */ - const sf = await Framework.create({ - chainId: 43113, - provider - }); - - // Get balance of Supertoken before streaming - const balance = await sf.query.listUserInteractedSuperTokens({account: sdk.state.accountAddress, token: superTokenAddress}); - logger.log("balance: ", balance); - - // Get Stream info - const flowInfo = await sf.cfaV1.getFlow({ - sender: senderAddress, + const txnData = await sdk.createStreamTransactionPayload({ + tokenAddress: superTokenAddress, receiver: receiverAddress, - superToken: superTokenAddress, - providerOrSigner: provider - }); - logger.log("flowInfo", flowInfo); - - // Check if there are any existing stream present from sender to receiver on the desired superToken - if(flowInfo && flowInfo.flowRate === '0') { - // Create Stream using SuperFluid SDK - const createFlowOperation = sf.cfaV1.createFlow({ - sender: senderAddress, - receiver: receiverAddress, - superToken: superTokenAddress, - flowRate: "100000000000" // Amount of tokens streamed per month(in wei) - }); - - // Get Transaction data using SuperFluid SDK - const txnData = await createFlowOperation.getPopulatedTransactionRequest(provider.getSigner(sdk.state.accountAddress)); - + amount: utils.parseEther('0.1') + }) + if (!txnData.error && txnData.data && txnData.to) { // Submit the Transaction data using Etherspot SDK await sdk.clearGatewayBatch(); await sdk.batchExecuteAccountTransaction({ @@ -65,10 +32,8 @@ async function main(): Promise { logger.log('estimated batch', await sdk.estimateGatewayBatch()); logger.log('submitted batch', await sdk.submitGatewayBatch()); } else { - logger.log("Cannot create stream as the stream is already active", null); + logger.log('Error:', txnData.error); } - - } catch (Err){ logger.log("Caught Error: ", Err); } diff --git a/examples/src/18-cross-chain-quote.ts b/examples/src/18-cross-chain-quote.ts index fd02575e..9b7af2f9 100644 --- a/examples/src/18-cross-chain-quote.ts +++ b/examples/src/18-cross-chain-quote.ts @@ -98,4 +98,4 @@ async function main(): Promise { main() .catch(logger.error) - .finally(() => process.exit()); + .finally(() => process.exit()); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9accb662..b32f70d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "etherspot", - "version": "1.33.8", + "version": "1.33.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "etherspot", - "version": "1.33.8", + "version": "1.33.9", "license": "MIT", "dependencies": { "@apollo/client": "3.4.0", diff --git a/package.json b/package.json index c9b9f0c8..50f96c3a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "etherspot", - "version": "1.33.8", + "version": "1.33.9", "description": "Etherspot SDK", "keywords": [ "ether", diff --git a/src/sdk/dto/create-stream-payload.dto.ts b/src/sdk/dto/create-stream-payload.dto.ts new file mode 100644 index 00000000..8d5013fc --- /dev/null +++ b/src/sdk/dto/create-stream-payload.dto.ts @@ -0,0 +1,19 @@ +import { IsOptional } from 'class-validator'; +import { BigNumber } from 'ethers'; +import { IsAddress, IsBigNumberish } from './validators'; + +export class CreateStreamTransactionPayloadDto { + @IsOptional() + @IsAddress() + account?: string = null; + + @IsAddress() + receiver: string; + + @IsAddress() + tokenAddress: string; + + @IsBigNumberish() + amount: BigNumber; + +} diff --git a/src/sdk/dto/index.ts b/src/sdk/dto/index.ts index dd81647c..8a39caf9 100644 --- a/src/sdk/dto/index.ts +++ b/src/sdk/dto/index.ts @@ -67,3 +67,4 @@ export * from './update-project.dto'; export * from './utils'; export * from './withdraw-p2p-payment-deposit.dto'; export * from './get-exchange-cross-chain-quote.dto'; +export * from './create-stream-payload.dto'; diff --git a/src/sdk/sdk.ts b/src/sdk/sdk.ts index 31ccc239..2085b895 100644 --- a/src/sdk/sdk.ts +++ b/src/sdk/sdk.ts @@ -99,6 +99,7 @@ import { IsEligibleForAirdropDto, GetCrossChainBridgeTokenListDto, GetP2PPaymentChannelsAdminDto, + CreateStreamTransactionPayloadDto, } from './dto'; import { ENSNode, ENSNodeStates, ENSRootNode, ENSService, parseENSName } from './ens'; import { Env, EnvNames } from './env'; @@ -145,7 +146,7 @@ import { } from './payments'; import { CurrentProject, Project, Projects, ProjectService } from './project'; import { Session, SessionService } from './session'; -import { Transactions, Transaction, TransactionsService, NftList } from './transactions'; +import { Transactions, Transaction, TransactionsService, NftList, StreamTransactionPayload } from './transactions'; import { State, StateService } from './state'; import { WalletService, isWalletProvider, WalletProviderLike } from './wallet'; @@ -2123,6 +2124,36 @@ export class Sdk { ); } + /** + * returns transaction payload for creating stream of supertoken + * @param dto + * @return Promise + */ + + async createStreamTransactionPayload(dto: CreateStreamTransactionPayloadDto): Promise { + const { tokenAddress, receiver, amount, account } = await validateDto( + dto, + CreateStreamTransactionPayloadDto, + { + addressKeys: ['tokenAddress', 'receiver', 'account'], + }, + ); + + await this.require({ + session: true, + wallet: !account, + contractAccount: true, + }); + + return this.services.transactionsService.createStreamTransactionPayload( + this.prepareAccountAddress(account), + receiver, + BigNumber.from(amount), + tokenAddress + ); + + } + // utils /** diff --git a/src/sdk/transactions/classes/index.ts b/src/sdk/transactions/classes/index.ts index 7bc86745..40c2ff6e 100644 --- a/src/sdk/transactions/classes/index.ts +++ b/src/sdk/transactions/classes/index.ts @@ -10,3 +10,4 @@ export * from './transaction-data'; export * from './transaction-log'; export * from './transaction-log-decoded'; export * from './transactions'; +export * from './stream-transaction-payload'; diff --git a/src/sdk/transactions/classes/stream-transaction-payload.ts b/src/sdk/transactions/classes/stream-transaction-payload.ts new file mode 100644 index 00000000..f5c58cd2 --- /dev/null +++ b/src/sdk/transactions/classes/stream-transaction-payload.ts @@ -0,0 +1,10 @@ +import { BaseClass } from '../../common'; + +export class StreamTransactionPayload extends BaseClass { + error: string; + + data: string; + + to: string; + +} \ No newline at end of file diff --git a/src/sdk/transactions/transactions.service.ts b/src/sdk/transactions/transactions.service.ts index 02811647..f68631f6 100644 --- a/src/sdk/transactions/transactions.service.ts +++ b/src/sdk/transactions/transactions.service.ts @@ -1,6 +1,7 @@ import { gql } from '@apollo/client/core'; +import { BigNumber } from 'ethers'; import { Service } from '../common'; -import { NftList, Transaction, Transactions } from './classes'; +import { NftList, StreamTransactionPayload, Transaction, Transactions } from './classes'; export class TransactionsService extends Service { async getTransaction(hash: string): Promise { @@ -140,4 +141,39 @@ export class TransactionsService extends Service { return result; } + + async createStreamTransactionPayload( + account: string, + receiver: string, + amount: BigNumber, + tokenAddress: string, + ): Promise { + const { apiService } = this.services; + + const { result } = await apiService.query<{ + result: StreamTransactionPayload; + }>( + gql` + query($account: String!, $receiver: String!, $amount: BigNumber!, $tokenAddress: String!, $chainId: Int!) { + result: streamTransactionPayload(account: $account, receiver: $receiver, amount: $amount, tokenAddress: $tokenAddress, chainId: $chainId) { + data + to + error + } + } + `, + { + variables: { + account, + receiver, + amount, + tokenAddress + }, + models: { + result: StreamTransactionPayload, + }, + }, + ); + return result; + } }