diff --git a/docs/developers.md b/docs/developers.md index 3fb259a..271b449 100644 --- a/docs/developers.md +++ b/docs/developers.md @@ -11,7 +11,7 @@ The provider customizes few json-rpc methods like `eth_sendTransaction`, `eth_re ```typescript const oldProvider = window.ethereum; -const provider = await import("provider"); +const provider = await import("milkomeda-wsc-provider"); await provider.inject(oracleUrl, nodeUrl).setup(); ``` @@ -45,7 +45,7 @@ If the application requires L1 assets it is necessary that they belong to the Ac import { ethers } from "ethers"; import { Blockfrost, Lucid } from "lucid-cardano"; -const milkomedaProvider = await import("provider"); +const milkomedaProvider = await import("milkomeda-wsc-provider"); await milkomedaProvider.inject(oracleUrl, nodeUrl).setup(); const amount = 10; @@ -78,7 +78,7 @@ const txHash = await signedTx.submit(); ```typescript import { ethers } from "ethers"; -const milkomedaProvider = await import("provider"); +const milkomedaProvider = await import("milkomeda-wsc-provider"); await milkomedaProvider.inject(oracleUrl, nodeUrl).setup(); const amount = 10; @@ -102,7 +102,7 @@ const receipt = await tx.wait(); ```typescript import { ethers } from "ethers"; -const milkomedaProvider = await import("provider"); +const milkomedaProvider = await import("milkomeda-wsc-provider"); await milkomedaProvider.inject(oracleUrl, nodeUrl).setup(); const amount = 10; diff --git a/package.json b/package.json index 9cd1071..2dd4c06 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ "quorum:start": "FORCE_ALLOW_SEND_RAW_TRANSACTION=true quorum --http --datadir quorum_data --dev --rpccorsdomain '*'" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.38.0", - "eslint": "^8.23.1", + "@typescript-eslint/eslint-plugin": "^5.59.9", + "@typescript-eslint/parser": "^5.59.9", + "eslint": "^8.42.0", "pre-commit": "^1.2.2", "pre-push": "^0.1.4", "prettier": "^2.7.1", diff --git a/packages/actor-webpage/package.json b/packages/actor-webpage/package.json index 36efc14..407ef5b 100644 --- a/packages/actor-webpage/package.json +++ b/packages/actor-webpage/package.json @@ -39,7 +39,7 @@ "dotenv": "^16.3.1", "ethers": "^5.7.2", "lucid-cardano": "^0.10.1", - "milkomeda-wsc": "../milkomeda-wsc", + "milkomeda-wsc": "*", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.10.0", diff --git a/packages/contracts/README.md b/packages/contracts/README.md index 32862c8..4b68ff2 100644 --- a/packages/contracts/README.md +++ b/packages/contracts/README.md @@ -1,7 +1,7 @@ # Contracts ## Requirements -You need to have installed `solc` with version `0.8.0` or higher. If you don't have it, you can install it with following the instructions for `solc-select` [here](https://github.com/crytic/solc-select) (similar to nvm for Node.js). +You need to have installed `solc` with version `0.8.18` or higher. If you don't have it, you can install it with following the instructions for `solc-select` [here](https://github.com/crytic/solc-select) (similar to nvm for Node.js). ## Compiling diff --git a/packages/dapp-example/package.json b/packages/dapp-example/package.json index d54d0af..3858ea3 100644 --- a/packages/dapp-example/package.json +++ b/packages/dapp-example/package.json @@ -19,7 +19,7 @@ "dependencies": { "ethers": "^5.7.2", "lucid-cardano": "^0.10.1", - "milkomeda-wsc-provider": "^0.1.0", + "milkomeda-wsc-provider": "*", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.10.0" diff --git a/packages/milkomeda-wsc/.eslintrc.cjs b/packages/milkomeda-wsc/.eslintrc.cjs new file mode 100644 index 0000000..d71e89c --- /dev/null +++ b/packages/milkomeda-wsc/.eslintrc.cjs @@ -0,0 +1,10 @@ +module.exports = { + env: { + browser: true, + node: true, + jest: true, + }, + rules: { + 'no-constant-condition': 'off', + }, +}; diff --git a/packages/milkomeda-wsc/.gitignore b/packages/milkomeda-wsc/.gitignore index 567609b..d5e60da 100644 --- a/packages/milkomeda-wsc/.gitignore +++ b/packages/milkomeda-wsc/.gitignore @@ -1 +1,2 @@ build/ +.env diff --git a/packages/milkomeda-wsc/babel.config.cjs b/packages/milkomeda-wsc/babel.config.cjs new file mode 100644 index 0000000..9b7550f --- /dev/null +++ b/packages/milkomeda-wsc/babel.config.cjs @@ -0,0 +1,3 @@ +module.exports = { + presets: [['@babel/preset-env', { targets: { node: 'current' } }]], + }; diff --git a/packages/milkomeda-wsc/jest-resolver.cjs b/packages/milkomeda-wsc/jest-resolver.cjs new file mode 100644 index 0000000..9319549 --- /dev/null +++ b/packages/milkomeda-wsc/jest-resolver.cjs @@ -0,0 +1,14 @@ +module.exports = (request, options) => { + return options.defaultResolver(request, { + ...options, + packageFilter: (pkg) => { + if (pkg.name === 'node-fetch') { + return { ...pkg, main: pkg.main }; + } + return { + ...pkg, + main: pkg.module || pkg.main, + }; + }, + }); + }; diff --git a/packages/milkomeda-wsc/jest.condig.js b/packages/milkomeda-wsc/jest.condig.js new file mode 100644 index 0000000..170df5e --- /dev/null +++ b/packages/milkomeda-wsc/jest.condig.js @@ -0,0 +1,15 @@ +/** @type {import('@ts-jest/dist/types').InitialOptionsTsJest} */ +module.exports = { + verbose: true, + preset: 'ts-jest/presets/default-esm', + testEnvironment: 'node', + transform: { + '^.+\\.(t)s$': ['ts-jest', { useESM: true, }], + '^.+\\.(j)s$': 'babel-jest', + }, + resolver: '/jest-resolver.cjs', + transformIgnorePatterns: [ + '/node_modules/', + ], + modulePathIgnorePatterns: ['/build/'] +}; diff --git a/packages/milkomeda-wsc/package.json b/packages/milkomeda-wsc/package.json index 14ac964..f04fe8a 100644 --- a/packages/milkomeda-wsc/package.json +++ b/packages/milkomeda-wsc/package.json @@ -11,11 +11,18 @@ ], "scripts": { "build": "tsc", + "test": "node --experimental-vm-modules --experimental-wasm-modules --experimental-wasm-threads ../../node_modules/jest/bin/jest.js", "prepublish": "npm run build" }, "devDependencies": { + "@babel/preset-env": "^7.22.4", + "@babel/preset-typescript": "^7.21.5", "@types/lodash": "^4.14.190", "@types/node": "^18.11.9", + "@typescript-eslint/eslint-plugin": "^5.59.9", + "@typescript-eslint/parser": "^5.59.9", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", "ts-loader": "^9.4.1", diff --git a/packages/milkomeda-wsc/src/utils.ts b/packages/milkomeda-wsc/src/utils.ts index d70e9e0..d850c4e 100644 --- a/packages/milkomeda-wsc/src/utils.ts +++ b/packages/milkomeda-wsc/src/utils.ts @@ -1,6 +1,6 @@ import AssetFingerprint from "@emurgo/cip14-js"; import { bech32 } from "bech32"; -import Buffer from "buffer/"; +import Buffer from "buffer"; import { BridgeRequest } from "./MilkomedaNetwork"; export async function getFingerprintFromBlockfrost(blockfrostId: string): Promise { diff --git a/packages/milkomeda-wsc/test/simple.test.ts b/packages/milkomeda-wsc/test/simple.test.ts new file mode 100644 index 0000000..0dbe2bd --- /dev/null +++ b/packages/milkomeda-wsc/test/simple.test.ts @@ -0,0 +1,42 @@ +import { expect, jest } from "@jest/globals"; +import { BigNumber } from "bignumber.js"; +import WSCLib from "../src/wscLib"; +import { MilkomedaNetworkName } from "../src/WSCLibTypes"; +import BridgeActions from "../src/BridgeActions"; + +describe("WSCLib", () => { + let lib: WSCLib; + + beforeEach(async () => { + lib = new WSCLib(MilkomedaNetworkName.C1Devnet, "flint", { + oracleUrl: process.env.REACT_APP_WSC_ORACLE, + blockfrostKey: "preprodliMqEQ9cvQgAFuV7b6dhA4lkjTX1eBLb", + jsonRpcProviderUrl: undefined, + }); + await lib.loadLucid(); + }); + + it("should return token balances", async () => { + const balances = await lib.origin_getTokenBalances(); + expect(balances).toHaveLength(2); + expect(balances[0]).toHaveProperty("unit", "microAlgo"); + expect(balances[1]).toHaveProperty("unit", "lovelace"); + }); + + it("should unwrap tokens", async () => { + // Mock necessary methods + const mockGetAddress = jest.spyOn(lib, "origin_getAddress").mockResolvedValue("testAddress"); + const mockUnwrap = jest.spyOn(BridgeActions.prototype, "unwrap").mockResolvedValue(); + + const assetId = "assetId"; + const amount = new BigNumber(100); + + await lib.unwrap(undefined, assetId, amount); + + expect(mockGetAddress).toBeCalledTimes(1); + expect(mockUnwrap).toBeCalledWith("testAddress", assetId, amount); + // Remember to restore mocks after test + mockGetAddress.mockRestore(); + mockUnwrap.mockRestore(); + }); +}); diff --git a/packages/milkomeda-wsc/tsconfig.json b/packages/milkomeda-wsc/tsconfig.json index da931df..4cc23e1 100644 --- a/packages/milkomeda-wsc/tsconfig.json +++ b/packages/milkomeda-wsc/tsconfig.json @@ -16,8 +16,9 @@ "strict": true, "sourceMap": true, "declarationMap": true, + "esModuleInterop": true }, "include": [ - "**/*.ts" + "src/**/*" ] -} \ No newline at end of file +} diff --git a/packages/oracle/README.md b/packages/oracle/README.md index ec49fa1..cc49769 100644 --- a/packages/oracle/README.md +++ b/packages/oracle/README.md @@ -26,3 +26,25 @@ npm start ```bash cp .example.env .env ``` + +## Config + +To set the config either export environment variables or edit the `.env` file. + +```bash +# account that will be signing transactions to the actor and actor factory +# it needs to have some funds in native asset to pay for the gas +SIGNER_PRIVATE_KEY= + +# node environment +NODE_ENV=development + +# port on which the server will be running +PORT=8080 + +# address of the deployed actor factory +ACTOR_FACTORY_ADDRESS=0xE1FaA7777E8d76Cf2F7fd26eD93790d58c644b82 + +# url of the corresponding chain provider +JSON_RPC_PROVIDER_URL=https://rpc-devnet-cardano-evm.c1.milkomeda.com +```