etherspot/etherspot-sdk

[BUG] - Serverless deployment error when etherspot/sdk is used

ferrjohnpainagan opened this issue · 3 comments

Expected Behavior

Serverless function that contains etherspot/sdk initialization should be deployed successfully.
When the function is called should log the initialized sdk.

Current Behavior

Upon deploying a serverless function that contains etherspot/sdk initialization, the serverless deployment fails.

`Error: Could not resolve "encoding" module, required in "/Users/frootloops/code/work/swipebit/blox-serverless/.build/node_modules/etherspot/node_modules/node-fetch/lib/index.js"

at /Users/frootloops/code/work/swipebit/blox-serverless/node_modules/serverless-plugin-reducer/node_modules/ncjsm/get-dependencies.js:33:12
at Function.then (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/_ext.js:65:13)
at Deferred._settle (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:93:26)
at Deferred.resolve (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:138:15)
at Function.then (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/_ext.js:70:4)
at Deferred._settle (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:93:26)
at Deferred.resolve (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:138:15)
at Function.then (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/_ext.js:70:4)
at Deferred._settle (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:93:26)
at Deferred.resolve (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:138:15)
at Function.then (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/_ext.js:70:4)
at Deferred._settle (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:93:26)
at Deferred.reject (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/deferred/deferred.js:146:15)
at /Users/frootloops/code/work/swipebit/blox-serverless/node_modules/fs2/stat.js:14:13
at callback (/Users/frootloops/code/work/swipebit/blox-serverless/node_modules/graceful-fs/polyfills.js:306:20)
at FSReqCallback.oncomplete (fs.js:183:21)`

Steps to Reproduce

  1. Create a serverless function
  2. Initiate etherspot/sdk and log the sdk inside that serverless function
  3. Deploy the function to aws

Context (Environment)

`import {ethers} from 'ethers';
import dotenv from 'dotenv';
import {Sdk, NetworkNames, randomPrivateKey} from 'etherspot';
const crc32 = require('crc-32');
dotenv.config();

export default class WalletService {
static async getAddress(payload: any) {
const privateKey = randomPrivateKey();
let sdk: Sdk;
sdk = new Sdk(
{
privateKey,
},
{
networkName: 'mainnet' as NetworkNames,
}
);
console.log('sdk', sdk);
const {id} = payload;
const index = Math.abs(crc32.str('961882386960879657')).toString();
}
}`

Node version - v14.16.0

"dependencies": { "@aws-sdk/client-sqs": "^3.20.0", "@aws/dynamodb-data-mapper": "^0.7.3", "@aws/dynamodb-data-mapper-annotations": "^0.7.3", "@aws/dynamodb-expressions": "^0.7.3", "awilix": "^4.3.1", "aws-crt": "^1.11.3", "axios": "^0.26.1", "bignumber.js": "^9.0.2", "bufferutil": "^4.0.6", "crc-32": "^1.2.2", "cross-fetch": "^3.1.5", "dotenv": "^8.2.0", "ethers": "^5.5.2", "etherspot": "^1.31.0", "joi": "^17.6.0", "lodash": "^4.17.20", "pino": "^6.8.0", "reflect-metadata": "^0.1.13", "rxjs": "^6.6.2", "serverless": "^3.7.5", "serverless-export-env": "^2.1.0", "utf-8-validate": "^5.0.9", "uuid": "^8.3.2", "ws": "^8.6.0" },

"devDependencies": { "@types/aws-lambda": "^8.10.51", "@types/aws-sdk": "^2.7.0", "@types/lodash": "^4.14.165", "@types/node": "^14.11.2", "@types/pino": "^6.3.4", "@types/uuid": "^8.3.4", "gts": "^3.1.0", "mocha": "^7.1.2", "pino-pretty": "^7.5.4", "prettier": "2.2.1", "serverless-offline": "^8.5.0", "serverless-offline-sqs": "^6.0.0", "serverless-plugin-reducer": "^3.2.4", "serverless-plugin-typescript": "1.1.7", "ts-node": "^8.9.1", "typescript": "^4.0.3" },

@ferrjohnpainagan Does it occur when you run sls offline?
I have set up a small project that imports WalletService to a handler and calls getAddress().
I used the same code / deps. The only difference from your code is that I used ES6 imports (but it should not make difference)

import { ethers } from 'ethers';
import * as dotenv from 'dotenv';
import { Sdk, NetworkNames, randomPrivateKey } from 'etherspot';
import * as crc32 from 'crc-32';

So far I have not managed to reproduce it - using Serverless offline

PS. I've found a couple of similar reports and a workaround would be import the encoding module, have you tried it?

@rafaelcidade
When running sls offline, it compiles.

But the problem is it is useless if it runs on serverless offline but can't be deployed.

I'm not so sure how to exactly implement the workaround you suggested. May I know how it specifically works?

Thanks

@rafaelcidade

Manually installed encoding module and successfully deployed it. Thanks for the help!