From de7590cd324525797a6640f859bbf9df9f6d94a9 Mon Sep 17 00:00:00 2001 From: jackkru69 Date: Tue, 31 Oct 2023 13:54:19 +0300 Subject: [PATCH 1/3] wip --- packages/tssdk/src/helpers/network.enum.ts | 1 + packages/tssdk/src/libs/network/network.ts | 33 +++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/tssdk/src/helpers/network.enum.ts b/packages/tssdk/src/helpers/network.enum.ts index 9d45349..3cc5d1d 100644 --- a/packages/tssdk/src/helpers/network.enum.ts +++ b/packages/tssdk/src/helpers/network.enum.ts @@ -7,6 +7,7 @@ export enum ChainAction { GET_WALLET = 'GET_WALLET', GET_NODE_SETTINGS = 'GET_NODE_SETTINGS', CREATE_TRANSACTION = 'CREATE_TRANSACTION', + EXECUTE_CALL = 'EXECUTE_CALL', GET_MY_CHAIN = 'GET_MY_CHAIN', GET_SC_CODE = 'GET_SC_CODE', GET_SC_STATE = 'GET_SC_STATE', diff --git a/packages/tssdk/src/libs/network/network.ts b/packages/tssdk/src/libs/network/network.ts index f754464..d6dfb75 100755 --- a/packages/tssdk/src/libs/network/network.ts +++ b/packages/tssdk/src/libs/network/network.ts @@ -1,6 +1,8 @@ import axios from 'axios'; import createHash from 'create-hash'; import Debug from 'debug'; +import { defaultAbiCoder as AbiCoder } from '@ethersproject/abi'; +import { getAbiInputsOutputsType } from '../../helpers/abi.helper'; import { config as cfg } from '../../config/chain.config'; import { ChainGlobalConfig, ChainNode } from '../../typings'; import { queueNodes, transformNodeList, transformResponse } from '../../helpers/network.helper'; @@ -258,7 +260,7 @@ export class NetworkApi { private incrementNodeIndex = async () => { this.nodeIndex += 1; if (this.nodeIndex >= this.currentNodes.length || this.currentNodes[this.nodeIndex].time === cfg.maxNodeResponseTime) { - this.currentNodes = await queueNodes(this.currentNodes); + this.currentNodes = await queueNodes(this.currentNodes, 5000); this.nodeIndex = 0; if (this.nodeIndex >= this.currentNodes.length || this.currentNodes[this.nodeIndex].time === cfg.maxNodeResponseTime) { @@ -335,6 +337,29 @@ export class NetworkApi { return this.askBlockchainTo(ChainAction.CREATE_TRANSACTION, { data }); } + public async executeCall(address: string, method: string, args: any[], abi: any) { + const io = getAbiInputsOutputsType(abi, method); + + const data = { call: `${method}(${io.inputs.join(',')})`, args, to: address }; + + const response = await this.askBlockchainTo(ChainAction.EXECUTE_CALL, { data }); + + if (response.result !== 'return') throw new Error(`${response.result}: ${response?.signature}`); + + const results = AbiCoder.decode(io.outputs, response.bin); + + let returnValue: any = results; + + if (io.outputNames.length === results.length) { + returnValue = results.reduce((aggr, item, key) => { + aggr[io.outputNames[key]] = item; + return aggr; + }, {}); + } + + return results.length === 1 ? results[0] : returnValue; + } + public async getTransactionStatus(txId: string) { return this.askBlockchainTo(ChainAction.GET_TRANSACTION_STATUS, { txId }); } @@ -374,6 +399,12 @@ export class NetworkApi { requestParams.data = parameters.data; break; + case ChainAction.EXECUTE_CALL: + actionUrl = '/execute/call'; + requestParams.method = 'post'; + requestParams.data = parameters.data; + break; + case ChainAction.GET_TRANSACTION_STATUS: actionUrl = '/tx/status'; requestParams.url = parameters.txId; From 7dd0a27adfae768294e3ae414c0ba006c964c2b1 Mon Sep 17 00:00:00 2001 From: jackkru69 Date: Wed, 1 Nov 2023 15:44:11 +0300 Subject: [PATCH 2/3] added encoded inputs, deleted clid in getRegisterTxBody --- packages/tssdk/src/libs/network/network.ts | 6 ++++-- packages/tssdk/src/libs/transactions.ts | 8 +------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/tssdk/src/libs/network/network.ts b/packages/tssdk/src/libs/network/network.ts index d6dfb75..67dbd73 100755 --- a/packages/tssdk/src/libs/network/network.ts +++ b/packages/tssdk/src/libs/network/network.ts @@ -2,7 +2,7 @@ import axios from 'axios'; import createHash from 'create-hash'; import Debug from 'debug'; import { defaultAbiCoder as AbiCoder } from '@ethersproject/abi'; -import { getAbiInputsOutputsType } from '../../helpers/abi.helper'; +import { encodeFunction, getAbiInputsOutputsType } from '../../helpers/abi.helper'; import { config as cfg } from '../../config/chain.config'; import { ChainGlobalConfig, ChainNode } from '../../typings'; import { queueNodes, transformNodeList, transformResponse } from '../../helpers/network.helper'; @@ -340,7 +340,9 @@ export class NetworkApi { public async executeCall(address: string, method: string, args: any[], abi: any) { const io = getAbiInputsOutputsType(abi, method); - const data = { call: `${method}(${io.inputs.join(',')})`, args, to: address }; + const encodedFunction = encodeFunction(method, args, io.inputs); + + const data = { call: '0x0', args: [`0x${encodedFunction}`], to: `0x${address}` }; const response = await this.askBlockchainTo(ChainAction.EXECUTE_CALL, { data }); diff --git a/packages/tssdk/src/libs/transactions.ts b/packages/tssdk/src/libs/transactions.ts index cba85c6..78a95e0 100644 --- a/packages/tssdk/src/libs/transactions.ts +++ b/packages/tssdk/src/libs/transactions.ts @@ -109,21 +109,15 @@ const getRegisterTxBody = async ( referrer: string, powDifficulty = 16, ) => { - /** - * @todo move to env/const - */ - const clid = `power_wallet_${process.env.GIT_HEAD_HASH}`; - let body = { k: KIND_REGISTER, t: timestamp, nonce: '', h: createHash('sha256').update(publicKey).digest(), - e: { clid }, + e: { }, }; if (referrer) { - // @ts-ignore body = { ...body, e: { ...body.e, referrer } }; } From 8322d421b6d65c259bd2447b3fe9e90539538440 Mon Sep 17 00:00:00 2001 From: jackkru69 Date: Wed, 1 Nov 2023 21:33:09 +0300 Subject: [PATCH 3/3] added TODO --- packages/tssdk/src/libs/network/network.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tssdk/src/libs/network/network.ts b/packages/tssdk/src/libs/network/network.ts index 67dbd73..d9266ea 100755 --- a/packages/tssdk/src/libs/network/network.ts +++ b/packages/tssdk/src/libs/network/network.ts @@ -338,6 +338,7 @@ export class NetworkApi { } public async executeCall(address: string, method: string, args: any[], abi: any) { + // TODO move to evmContract.scGet const io = getAbiInputsOutputsType(abi, method); const encodedFunction = encodeFunction(method, args, io.inputs);