Skip to content

Commit 1ac7574

Browse files
committed
feat: published npm package 1.0.1
it export abi and bytecode, but also helper functions `getTokenAt` and `deployToken`. All nicely typed with typechain 💪
1 parent 67f3d88 commit 1ac7574

File tree

7 files changed

+3200
-4739
lines changed

7 files changed

+3200
-4739
lines changed

README.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,39 @@
33
[![Audit by LimeChain](https://img.shields.io/badge/Audit-LimeChain-green)](https://streamr-public.s3.amazonaws.com/DATAv2_audit_LimeChain.pdf)
44
[![Audit by Isentropy](https://img.shields.io/badge/Audit-Isentropy-green)](https://streamr-public.s3.amazonaws.com/DATAv2_audit_Isentropy.pdf)
55

6+
## NPM package contents
7+
8+
JS/TypeScript utilities to get a nicely typed DATAv2 instance. Here's a sample code for plain node.js:
9+
```javascript
10+
const { JsonRpcProvider } = require("@ethersproject/providers")
11+
const { formatEther, parseEther } = require("@ethersproject/units")
12+
const { Wallet } = require("@ethersproject/wallet")
13+
const { deployToken } = require("@streamr/data-v2")
14+
15+
const key = process.env.PRIVATE_KEY
16+
const provider = new JsonRpcProvider(process.env.ETHEREUM_URL)
17+
const wallet = new Wallet(key, provider)
18+
19+
async function main() {
20+
const token = await deployToken(wallet)
21+
console.log("Before: %s", formatEther(await token.balanceOf(wallet.address)))
22+
await (await token.grantRole(await token.MINTER_ROLE(), wallet.address)).wait()
23+
await (await token.mint(wallet.address, parseEther("10"))).wait()
24+
console.log("After: %s", formatEther(await token.balanceOf(wallet.address)))
25+
}
26+
main().catch(console.error)
27+
```
28+
And here's another sample code for TypeScript, run with ts-node:
29+
```typescript
30+
import { JsonRpcProvider } from "@ethersproject/providers"
31+
import { getTokenAt } from "@streamr/data-v2"
32+
import type { DATAv2 } from "@streamr/data-v2"
33+
34+
const provider: JsonRpcProvider = new JsonRpcProvider(process.env.ETHEREUM_URL)
35+
const token: DATAv2 = await getTokenAt(process.env.TOKEN_ADDRESS, provider)
36+
console.log("Symbol:", await token.symbol())
37+
```
38+
639
## List of files
740

841
| File | Description | Deployed |

hardhat.config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require("@nomiclabs/hardhat-waffle")
22
require("solidity-coverage")
33
require("hardhat-gas-reporter")
4+
require("hardhat-typechain")
45

56
// You need to export an object to set up your config
67
// Go to https://hardhat.org/config/ to learn more
@@ -24,5 +25,9 @@ module.exports = {
2425
version: "0.4.11"
2526
}
2627
]
28+
},
29+
typechain: {
30+
outDir: "typechain",
31+
target: "ethers-v5"
2732
}
2833
}

index.d.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Signer } from "@ethersproject/abstract-signer";
2+
import { Provider } from "@ethersproject/providers";
3+
import type { DATAv2 } from "./typechain/DATAv2";
4+
export declare const abi: ({
5+
type: string;
6+
inputs: {
7+
indexed?: boolean; // events
8+
internalType: string;
9+
name: string;
10+
type: string;
11+
}[];
12+
name?: string; // constructor doesn't have name
13+
stateMutability?: string;
14+
anonymous?: boolean; // events
15+
outputs?: {
16+
internalType: string;
17+
name: string;
18+
type: string;
19+
}[];
20+
})[], bytecode: string;
21+
export type { DATAv2 };
22+
export declare function getTokenAt(address: string, signerOrProvider: Provider | Signer): DATAv2;
23+
export declare function deployToken(signer: Signer): Promise<DATAv2>;

index.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
11+
var __generator = (this && this.__generator) || function (thisArg, body) {
12+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14+
function verb(n) { return function (v) { return step([n, v]); }; }
15+
function step(op) {
16+
if (f) throw new TypeError("Generator is already executing.");
17+
while (_) try {
18+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19+
if (y = 0, t) op = [op[0] & 2, t.value];
20+
switch (op[0]) {
21+
case 0: case 1: t = op; break;
22+
case 4: _.label++; return { value: op[1], done: false };
23+
case 5: _.label++; y = op[1]; op = [0]; continue;
24+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
25+
default:
26+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30+
if (t[2]) _.ops.pop();
31+
_.trys.pop(); continue;
32+
}
33+
op = body.call(thisArg, _);
34+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36+
}
37+
};
38+
exports.__esModule = true;
39+
exports.deployToken = exports.getTokenAt = exports.bytecode = exports.abi = void 0;
40+
var contracts_1 = require("@ethersproject/contracts");
41+
var dataV2json = require("./artifacts/contracts/DATAv2.sol/DATAv2.json");
42+
exports.abi = dataV2json.abi, exports.bytecode = dataV2json.bytecode;
43+
function getTokenAt(address, signerOrProvider) {
44+
return new contracts_1.Contract(address, exports.abi, signerOrProvider);
45+
}
46+
exports.getTokenAt = getTokenAt;
47+
function deployToken(signer) {
48+
return __awaiter(this, void 0, void 0, function () {
49+
var factory, contract;
50+
return __generator(this, function (_a) {
51+
switch (_a.label) {
52+
case 0:
53+
factory = new contracts_1.ContractFactory(exports.abi, exports.bytecode, signer);
54+
return [4 /*yield*/, factory.deploy()];
55+
case 1:
56+
contract = _a.sent();
57+
return [2 /*return*/, contract.deployed()];
58+
}
59+
});
60+
});
61+
}
62+
exports.deployToken = deployToken;

index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Signer } from "@ethersproject/abstract-signer"
2+
import { Provider } from "@ethersproject/providers"
3+
import { Contract, ContractFactory } from "@ethersproject/contracts"
4+
5+
import * as dataV2json from "./artifacts/contracts/DATAv2.sol/DATAv2.json"
6+
import type { DATAv2 } from "./typechain/DATAv2"
7+
8+
export const { abi, bytecode } = dataV2json
9+
export type { DATAv2 }
10+
11+
export function getTokenAt(address: string, signerOrProvider: Provider | Signer): DATAv2 {
12+
return new Contract(address, abi, signerOrProvider) as unknown as DATAv2
13+
}
14+
15+
export async function deployToken(signer: Signer): Promise<DATAv2> {
16+
const factory = new ContractFactory(abi, bytecode, signer)
17+
const contract = await factory.deploy() as unknown as DATAv2
18+
return contract.deployed()
19+
}

0 commit comments

Comments
 (0)