From d75b04a8bc91ea6e7508ab6ab9de027e09788f20 Mon Sep 17 00:00:00 2001 From: Dmytro Striletskyi Date: Sat, 30 Mar 2019 17:23:06 +0200 Subject: [PATCH 1/8] Create transfer tokens lambda (#1) --- .gitignore | 4 + Dockerfile.transferTokensLambda | 34 +++++++++ README.md | 74 ++++++++++++++++++- ops/Dockerfile.buildLambdasToProduction | 15 ++++ .../transferTokensLambdaHandlerCaller.js | 3 + src/lambdas/transferTokensLambdaHandler.js | 34 +++++++++ 6 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.transferTokensLambda create mode 100644 ops/Dockerfile.buildLambdasToProduction create mode 100644 src/callers/transferTokensLambdaHandlerCaller.js create mode 100644 src/lambdas/transferTokensLambdaHandler.js diff --git a/.gitignore b/.gitignore index 894a44c..9259e1a 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,7 @@ venv.bak/ # mypy .mypy_cache/ + +.DS_Store +.idea/ +*.zip diff --git a/Dockerfile.transferTokensLambda b/Dockerfile.transferTokensLambda new file mode 100644 index 0000000..ab4c4aa --- /dev/null +++ b/Dockerfile.transferTokensLambda @@ -0,0 +1,34 @@ +FROM ubuntu:16.04 as builder + +RUN apt-get update && apt-get install -y build-essential curl zip && \ + curl -sL https://deb.nodesource.com/setup_8.x | bash && \ + apt-get install -y nodejs + +RUN npm install remme + +RUN mkdir lambdas + +RUN mkdir lambdas/transferTokensLambda && cp -r /node_modules/ /lambdas/transferTokensLambda +ADD src/lambdas/transferTokensLambdaHandler.js lambdas/transferTokensLambda/ +RUN cd /lambdas/transferTokensLambda && zip -9r transferTokensLambda.zip . + +FROM amazonlinux:latest as lambda + +ARG MASTER_ACCOUNT_PRIVATE_KEY +ARG NODE_ADDRESS + +ENV MASTER_ACCOUNT_PRIVATE_KEY=$MASTER_ACCOUNT_PRIVATE_KEY +ENV NODE_ADDRESS=$NODE_ADDRESS + +RUN yum update -y && yum install -y unzip && \ + curl --location https://rpm.nodesource.com/setup_8.x | bash - && \ + yum install -y nodejs + +RUN mkdir -p /lambdas/transferTokensLambda + +COPY --from=builder /lambdas/transferTokensLambda/transferTokensLambda.zip /lambdas/transferTokensLambda + +ADD src/callers/transferTokensLambdaHandlerCaller.js /lambdas/transferTokensLambda/ +RUN cd /lambdas/transferTokensLambda && unzip transferTokensLambda.zip + +CMD node /lambdas/transferTokensLambda/transferTokensLambdaHandlerCaller.js diff --git a/README.md b/README.md index 2ba2472..b2af050 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,74 @@ -# remme-core-activity-simulation +# Remme core activity simulation + Simulate activity in a test network of the Remme blockchain (core) to show how it works. + +## Production + +For production [AWS Lambda](https://aws.amazon.com/lambda/features) is used. ``AWS Lambda`` is a serverless compute +service that runs your code in response to events and automatically manages the underlying compute resources. + +It runs: + +1. On ``CloudWatch`` events, so lambda is executed once per specified time, e.g. 5 minutes. +2. Also ``Amazon CloudWatch Logs`` feature is enable to collect the lambdas logs. +3. Runtime is ``Node.js 8.10``. + +### Lambdas + +To build an environment for lambdas and bundle each to own ``zip-archive``, build the container first: + +```bash +$ docker build -t lambdas . -f ops/Dockerfile.buildLambdasToProduction +``` + +Afterwards, export ``zip-archives`` from container to host with the following commands: + +```bash +$ ID=$(docker create lambdas /bin/true) +$ docker cp $ID:/lambdas/transferTokensLambda/transferTokensLambda.zip . +``` + +Now you can upload it to the ``AWS Lambda`` service and test with the following command: + +```bash +$ aws lambda update-function-code --function-name activitySimulationTrasferTokens --zip-file fileb:/$pwd/transferTokensLambda.zip +``` + +### Environment variables + +The production requires the following environment variables on the ``AWS Lambda`` environment: + +1. ``NODE_ADDRESS`` — the address of the node to work with (e.g. ``node-genesis-testnet.remme.io`` or ``139.59.148.55``). +2. ``MASTER_ACCOUNT_PRIVATE_KEY`` — private key from the account on the blockchain that is accessible by the node address +that could be a faucet for the transactions execution (have tokens on the account). + +## Development + +Clean containers and images with the following commands: + +```bash +$ docker rm $(docker ps -a -q) -f +$ docker rmi $(docker images -q) -f +``` + +### Transfer tokens lambda + +To build an environment for lambda that transfer tokens, build the container first: + +```bash +$ docker build \ + --build-arg MASTER_ACCOUNT_PRIVATE_KEY=ad2dc65ca66706aa4b5a2b63a10472c91e113b7f82614260f3bb3a2cd28a0cdc \ + --build-arg NODE_ADDRESS=139.59.148.55 \ + -f Dockerfile.transferTokensLambda \ + -t transfer-tokens-lambda . +``` + +Then you could execute the lambda like it should be executed in the production with the following command. This command +execute lambda in the container, that container is destroyed, so you can do it again immediately. + +```bash +$ docker run \ + -v $PWD/src/callers/transferTokensLambdaHandlerCaller.js:/lambdas/transferTokensLambda/transferTokensLambdaHandlerCaller.js \ + -v $PWD/src/lambdas/transferTokensLambdaHandler.js:/lambdas/transferTokensLambda/transferTokensLambdaHandler.js \ + --name transfer-tokens-lambda --rm transfer-tokens-lambda +``` diff --git a/ops/Dockerfile.buildLambdasToProduction b/ops/Dockerfile.buildLambdasToProduction new file mode 100644 index 0000000..4513dda --- /dev/null +++ b/ops/Dockerfile.buildLambdasToProduction @@ -0,0 +1,15 @@ +FROM ubuntu:16.04 as builder + +RUN apt-get update && apt-get install -y build-essential curl zip && \ + curl -sL https://deb.nodesource.com/setup_8.x | bash && \ + apt-get install -y nodejs + +RUN npm install remme + +RUN mkdir /lambdas + +RUN mkdir /lambdas/transferTokensLambda && cp -r /node_modules/ /lambdas/transferTokensLambda + +ADD src/lambdas/transferTokensLambdaHandler.js /lambdas/transferTokensLambda/ + +RUN cd /lambdas/transferTokensLambda && zip -9r transferTokensLambda.zip . diff --git a/src/callers/transferTokensLambdaHandlerCaller.js b/src/callers/transferTokensLambdaHandlerCaller.js new file mode 100644 index 0000000..e6ca030 --- /dev/null +++ b/src/callers/transferTokensLambdaHandlerCaller.js @@ -0,0 +1,3 @@ +let lambdas = require('./transferTokensLambdaHandler.js'); + +lambdas.transferTokensLambdaHandler({}, {}, function(result, _) {}); diff --git a/src/lambdas/transferTokensLambdaHandler.js b/src/lambdas/transferTokensLambdaHandler.js new file mode 100644 index 0000000..37f1f04 --- /dev/null +++ b/src/lambdas/transferTokensLambdaHandler.js @@ -0,0 +1,34 @@ +const Remme = require("remme"); + +const privateKeyHex = process.env.MASTER_ACCOUNT_PRIVATE_KEY; +const nodeAddress = process.env.NODE_ADDRESS; + +const remme_from = new Remme.Client({ + accountConfig: { privateKeyHex }, + networkConfig: { + nodeAddress: nodeAddress + ":8080" + } +}); + +const remme_from_address = remme_from.token._remmeAccount._address; + + +exports.transferTokensLambdaHandler = async (event) => { + + const remme_to = new Remme.Client({ + networkConfig: { + nodeAddress: nodeAddress + ":8080" + } + }); + + const remme_to_address = remme_to.token._remmeAccount._address; + + const transactionResult = await remme_from.token.transfer(remme_to.token._remmeAccount._address, 1000); + const batchIdentifier = transactionResult.data.id; + + console.log( + `Tokens transfer from \`${remme_from_address}\` to \`${remme_to_address}\`. Batch identifier is \`${batchIdentifier}\`.` + ); + + return transactionResult.data.id +}; From b5923874f0b69a8db6247b30a582f0f19a1a536a Mon Sep 17 00:00:00 2001 From: Dmytro Striletskyi Date: Tue, 2 Apr 2019 17:57:21 +0300 Subject: [PATCH 2/8] Add Jenkins file (#3) --- Jenkinsfile | 53 +++++++++++++++++++++++++ README.md | 9 +++-- ops/Dockerfile.buildLambdasToProduction | 8 ++-- 3 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..355cbb4 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,53 @@ +node('master') { + + stage ('Prepare environment') { + sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' || true" + sh "rm -rf $pwd/transferTokensLambda.zip" + sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" + sh "docker rmi lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" + } + + stage ('Build lambdas') { + sh "docker build -t lambdas-${env.BRANCH_NAME.toLowerCase()} . -f ops/Dockerfile.buildLambdasToProduction" + } + + stage ('Export lambdas') { + sh "docker run -d --name lambdas-${env.BRANCH_NAME.toLowerCase()} lambdas-${env.BRANCH_NAME.toLowerCase()}" + sh "docker cp lambdas-${env.BRANCH_NAME.toLowerCase()}:/lambdas/transferTokensLambda/transferTokensLambda.zip ." + sh "docker stop lambdas-${env.BRANCH_NAME.toLowerCase()}" + } + + if (env.BRANCH_NAME == 'master') { + stage('Deploy lambda to production') { + sh "aws lambda update-function-code \ + --function-name 'prod-activitySimulationTransferTokens' \ + --zip-file fileb://transferTokensLambda.zip" + } + } + + if (env.BRANCH_NAME == 'develop') { + stage('Deploy lambda to staging') { + sh "aws lambda update-function-code \ + --function-name 'staging-activitySimulationTransferTokens' \ + --zip-file fileb://transferTokensLambda.zip" + } + } + + if (env.BRANCH_NAME != 'master' && env.BRANCH_NAME != 'develop') { + stage('Deploy lambda for preview') { + sh "aws lambda create-function \ + --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' \ + --runtime 'nodejs8.10' \ + --handler 'transferTokensLambdaHandler.transferTokensLambdaHandler' \ + --role 'arn:aws:iam::146998029420:role/HandleLambdasRole' \ + --environment \"Variables={MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}\" \ + --zip-file fileb://transferTokensLambda.zip" + } + } + + stage ('Clean up an environment') { + sh "rm -rf transferTokensLambda.zip" + sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" + sh "docker rmi lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" + } +} diff --git a/README.md b/README.md index b2af050..c82d8cf 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,13 @@ To build an environment for lambdas and bundle each to own ``zip-archive``, buil $ docker build -t lambdas . -f ops/Dockerfile.buildLambdasToProduction ``` -Afterwards, export ``zip-archives`` from container to host with the following commands: +Afterwards, run the container, export ``zip-archives`` from container to host and stop the container with the following +commands: ```bash -$ ID=$(docker create lambdas /bin/true) -$ docker cp $ID:/lambdas/transferTokensLambda/transferTokensLambda.zip . +$ docker run -d --name lambdas lambdas +$ docker cp lambdas:/lambdas/transferTokensLambda/transferTokensLambda.zip . +$ docker stop lambdas ``` Now you can upload it to the ``AWS Lambda`` service and test with the following command: @@ -72,3 +74,4 @@ $ docker run \ -v $PWD/src/lambdas/transferTokensLambdaHandler.js:/lambdas/transferTokensLambda/transferTokensLambdaHandler.js \ --name transfer-tokens-lambda --rm transfer-tokens-lambda ``` + diff --git a/ops/Dockerfile.buildLambdasToProduction b/ops/Dockerfile.buildLambdasToProduction index 4513dda..6918c93 100644 --- a/ops/Dockerfile.buildLambdasToProduction +++ b/ops/Dockerfile.buildLambdasToProduction @@ -1,8 +1,6 @@ -FROM ubuntu:16.04 as builder +FROM node:8 -RUN apt-get update && apt-get install -y build-essential curl zip && \ - curl -sL https://deb.nodesource.com/setup_8.x | bash && \ - apt-get install -y nodejs +RUN apt-get update && apt-get install -y zip RUN npm install remme @@ -13,3 +11,5 @@ RUN mkdir /lambdas/transferTokensLambda && cp -r /node_modules/ /lambdas/transfe ADD src/lambdas/transferTokensLambdaHandler.js /lambdas/transferTokensLambda/ RUN cd /lambdas/transferTokensLambda && zip -9r transferTokensLambda.zip . + +CMD sleep 7200 From a1d43b150410083f65778db31adc16699ceacb5d Mon Sep 17 00:00:00 2001 From: Dmytro Striletskyi Date: Tue, 2 Apr 2019 21:22:58 +0300 Subject: [PATCH 3/8] Update development dockerfile (#4) --- Dockerfile.transferTokensLambda | 6 ++---- Jenkinsfile | 11 ++++++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Dockerfile.transferTokensLambda b/Dockerfile.transferTokensLambda index ab4c4aa..f5f8f12 100644 --- a/Dockerfile.transferTokensLambda +++ b/Dockerfile.transferTokensLambda @@ -1,8 +1,6 @@ -FROM ubuntu:16.04 as builder +FROM node:8 as builder -RUN apt-get update && apt-get install -y build-essential curl zip && \ - curl -sL https://deb.nodesource.com/setup_8.x | bash && \ - apt-get install -y nodejs +RUN apt-get update && apt-get install -y zip RUN npm install remme diff --git a/Jenkinsfile b/Jenkinsfile index 355cbb4..cfa9802 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,11 @@ node('master') { + stage ('Clone source code. Checkout') { + sh "rm -rf * || true && rm -rf .* || true" + sh "git clone -b ${env.CHANGE_BRANCH} https://github.com/Remmeauth/remme-core-activity-simulation ." + } + stage ('Prepare environment') { - sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' || true" sh "rm -rf $pwd/transferTokensLambda.zip" sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" sh "docker rmi lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" @@ -12,7 +16,7 @@ node('master') { } stage ('Export lambdas') { - sh "docker run -d --name lambdas-${env.BRANCH_NAME.toLowerCase()} lambdas-${env.BRANCH_NAME.toLowerCase()}" + sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true && docker run -d --name lambdas-${env.BRANCH_NAME.toLowerCase()} lambdas-${env.BRANCH_NAME.toLowerCase()}" sh "docker cp lambdas-${env.BRANCH_NAME.toLowerCase()}:/lambdas/transferTokensLambda/transferTokensLambda.zip ." sh "docker stop lambdas-${env.BRANCH_NAME.toLowerCase()}" } @@ -35,12 +39,13 @@ node('master') { if (env.BRANCH_NAME != 'master' && env.BRANCH_NAME != 'develop') { stage('Deploy lambda for preview') { + sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' || true" sh "aws lambda create-function \ --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' \ --runtime 'nodejs8.10' \ --handler 'transferTokensLambdaHandler.transferTokensLambdaHandler' \ --role 'arn:aws:iam::146998029420:role/HandleLambdasRole' \ - --environment \"Variables={MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}\" \ + --environment Variables='{MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}' \ --zip-file fileb://transferTokensLambda.zip" } } From abf876186669f3d3c14ed21782bcf9f50562cbfd Mon Sep 17 00:00:00 2001 From: Dmytro Striletskyi Date: Wed, 3 Apr 2019 00:27:39 +0300 Subject: [PATCH 4/8] Create branching execution stages --- Jenkinsfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index cfa9802..7636a8f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,7 +2,11 @@ node('master') { stage ('Clone source code. Checkout') { sh "rm -rf * || true && rm -rf .* || true" - sh "git clone -b ${env.CHANGE_BRANCH} https://github.com/Remmeauth/remme-core-activity-simulation ." + if (env.BRANCH_NAME == 'develop' || nv.BRANCH_NAME == 'master') { + sh "git clone -b ${env.BRANCH_NAME} https://github.com/Remmeauth/remme-core-activity-simulation ." + } else { + sh "git clone -b ${env.CHANGE_BRANCH} https://github.com/Remmeauth/remme-core-activity-simulation ." + } } stage ('Prepare environment') { From cd8415e5f93b54f6b8f6fcd96db018e751ebb748 Mon Sep 17 00:00:00 2001 From: Anastasiia Bilova Date: Mon, 8 Apr 2019 01:12:11 +0300 Subject: [PATCH 5/8] Create store public key lambda (#6) --- Dockerfile.storePublicKeyLambda | 32 ++++++++++++++++ Jenkinsfile | 22 +++++++++++ README.md | 25 +++++++++++- ops/Dockerfile.buildLambdasToProduction | 3 ++ .../storePublicKeyLambdaHandlerCaller.js | 3 ++ src/lambdas/storePublicKeyLambdaHandler.js | 38 +++++++++++++++++++ 6 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.storePublicKeyLambda create mode 100644 src/callers/storePublicKeyLambdaHandlerCaller.js create mode 100644 src/lambdas/storePublicKeyLambdaHandler.js diff --git a/Dockerfile.storePublicKeyLambda b/Dockerfile.storePublicKeyLambda new file mode 100644 index 0000000..eeb9a37 --- /dev/null +++ b/Dockerfile.storePublicKeyLambda @@ -0,0 +1,32 @@ +FROM node:8 as builder + +RUN apt-get update && apt-get install -y zip + +RUN npm install remme + +RUN mkdir lambdas + +RUN mkdir lambdas/storePublicKeyLambda && cp -r /node_modules/ /lambdas/storePublicKeyLambda +ADD src/lambdas/storePublicKeyLambdaHandler.js lambdas/storePublicKeyLambda/ +RUN cd /lambdas/storePublicKeyLambda && zip -9r storePublicKeyLambda.zip . + +FROM amazonlinux:latest as lambda + +ARG MASTER_ACCOUNT_PRIVATE_KEY +ARG NODE_ADDRESS + +ENV MASTER_ACCOUNT_PRIVATE_KEY=$MASTER_ACCOUNT_PRIVATE_KEY +ENV NODE_ADDRESS=$NODE_ADDRESS + +RUN yum update -y && yum install -y unzip && \ + curl --location https://rpm.nodesource.com/setup_8.x | bash - && \ + yum install -y nodejs + +RUN mkdir -p /lambdas/storePublicKeyLambda + +COPY --from=builder /lambdas/storePublicKeyLambda/storePublicKeyLambda.zip /lambdas/storePublicKeyLambda + +ADD src/callers/storePublicKeyLambdaHandlerCaller.js /lambdas/storePublicKeyLambda/ +RUN cd /lambdas/storePublicKeyLambda && unzip storePublicKeyLambda.zip + +CMD node /lambdas/storePublicKeyLambda/storePublicKeyLambdaHandlerCaller.js diff --git a/Jenkinsfile b/Jenkinsfile index 5dd535c..d5163b0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,6 +12,7 @@ node('master') { stage ('Prepare environment') { sh "rm -rf $pwd/transferTokensLambda.zip" + sh "rm -rf $pwd/storePublicKeyLambda.zip" sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" sh "docker rmi lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" } @@ -23,6 +24,7 @@ node('master') { stage ('Export lambdas') { sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true && docker run -d --name lambdas-${env.BRANCH_NAME.toLowerCase()} lambdas-${env.BRANCH_NAME.toLowerCase()}" sh "docker cp lambdas-${env.BRANCH_NAME.toLowerCase()}:/lambdas/transferTokensLambda/transferTokensLambda.zip ." + sh "docker cp lambdas-${env.BRANCH_NAME.toLowerCase()}:/lambdas/storePublicKeyLambda/storePublicKeyLambda.zip ." sh "docker stop lambdas-${env.BRANCH_NAME.toLowerCase()}" } @@ -31,6 +33,10 @@ node('master') { sh "aws lambda update-function-code \ --function-name 'prod-activitySimulationTransferTokens' \ --zip-file fileb://transferTokensLambda.zip" + + sh "aws lambda update-function-code \ + --function-name 'prod-activitySimulationStorePublicKey' \ + --zip-file fileb://storePublicKeyLambda.zip" } } @@ -39,12 +45,18 @@ node('master') { sh "aws lambda update-function-code \ --function-name 'staging-activitySimulationTransferTokens' \ --zip-file fileb://transferTokensLambda.zip" + + sh "aws lambda update-function-code \ + --function-name 'staging-activitySimulationStorePublicKey' \ + --zip-file fileb://storePublicKeyLambda.zip" } } if (env.BRANCH_NAME != 'master' && env.BRANCH_NAME != 'develop') { stage('Deploy lambda for preview') { sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' || true" + sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationStorePublicKey-${env.BRANCH_NAME}' || true" + sh "aws lambda create-function \ --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' \ --runtime 'nodejs8.10' \ @@ -52,11 +64,21 @@ node('master') { --role 'arn:aws:iam::146998029420:role/HandleLambdasRole' \ --environment Variables='{MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}' \ --zip-file fileb://transferTokensLambda.zip" + + sh "aws lambda create-function \ + --function-name 'deployPreview-activitySimulationStorePublicKey-${env.BRANCH_NAME}' \ + --runtime 'nodejs8.10' \ + --handler 'storePublicKeyLambdaHandler.storePublicKeyLambdaHandler' \ + --role 'arn:aws:iam::146998029420:role/HandleLambdasRole' \ + --timeout '300' \ + --environment Variables='{MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}' \ + --zip-file fileb://storePublicKeyLambda.zip" } } stage ('Clean up an environment') { sh "rm -rf transferTokensLambda.zip" + sh "rm -rf storePublicKeyLambda.zip" sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" sh "docker rmi lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" } diff --git a/README.md b/README.md index e21909c..323a5fd 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ commands: ```bash $ docker run -d --name lambdas lambdas $ docker cp lambdas:/lambdas/transferTokensLambda/transferTokensLambda.zip . +$ docker cp lambdas:/lambdas/storePublicKeyLambda/storePublicKeyLambda.zip . $ docker stop lambdas ``` @@ -73,4 +74,26 @@ $ docker run \ -v $PWD/src/callers/transferTokensLambdaHandlerCaller.js:/lambdas/transferTokensLambda/transferTokensLambdaHandlerCaller.js \ -v $PWD/src/lambdas/transferTokensLambdaHandler.js:/lambdas/transferTokensLambda/transferTokensLambdaHandler.js \ --name transfer-tokens-lambda --rm transfer-tokens-lambda -``` \ No newline at end of file +``` + +### Store public key lambda + +To build an environment for lambda that transfer tokens, build the container first: + +```bash +$ docker build \ + --build-arg MASTER_ACCOUNT_PRIVATE_KEY=ad2dc65ca66706aa4b5a2b63a10472c91e113b7f82614260f3bb3a2cd28a0cdc \ + --build-arg NODE_ADDRESS=139.59.148.55 \ + -f Dockerfile.storePublicKeyLambda \ + -t store-public-key-lambda . +``` + +Then you could execute the lambda like it should be executed in the production with the following command. This command +execute lambda in the container, that container is destroyed, so you can do it again immediately. + +```bash +$ docker run \ + -v $PWD/src/callers/storePublicKeyLambdaHandlerCaller.js:/lambdas/storePublicKeyLambda/storePublicKeyLambdaHandlerCaller.js \ + -v $PWD/src/lambdas/storePublicKeyLambdaHandler.js:/lambdas/storePublicKeyLambda/storePublicKeyLambdaHandler.js \ + --name store-public-key-lambda --rm store-public-key-lambda +``` diff --git a/ops/Dockerfile.buildLambdasToProduction b/ops/Dockerfile.buildLambdasToProduction index 6918c93..522b902 100644 --- a/ops/Dockerfile.buildLambdasToProduction +++ b/ops/Dockerfile.buildLambdasToProduction @@ -7,9 +7,12 @@ RUN npm install remme RUN mkdir /lambdas RUN mkdir /lambdas/transferTokensLambda && cp -r /node_modules/ /lambdas/transferTokensLambda +RUN mkdir /lambdas/storePublicKeyLambda && cp -r /node_modules/ /lambdas/storePublicKeyLambda ADD src/lambdas/transferTokensLambdaHandler.js /lambdas/transferTokensLambda/ +ADD src/lambdas/storePublicKeyLambdaHandler.js /lambdas/storePublicKeyLambda/ RUN cd /lambdas/transferTokensLambda && zip -9r transferTokensLambda.zip . +RUN cd /lambdas/storePublicKeyLambda && zip -9r storePublicKeyLambda.zip . CMD sleep 7200 diff --git a/src/callers/storePublicKeyLambdaHandlerCaller.js b/src/callers/storePublicKeyLambdaHandlerCaller.js new file mode 100644 index 0000000..373cde6 --- /dev/null +++ b/src/callers/storePublicKeyLambdaHandlerCaller.js @@ -0,0 +1,3 @@ +let lambdas = require('./storePublicKeyLambdaHandler.js'); + +lambdas.storePublicKeyLambdaHandler({}, {}, function(result, _) {}); diff --git a/src/lambdas/storePublicKeyLambdaHandler.js b/src/lambdas/storePublicKeyLambdaHandler.js new file mode 100644 index 0000000..881de31 --- /dev/null +++ b/src/lambdas/storePublicKeyLambdaHandler.js @@ -0,0 +1,38 @@ +const Remme = require("remme"); +const remmeKeys = require("remme-keys"); + +const privateKeyHex = process.env.MASTER_ACCOUNT_PRIVATE_KEY; +const nodeAddress = process.env.NODE_ADDRESS; + +const remme = new Remme.Client({ + accountConfig: { privateKeyHex }, + networkConfig: { + nodeAddress: nodeAddress + ":8080" + } +}); + + +exports.storePublicKeyLambdaHandler = async (event) => { + + const keys = await Remme.Keys.construct(remmeKeys.KeyType.RSA); + + const validFrom = Math.round(Date.now() / 1000); + const validTo = Math.round(Date.now() / 1000 + 1000); + + const storeResponse = await remme.publicKeyStorage.createAndStore({ + data: "store data", + keys: keys, + rsaSignaturePadding: remmeKeys.RSASignaturePadding.PSS, + validFrom: validFrom, + validTo: validTo, + doOwnerPay: false, + }); + + const remme_address = remme.account.address; + const batchIdentifier = storeResponse.data.id; + + console.log(`Public key has been stored to \`${remme_address}\`. Batch identifier is \`${batchIdentifier}\`.`); + + return batchIdentifier; + +}; From c6fc35d134780598ec13127da2c77ca7efaf55d4 Mon Sep 17 00:00:00 2001 From: Anastasiia Bilova Date: Mon, 8 Apr 2019 15:43:21 +0300 Subject: [PATCH 6/8] Create revoke public key lambda (#7) --- Dockerfile.revokePublicKeyLambda | 32 +++++++++++++++++ Jenkinsfile | 21 +++++++++++ README.md | 25 ++++++++++++- ops/Dockerfile.buildLambdasToProduction | 3 ++ .../revokePublicKeyLambdaHandlerCaller.js | 3 ++ src/lambdas/revokePublicKeyLambdaHandler.js | 36 +++++++++++++++++++ 6 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.revokePublicKeyLambda create mode 100644 src/callers/revokePublicKeyLambdaHandlerCaller.js create mode 100644 src/lambdas/revokePublicKeyLambdaHandler.js diff --git a/Dockerfile.revokePublicKeyLambda b/Dockerfile.revokePublicKeyLambda new file mode 100644 index 0000000..93b4853 --- /dev/null +++ b/Dockerfile.revokePublicKeyLambda @@ -0,0 +1,32 @@ +FROM node:8 as builder + +RUN apt-get update && apt-get install -y zip + +RUN npm install remme + +RUN mkdir lambdas + +RUN mkdir lambdas/revokePublicKeyLambda && cp -r /node_modules/ /lambdas/revokePublicKeyLambda +ADD src/lambdas/revokePublicKeyLambdaHandler.js lambdas/revokePublicKeyLambda/ +RUN cd /lambdas/revokePublicKeyLambda && zip -9r revokePublicKeyLambda.zip . + +FROM amazonlinux:latest as lambda + +ARG MASTER_ACCOUNT_PRIVATE_KEY +ARG NODE_ADDRESS + +ENV MASTER_ACCOUNT_PRIVATE_KEY=$MASTER_ACCOUNT_PRIVATE_KEY +ENV NODE_ADDRESS=$NODE_ADDRESS + +RUN yum update -y && yum install -y unzip && \ + curl --location https://rpm.nodesource.com/setup_8.x | bash - && \ + yum install -y nodejs + +RUN mkdir -p /lambdas/revokePublicKeyLambda + +COPY --from=builder /lambdas/revokePublicKeyLambda/revokePublicKeyLambda.zip /lambdas/revokePublicKeyLambda + +ADD src/callers/revokePublicKeyLambdaHandlerCaller.js /lambdas/revokePublicKeyLambda/ +RUN cd /lambdas/revokePublicKeyLambda && unzip revokePublicKeyLambda.zip + +CMD node /lambdas/revokePublicKeyLambda/revokePublicKeyLambdaHandlerCaller.js diff --git a/Jenkinsfile b/Jenkinsfile index d5163b0..068516b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -13,6 +13,7 @@ node('master') { stage ('Prepare environment') { sh "rm -rf $pwd/transferTokensLambda.zip" sh "rm -rf $pwd/storePublicKeyLambda.zip" + sh "rm -rf $pwd/revokePublicKeyLambda.zip" sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" sh "docker rmi lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" } @@ -25,6 +26,7 @@ node('master') { sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true && docker run -d --name lambdas-${env.BRANCH_NAME.toLowerCase()} lambdas-${env.BRANCH_NAME.toLowerCase()}" sh "docker cp lambdas-${env.BRANCH_NAME.toLowerCase()}:/lambdas/transferTokensLambda/transferTokensLambda.zip ." sh "docker cp lambdas-${env.BRANCH_NAME.toLowerCase()}:/lambdas/storePublicKeyLambda/storePublicKeyLambda.zip ." + sh "docker cp lambdas-${env.BRANCH_NAME.toLowerCase()}:/lambdas/revokePublicKeyLambda/revokePublicKeyLambda.zip ." sh "docker stop lambdas-${env.BRANCH_NAME.toLowerCase()}" } @@ -37,6 +39,10 @@ node('master') { sh "aws lambda update-function-code \ --function-name 'prod-activitySimulationStorePublicKey' \ --zip-file fileb://storePublicKeyLambda.zip" + + sh "aws lambda update-function-code \ + --function-name 'prod-activitySimulationRevokePublicKey' \ + --zip-file fileb://revokePublicKeyLambda.zip" } } @@ -49,6 +55,10 @@ node('master') { sh "aws lambda update-function-code \ --function-name 'staging-activitySimulationStorePublicKey' \ --zip-file fileb://storePublicKeyLambda.zip" + + sh "aws lambda update-function-code \ + --function-name 'staging-activitySimulationRevokePublicKey' \ + --zip-file fileb://revokePublicKeyLambda.zip" } } @@ -56,6 +66,7 @@ node('master') { stage('Deploy lambda for preview') { sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' || true" sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationStorePublicKey-${env.BRANCH_NAME}' || true" + sh "aws lambda delete-function --function-name 'deployPreview-activitySimulationRevokePublicKey-${env.BRANCH_NAME}' || true" sh "aws lambda create-function \ --function-name 'deployPreview-activitySimulationTransferTokens-${env.BRANCH_NAME}' \ @@ -73,12 +84,22 @@ node('master') { --timeout '300' \ --environment Variables='{MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}' \ --zip-file fileb://storePublicKeyLambda.zip" + + sh "aws lambda create-function \ + --function-name 'deployPreview-activitySimulationRevokePublicKey-${env.BRANCH_NAME}' \ + --runtime 'nodejs8.10' \ + --handler 'revokePublicKeyLambdaHandler.revokePublicKeyLambdaHandler' \ + --role 'arn:aws:iam::146998029420:role/HandleLambdasRole' \ + --timeout '300' \ + --environment Variables='{MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}' \ + --zip-file fileb://revokePublicKeyLambda.zip" } } stage ('Clean up an environment') { sh "rm -rf transferTokensLambda.zip" sh "rm -rf storePublicKeyLambda.zip" + sh "rm -rf revokePublicKeyLambda.zip" sh "docker rm lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" sh "docker rmi lambdas-${env.BRANCH_NAME.toLowerCase()} -f || true" } diff --git a/README.md b/README.md index 323a5fd..0686cd8 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ commands: $ docker run -d --name lambdas lambdas $ docker cp lambdas:/lambdas/transferTokensLambda/transferTokensLambda.zip . $ docker cp lambdas:/lambdas/storePublicKeyLambda/storePublicKeyLambda.zip . +$ docker cp lambdas:/lambdas/revokePublicKeyLambda/revokePublicKeyLambda.zip . $ docker stop lambdas ``` @@ -78,7 +79,7 @@ $ docker run \ ### Store public key lambda -To build an environment for lambda that transfer tokens, build the container first: +To build an environment for lambda that store public key, build the container first: ```bash $ docker build \ @@ -97,3 +98,25 @@ $ docker run \ -v $PWD/src/lambdas/storePublicKeyLambdaHandler.js:/lambdas/storePublicKeyLambda/storePublicKeyLambdaHandler.js \ --name store-public-key-lambda --rm store-public-key-lambda ``` + +### Revoke public key lambda + +To build an environment for lambda that revoke public key, build the container first: + +```bash +$ docker build \ + --build-arg MASTER_ACCOUNT_PRIVATE_KEY=ad2dc65ca66706aa4b5a2b63a10472c91e113b7f82614260f3bb3a2cd28a0cdc \ + --build-arg NODE_ADDRESS=139.59.148.55 \ + -f Dockerfile.revokePublicKeyLambda \ + -t revoke-public-key-lambda . +``` + +Then you could execute the lambda like it should be executed in the production with the following command. This command +execute lambda in the container, that container is destroyed, so you can do it again immediately. + +```bash +$ docker run \ + -v $PWD/src/callers/revokePublicKeyLambdaHandlerCaller.js:/lambdas/revokePublicKeyLambda/revokePublicKeyLambdaHandlerCaller.js \ + -v $PWD/src/lambdas/revokePublicKeyLambdaHandler.js:/lambdas/revokePublicKeyLambda/revokePublicKeyLambdaHandler.js \ + --name revoke-public-key-lambda --rm revoke-public-key-lambda +``` diff --git a/ops/Dockerfile.buildLambdasToProduction b/ops/Dockerfile.buildLambdasToProduction index 522b902..0e4bf3c 100644 --- a/ops/Dockerfile.buildLambdasToProduction +++ b/ops/Dockerfile.buildLambdasToProduction @@ -8,11 +8,14 @@ RUN mkdir /lambdas RUN mkdir /lambdas/transferTokensLambda && cp -r /node_modules/ /lambdas/transferTokensLambda RUN mkdir /lambdas/storePublicKeyLambda && cp -r /node_modules/ /lambdas/storePublicKeyLambda +RUN mkdir /lambdas/revokePublicKeyLambda && cp -r /node_modules/ /lambdas/revokePublicKeyLambda ADD src/lambdas/transferTokensLambdaHandler.js /lambdas/transferTokensLambda/ ADD src/lambdas/storePublicKeyLambdaHandler.js /lambdas/storePublicKeyLambda/ +ADD src/lambdas/revokePublicKeyLambdaHandler.js /lambdas/revokePublicKeyLambda/ RUN cd /lambdas/transferTokensLambda && zip -9r transferTokensLambda.zip . RUN cd /lambdas/storePublicKeyLambda && zip -9r storePublicKeyLambda.zip . +RUN cd /lambdas/revokePublicKeyLambda && zip -9r revokePublicKeyLambda.zip . CMD sleep 7200 diff --git a/src/callers/revokePublicKeyLambdaHandlerCaller.js b/src/callers/revokePublicKeyLambdaHandlerCaller.js new file mode 100644 index 0000000..3e76342 --- /dev/null +++ b/src/callers/revokePublicKeyLambdaHandlerCaller.js @@ -0,0 +1,3 @@ +let lambdas = require('./revokePublicKeyLambdaHandler.js'); + +lambdas.revokePublicKeyLambdaHandler({}, {}, function(result, _) {}); diff --git a/src/lambdas/revokePublicKeyLambdaHandler.js b/src/lambdas/revokePublicKeyLambdaHandler.js new file mode 100644 index 0000000..7007c2c --- /dev/null +++ b/src/lambdas/revokePublicKeyLambdaHandler.js @@ -0,0 +1,36 @@ +const Remme = require("remme"); + +const privateKeyHex = process.env.MASTER_ACCOUNT_PRIVATE_KEY; +const nodeAddress = process.env.NODE_ADDRESS; + +const remme = new Remme.Client({ + accountConfig: { privateKeyHex }, + networkConfig: { + nodeAddress: nodeAddress + ":8080" + } +}); + + +exports.revokePublicKeyLambdaHandler = async (event) => { + + const publicKeyAddresses = await remme.publicKeyStorage.getAccountPublicKeys(remme.account.address); + + const publicKeyAddress = publicKeyAddresses[publicKeyAddresses.length - 1]; + + const info = await remme.publicKeyStorage.getInfo(publicKeyAddress); + + if (info.isRevoked === false) { + const revokeResponse = await remme.publicKeyStorage.revoke(publicKeyAddress); + + const remme_address = remme.account.address; + const batchIdentifier = revokeResponse.data.id; + + console.log(`Public key that belongs to address \`${remme_address}\` has been revoked. Batch identifier is \`${batchIdentifier}\`.`); + + return batchIdentifier; + } + else { + console.log(`Public key address \`${publicKeyAddress}\` has been already revoked.`); + } + +}; From 969130efce26db63b82326372f4d9e2bf8f22ca9 Mon Sep 17 00:00:00 2001 From: Dmytro Striletskyi Date: Thu, 25 Apr 2019 15:33:01 +0300 Subject: [PATCH 7/8] Integrate env. variable to sent amount to transfer (#9) --- Dockerfile.transferTokensLambda | 2 ++ Jenkinsfile | 2 +- README.md | 10 ++++++---- src/lambdas/transferTokensLambdaHandler.js | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Dockerfile.transferTokensLambda b/Dockerfile.transferTokensLambda index f5f8f12..1ee37a6 100644 --- a/Dockerfile.transferTokensLambda +++ b/Dockerfile.transferTokensLambda @@ -14,9 +14,11 @@ FROM amazonlinux:latest as lambda ARG MASTER_ACCOUNT_PRIVATE_KEY ARG NODE_ADDRESS +ARG AMOUNT_OF_TOKENS_TO_SEND ENV MASTER_ACCOUNT_PRIVATE_KEY=$MASTER_ACCOUNT_PRIVATE_KEY ENV NODE_ADDRESS=$NODE_ADDRESS +ENV AMOUNT_OF_TOKENS_TO_SEND=$AMOUNT_OF_TOKENS_TO_SEND RUN yum update -y && yum install -y unzip && \ curl --location https://rpm.nodesource.com/setup_8.x | bash - && \ diff --git a/Jenkinsfile b/Jenkinsfile index 068516b..d76d76e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -73,7 +73,7 @@ node('master') { --runtime 'nodejs8.10' \ --handler 'transferTokensLambdaHandler.transferTokensLambdaHandler' \ --role 'arn:aws:iam::146998029420:role/HandleLambdasRole' \ - --environment Variables='{MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS}}' \ + --environment Variables='{MASTER_ACCOUNT_PRIVATE_KEY=${env.MASTER_ACCOUNT_PRIVATE_KEY},NODE_ADDRESS=${env.NODE_ADDRESS},AMOUNT_OF_TOKENS_TO_SEND=${env.AMOUNT_OF_TOKENS_TO_SEND}}' \ --zip-file fileb://transferTokensLambda.zip" sh "aws lambda create-function \ diff --git a/README.md b/README.md index 0686cd8..3b54b4f 100644 --- a/README.md +++ b/README.md @@ -42,9 +42,10 @@ $ aws lambda update-function-code --function-name activitySimulationTrasferToken The production requires the following environment variables on the ``AWS Lambda`` environment: -1. ``NODE_ADDRESS`` — the address of the node to work with (e.g. ``node-genesis-testnet.remme.io`` or ``139.59.148.55``). +1. ``NODE_ADDRESS`` — the address of the node to work with (e.g. ``node-27-testnet.remme.io`` or ``139.59.148.55``). 2. ``MASTER_ACCOUNT_PRIVATE_KEY`` — private key from the account on the blockchain that is accessible by the node address that could be a faucet for the transactions execution (have tokens on the account). +3. ``AMOUNT_OF_TOKENS_TO_SEND`` — amount of tokens to send for transfer tokens lambda. ## Development @@ -62,7 +63,8 @@ To build an environment for lambda that transfer tokens, build the container fir ```bash $ docker build \ --build-arg MASTER_ACCOUNT_PRIVATE_KEY=ad2dc65ca66706aa4b5a2b63a10472c91e113b7f82614260f3bb3a2cd28a0cdc \ - --build-arg NODE_ADDRESS=139.59.148.55 \ + --build-arg NODE_ADDRESS=node-27-testnet.remme.io \ + --build-arg AMOUNT_OF_TOKENS_TO_SEND=1000 \ -f Dockerfile.transferTokensLambda \ -t transfer-tokens-lambda . ``` @@ -84,7 +86,7 @@ To build an environment for lambda that store public key, build the container fi ```bash $ docker build \ --build-arg MASTER_ACCOUNT_PRIVATE_KEY=ad2dc65ca66706aa4b5a2b63a10472c91e113b7f82614260f3bb3a2cd28a0cdc \ - --build-arg NODE_ADDRESS=139.59.148.55 \ + --build-arg NODE_ADDRESS=node-27-testnet.remme.io \ -f Dockerfile.storePublicKeyLambda \ -t store-public-key-lambda . ``` @@ -106,7 +108,7 @@ To build an environment for lambda that revoke public key, build the container f ```bash $ docker build \ --build-arg MASTER_ACCOUNT_PRIVATE_KEY=ad2dc65ca66706aa4b5a2b63a10472c91e113b7f82614260f3bb3a2cd28a0cdc \ - --build-arg NODE_ADDRESS=139.59.148.55 \ + --build-arg NODE_ADDRESS=node-27-testnet.remme.io \ -f Dockerfile.revokePublicKeyLambda \ -t revoke-public-key-lambda . ``` diff --git a/src/lambdas/transferTokensLambdaHandler.js b/src/lambdas/transferTokensLambdaHandler.js index 37f1f04..ff07884 100644 --- a/src/lambdas/transferTokensLambdaHandler.js +++ b/src/lambdas/transferTokensLambdaHandler.js @@ -2,6 +2,7 @@ const Remme = require("remme"); const privateKeyHex = process.env.MASTER_ACCOUNT_PRIVATE_KEY; const nodeAddress = process.env.NODE_ADDRESS; +const amountOfTokensToSend = process.env.AMOUNT_OF_TOKENS_TO_SEND; const remme_from = new Remme.Client({ accountConfig: { privateKeyHex }, @@ -23,7 +24,7 @@ exports.transferTokensLambdaHandler = async (event) => { const remme_to_address = remme_to.token._remmeAccount._address; - const transactionResult = await remme_from.token.transfer(remme_to.token._remmeAccount._address, 1000); + const transactionResult = await remme_from.token.transfer(remme_to.token._remmeAccount._address, amountOfTokensToSend); const batchIdentifier = transactionResult.data.id; console.log( From ee1f1b500d8416b4b07ae2c9de08ececcc2c6c58 Mon Sep 17 00:00:00 2001 From: Dmytro Striletskyi Date: Fri, 10 May 2019 19:00:38 +0300 Subject: [PATCH 8/8] Send tokens to the node account instead of just account (#11) --- src/lambdas/transferTokensLambdaHandler.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lambdas/transferTokensLambdaHandler.js b/src/lambdas/transferTokensLambdaHandler.js index ff07884..9286755 100644 --- a/src/lambdas/transferTokensLambdaHandler.js +++ b/src/lambdas/transferTokensLambdaHandler.js @@ -17,14 +17,15 @@ const remme_from_address = remme_from.token._remmeAccount._address; exports.transferTokensLambdaHandler = async (event) => { const remme_to = new Remme.Client({ + accountConfig: { privateKeyHex, type: 1 }, networkConfig: { nodeAddress: nodeAddress + ":8080" } }); - const remme_to_address = remme_to.token._remmeAccount._address; + const remme_to_address = remme_to.account.address; - const transactionResult = await remme_from.token.transfer(remme_to.token._remmeAccount._address, amountOfTokensToSend); + const transactionResult = await remme_from.token.transfer(remme_to_address, amountOfTokensToSend); const batchIdentifier = transactionResult.data.id; console.log(