mirror of
https://github.com/status-im/keycard-redeem.git
synced 2025-02-11 11:36:49 +00:00
better handling of amounts
This commit is contained in:
parent
ea6b4c00cf
commit
c42421b63f
@ -4,22 +4,25 @@ import Web3 from 'web3';
|
|||||||
import parseArgs from 'minimist';
|
import parseArgs from 'minimist';
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import { keccak256 } from 'js-sha3';
|
import { keccak256 } from 'js-sha3';
|
||||||
|
import BigNumber from 'bignumber.js'
|
||||||
|
|
||||||
const argv = parseArgs(process.argv.slice(2), {boolean: ["nft", "deploy-factory", "deploy-bucket"], string: ["sender", "factory", "bucket", "token"], default: {"endpoint": "ws://127.0.0.1:8546", "start-in-days": 0, "validity-days": 365, "max-tx-delay-blocks": 10}});
|
const argv = parseArgs(process.argv.slice(2), {boolean: ["nft", "deploy-factory", "deploy-bucket"], string: ["sender", "factory", "bucket", "token"], default: {"endpoint": "ws://127.0.0.1:8546", "start-in-days": 0, "validity-days": 365, "max-tx-delay-blocks": 10, "amount-decimals": 18}});
|
||||||
|
|
||||||
const web3 = new Web3(argv["endpoint"]);
|
const web3 = new Web3(argv["endpoint"]);
|
||||||
|
|
||||||
const classPrefix = argv["nft"] ? "NFT" : "ERC20";
|
const classPrefix = argv["nft"] ? "NFT" : "ERC20";
|
||||||
|
|
||||||
const BucketConfig = loadEmbarkArtifact(`./dist/contracts/${classPrefix}Bucket.json`);
|
const BucketConfig = loadJSON(`./dist/contracts/${classPrefix}Bucket.json`);
|
||||||
const BucketFactoryConfig = loadEmbarkArtifact(`./dist/contracts/${classPrefix}BucketFactory.json`);
|
const BucketFactoryConfig = loadJSON(`./dist/contracts/${classPrefix}BucketFactory.json`);
|
||||||
const IERC721 = loadEmbarkArtifact(`./dist/contracts/IERC721.json`);
|
const IERC721 = loadJSON(`./dist/contracts/IERC721.json`);
|
||||||
|
const IERC20Detailed = loadJSON(`./dist/contracts/IERC20Detailed.json`);
|
||||||
|
|
||||||
const BucketFactory = new web3.eth.Contract(BucketFactoryConfig["abiDefinition"]);
|
const BucketFactory = new web3.eth.Contract(BucketFactoryConfig["abiDefinition"]);
|
||||||
const Bucket = new web3.eth.Contract(BucketConfig["abiDefinition"]);
|
const Bucket = new web3.eth.Contract(BucketConfig["abiDefinition"]);
|
||||||
const ERC721 = new web3.eth.Contract(IERC721["abiDefinition"]);
|
const ERC721 = new web3.eth.Contract(IERC721["abiDefinition"]);
|
||||||
|
const ERC20 = new web3.eth.Contract(IERC20Detailed["abiDefinition"]);
|
||||||
|
|
||||||
function loadEmbarkArtifact(path) {
|
function loadJSON(path) {
|
||||||
let file = fs.readFileSync(path, "utf-8");
|
let file = fs.readFileSync(path, "utf-8");
|
||||||
let loadedAsset = JSON.parse(file);
|
let loadedAsset = JSON.parse(file);
|
||||||
return loadedAsset;
|
return loadedAsset;
|
||||||
@ -76,8 +79,7 @@ async function deployBucket(sender, factory, token, startInDays, validityInDays,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createRedeemable(sender, bucket, keycard) {
|
async function createRedeemable(sender, keycard) {
|
||||||
Bucket.options.address = bucket;
|
|
||||||
let methodCall = Bucket.methods.createRedeemable(keycard.keycard, keycard.amount, keycard.code);
|
let methodCall = Bucket.methods.createRedeemable(keycard.keycard, keycard.amount, keycard.code);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -101,11 +103,8 @@ function senderAddress(sender) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function transferNFT(sender, token, bucket, keycard) {
|
async function transferNFT(sender, keycard) {
|
||||||
Bucket.options.address = bucket;
|
let methodCall = ERC721.methods.safeTransferFrom(senderAddress(sender), Bucket.options.address, keycard.amount, createNFTData(keycard.keycard, keycard.code));
|
||||||
ERC721.options.address = token ? token : await Bucket.methods.tokenContract().call();
|
|
||||||
|
|
||||||
let methodCall = ERC721.methods.safeTransferFrom(senderAddress(sender), bucket, keycard.amount, createNFTData(keycard.keycard, keycard.code));
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let receipt = await sendMethod(methodCall, sender, ERC721.options.address);
|
let receipt = await sendMethod(methodCall, sender, ERC721.options.address);
|
||||||
@ -124,9 +123,31 @@ function processCode(code) {
|
|||||||
return "0x" + keccak256(code);
|
return "0x" + keccak256(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
function processLine(line) {
|
function processAmount(amount, decimals) {
|
||||||
|
if (amount.startsWith("0x")) {
|
||||||
|
return amount;
|
||||||
|
} else {
|
||||||
|
return new BigNumber(amount).multipliedBy(Math.pow(10, decimals)).toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function processLine(line, decimals) {
|
||||||
let c = line.split(",").map((e) => e.toLowerCase().trim());
|
let c = line.split(",").map((e) => e.toLowerCase().trim());
|
||||||
return {keycard: c[0], amount: parseInt(c[1]), code: processCode(c[2])};
|
return {keycard: c[0], amount: processAmount(c[1], decimals), code: processCode(c[2])};
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getToken(token, readIfMissing) {
|
||||||
|
return (token || !readIfMissing) ? token : await Bucket.methods.tokenContract().call();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getDecimals(decimals, readIfMissing) {
|
||||||
|
if (decimals) {
|
||||||
|
return decimals
|
||||||
|
} else if (readIfMissing) {
|
||||||
|
return await ERC20.methods.decimals().call();
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
@ -187,13 +208,23 @@ async function run() {
|
|||||||
bucket = argv["bucket"];
|
bucket = argv["bucket"];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bucket.options.address = bucket;
|
||||||
|
|
||||||
let keycards;
|
let keycards;
|
||||||
|
|
||||||
if (argv["file"]) {
|
if (argv["file"]) {
|
||||||
|
const token = await getToken(argv["token"], (argv["nft"] || !argv["amount-decimals"]));
|
||||||
|
|
||||||
|
ERC721.options.address = token;
|
||||||
|
ERC20.options.address = token;
|
||||||
|
|
||||||
|
const decimals = await getDecimals(argv["amount-decimals"], !argv["nft"]);
|
||||||
|
|
||||||
let file = fs.readFileSync(argv["file"], 'utf8');
|
let file = fs.readFileSync(argv["file"], 'utf8');
|
||||||
keycards = file.split("\n").map(processLine);
|
keycards = file.split("\n").map((line) => processLine(line, decimals));
|
||||||
|
|
||||||
for (let keycard of keycards) {
|
for (let keycard of keycards) {
|
||||||
await argv["nft"] ? createRedeemable(sender, bucket, keycard) : transferNFT(sender, argv["token"], bucket, keycard);
|
await argv["nft"] ? transferNFT(sender, keycard) : createRedeemable(sender, keycard);
|
||||||
}
|
}
|
||||||
} else if (!hasDoneSomething) {
|
} else if (!hasDoneSomething) {
|
||||||
console.error("the --file option must be specified");
|
console.error("the --file option must be specified");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user