# dmusic review
## dmusic-backend
1. `README.md`
- Running `make image`:
- missing info about requirement of `node` `yarn` `npx` installed on your machine.
- missing info about requirement of [mvn](https://maven.apache.org/run.html) installed on your machine.
- i'm blocked - it fails on `npl-maven-plugin`
```[ERROR] Plugin com.noumenadigital.platform:npl-maven-plugin:2022.1.15 or one of its dependencies could not be resolved: Failed to read artifact descriptor for com.noumenadigital.platform:npl-maven-plugin:jar:2022.1.15: Could not transfer artifact com.noumenadigital.platform:npl-maven-plugin:pom:2022.1.15 from/to noumena (https://maven.pkg.github.com/noumenadigital/packages/): authentication failed for https://maven.pkg.github.com/noumenadigital/packages/com/noumenadigital/platform/npl-maven-plugin/2022.1.15/npl-maven-plugin-2022.1.15.pom, status: 401 Unauthorized -> [Help 1]```
- generally speaking it's an antipattern to require installation of global dependencies, especially when part of the repo is dockerized.
2. [`casper-connector`](https://github.com/NoumenaDigital/dmusic-backend/tree/master/casper-connector)
- at the first sight I recommend to use some linting & formatting tools - [JavaScript Standard Style](https://standardjs.com/) is popular, ready to use solution. Another one is eslint + prettier.
- [storing secret keys in a repo](https://github.com/NoumenaDigital/dmusic-backend/tree/master/casper-connector/files) is for sure an anti-pattern and unsafe.
- [casperConnector.ts#L17](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L17) - not a good practice to hardcode some external URL even as a fallback.
- [casperConnector.ts#L18](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L18) - same as above, network name shouldn't be hardcoded - I would throw an error when it is missing.
- [casperConnector.ts#L19](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L19) - usused variable.
- [casperConnector.ts#L21-L24](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L21-L24) - unused variable.
- [casperConnector.ts#L26-L27](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L26-L27) - unused variable.
- [casperConnector.ts#L29-L33](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L29-L33) - unused variable.
- [casperConnector.ts#L38-L50](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L38-L50) - you don't need to parse a secret keys as a files - you just need one private key as an env variable - this is how to parse it as a string (typescript example):
```
import {
Keys,
decodeBase64
} from "casper-js-sdk";
enum KEY_VARIANTS {
ED25519,
SECP256K1,
}
export const getKeysFromHexPrivKey = (
key: string,
variant: KEY_VARIANTS
): Keys.AsymmetricKey => {
const rawPrivKeyBytes = decodeBase64(key);
let keyPair: Keys.AsymmetricKey;
if (variant === KEY_VARIANTS.SECP256K1) {
const privKey = Keys.Secp256K1.parsePrivateKey(rawPrivKeyBytes);
const pubKey = Keys.Secp256K1.privateToPublicKey(privKey);
keyPair = new Keys.Secp256K1(pubKey, privKey);
return keyPair;
}
if (variant === KEY_VARIANTS.ED25519) {
const privKey = Keys.Ed25519.parsePrivateKey(rawPrivKeyBytes);
const pubKey = Keys.Ed25519.privateToPublicKey(privKey);
keyPair = Keys.Ed25519.parseKeyPair(pubKey, privKey);
console.log(`Public key hex: ${keyPair.publicKey.toHex()}`);
return keyPair;
}
throw Error("Unsupported key type");
};
```
- [casperConnector.ts#L60](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L60) - you're using this connector with multiple contracts at the same time? if so, this is potentially unsafe to change the contract hashes in a runtime and it may cause some race condition issues. My suggestion is to set `contractHash` in a constructor and use one instance of `CasperConnector` to handle one contract at a time.
- [casperConnector.ts#L62](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L62) - `publicKey` is not a good name, maybe `owner` or `recipient` would be better.
- [casperConnector.ts#L84](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L84) - it's oversimplification - there potentialy might be more invalid params than just contract hash.
- [casperConnector.ts#L94](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L94) - same as before, multi contract usage?
- [casperConnector.ts#L113](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L113)
- [casperConnector.ts#L170](https://github.com/NoumenaDigital/dmusic-backend/blob/master/casper-connector/src/casper/casperConnector.ts#L170) - no need to recreate an `CasperClient` instance everytime on a function call. Would move it to constructor.