[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
- Create a serverless function
- Initiate etherspot/sdk and log the sdk inside that serverless function
- 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
Manually installed encoding module and successfully deployed it. Thanks for the help!