@newcoin-foundation/newcoin-sdk
Version:
SDK for Newcoin blockchain
790 lines (628 loc) • 29.1 kB
text/typescript
//import exp from 'constants';
//import { TransactResult } from 'eosjs/dist/eosjs-api-interfaces';
//import { isObjectBindingPattern } from 'typescript';
import { devnet_urls, devnet_services, NCO_BlockchainAPI } from '../../src';
import {
//NCKeyPair,
NCCreateUser, NCCreateCollection, NCCreatePool,
NCCreatePermission, NCLinkPerm,
NCStakeMainDao,
NCCreateDao, NCCreateDaoProposal, NCCreateDaoUserWhitelistProposal,
NCApproveDaoProposal, NCDaoProposalVote, NCDaoWithdrawVoteDeposit,
NCExecuteDaoProposal, NCGetDaoProposals, NCGetVotes,
NCStakePool, NCUnstakePool,
NCMintAsset, NCTxNcoBal, //NCTxBal,
NCGetAccInfo,
NCReturnTxs, NCReturnInfo,NCGetDaoWhiteList,
default_schema,
SBT_NFT_schema,
//NCBuyRam
} from "../../src/types";
import { normalizeUsername } from '../../src/utils';
//import * as nco from 'newcoin';
let randomname= () => " ".repeat(9).split("").map(_ => String.fromCharCode(Math.floor(Math.random() * (122 - 97) + 97))).join("") + ".io"
let name = randomname();
console.log(name);
//defaults pre-generation
let pub_key_active = "EOS8KnfBrVCvdWr1JXybAcMvz8NjqB3XLArEAzRm7wLJchWKw6NFM";
let prv_key_active = "5JLUzZYfMJUim4KPdGw1ipA8i4Std8QM4hunnvwaesqgRfWiD3j";
let pub_key_owner = "EOS6j3ATfMaBRM7DnGHqZ8Miqw4ah1awgtpbriq4zubfdhey9pcDx";
// @ts-ignore
let prv_key_owner = "5JvR9dzATtTkPPDcUdNZzQ8Grp6w4eKJz4xqomCx9T7M9VCaQgN";
let pub_key_comm = "EOS5wzNPC5WM73cC3ScApobLgGABMuMSrdJB9b4RqZraGg3BEWnP9";
// @ts-ignore
let prv_key_comm = "5J4twVpFc1dKsqUmcyvUZg5kQ1ofNTJAWZn5xPwsDGo6MkCRpZ2";
let pool_code: string;
let dao_id: string = "160";
// @ts-ignore
let io_vote_id: string = "100";
//@ts-ignore
let wait = (t) => new Promise((res) => setTimeout(res, t));
const api = new NCO_BlockchainAPI(
devnet_urls, devnet_services, true
);
describe("Basic blockchain operations", () => {
describe("test template", () => {
it("test template", async () => {
let resp = "test template shows tests are running" ;
console.log(resp);
return resp;
}, 1000);
});
describe.skip("custom test", () => {
it("custom code", async () => {
//let n: NCGetDaoProposals = { dao_owner: "testaaagt.io",] reverse: false }
//const resp = await api.getDaoWhitelistProposals(n);
//console.log(JSON.stringify(resp));
}, 15000);
});
describe("create key pair", () => {
it("key pair create", async () => {
let resp = await api.createKeyPair();
console.log("Keys owner generated: \n Prv: %s \n Pub: %s\n", resp.prv_key, resp.pub_key);
pub_key_owner = resp.pub_key;
prv_key_owner = resp.prv_key;
resp = await api.createKeyPair();
console.log("Keys active generated: \n Prv: %s \n Pub: %s\n", resp.prv_key, resp.pub_key);
pub_key_active = resp.pub_key;
prv_key_active = resp.prv_key;
resp = await api.createKeyPair();
console.log("Keys comm generated: \n Prv: %s \n Pub: %s\n", resp.prv_key, resp.pub_key);
pub_key_comm = resp.pub_key;
prv_key_comm = resp.prv_key;
return resp;
}, 60000);
});
describe("open account transaction", () => {
it("create acc", async () => {
let nco_struct : NCCreateUser = {
newUser: name,
newacc_pub_active_key: pub_key_active,
newacc_pub_owner_key: pub_key_owner,
payer: "io",
payer_prv_key: "5KdRwMUrkFssK2nUXASnhzjsN1rNNiy8bXAJoHYbBgJMLzjiXHV",
ram_amt : 8196,
cpu_amount : "100.0000 NCO",
net_amount : "100.0000 NCO",
xfer : true, // stake or transfer CPU/NET to the account
};
let resp : NCReturnTxs = await api.createUser(nco_struct) ;
console.log(resp);
expect(typeof resp.TxID_createAcc).toBe('string');
}, 30000)
});
describe("create collection transaction", () => {
it("create default generic user collection", async () => {
let col = normalizeUsername(name, "z"); // name.replace(/\./g, 'z' + 'z'.repeat(d));
let sch = normalizeUsername(name, "w"); // name.replace(/\./g, 'w' + 'w'.repeat(d));
let tpn = normalizeUsername(name, "t"); // name.replace(/\./g, 't' + 't'.repeat(d));
let nco_struct : NCCreateCollection = {
user: name,
collection_name: col,
schema_name: sch,
schema_fields: default_schema,
template_name: tpn,
template_fields: [],
user_prv_active_key: prv_key_active,
allow_notify: true,
mkt_fee : 0.05,
xferable : true,
burnable : true,
max_supply : 0xffff
};
let resp : NCReturnTxs = await api.createCollection(nco_struct);
console.log(resp);
expect(typeof resp.TxID_createCol).toBe('string');
expect(typeof resp.TxID_createSch).toBe('string');
//expect(typeof resp.TxID_createTpl).toBe('string');
}, 60000);
it.skip("create special non-transf collection", async () => {
let nco_struct : NCCreateCollection = {
user: "io",
user_prv_active_key: "5KdRwMUrkFssK2nUXASnhzjsN1rNNiy8bXAJoHYbBgJMLzjiXHV",
collection_name:"sbtcollctn11",
schema_name: "sbtschemaa11",
schema_fields: SBT_NFT_schema,
template_name: "-1",
template_fields: [],
allow_notify: true,
mkt_fee : 0.00,
xferable : false,
burnable : false,
max_supply : 0xffffff
};
let resp : NCReturnTxs = await api.createCollection(nco_struct);
console.log(resp);
expect(typeof resp.TxID_createCol).toBe('string');
expect(typeof resp.TxID_createSch).toBe('string');
//expect(typeof resp.TxID_createTpl).toBe('string');
}, 60000);
});
describe("create permission for an account under active", () => {
it("create permission", async () => {
let n: NCCreatePermission = {
author: name,
perm_name: 'nwpermission',
author_prv_active_key: prv_key_active,
perm_pub_key: pub_key_comm
} ;
console.log("creating permission %s for account %s", n.perm_name, n.author);
let resp: NCReturnTxs = await api.createPermission(n);
console.log(resp);
expect(typeof resp.TxID_createPerm).toBe('string');
}, 60000);
});
describe("link permission for an account under active", () => {
it("link permission", async () => {
let n: NCLinkPerm = {
author: name,
perm_to_link: 'nwpermission',
author_prv_active_key: prv_key_active,
action_owner: "atomicassets",
action_to_link: "mintasset" // for an example
} ;
console.log("linking permission %s for account %s to trigger %s on %s",
n.perm_to_link, n.author, n.action_to_link, n.action_owner);
let resp: NCReturnTxs = await api.linkPermission(n);
console.log(resp);
expect(typeof resp.TxID_linkPerm).toBe('string');
}, 60000);
});
describe("tx NCO transaction", () => {
it("tx nco balance", async () => {
let n: NCTxNcoBal = {
to: name,
amt: '1000.0000 NCO',
payer:'io',
memo: 'initial balance transfer',
payer_prv_key: "5KdRwMUrkFssK2nUXASnhzjsN1rNNiy8bXAJoHYbBgJMLzjiXHV"
};
let resp :NCReturnTxs = await api.txNCOBalance(n) ;
console.log(resp);
expect(typeof resp.TxID).toBe('string');
}, 60000)
});
describe("'create pool' transaction", () => {
it("create pool", async () => {
let n: NCCreatePool = {
owner: name,
owner_prv_active_key: prv_key_active
} ;
let resp :NCReturnTxs = await api.createPool(n) ;
console.log(resp);
expect(typeof resp.TxID_createPool).toBe('string');
}, 60000)
});
describe("stake to MainDAO pool transaction", () => {
it("stake maindao pool", async () => {
let n: NCStakeMainDao = {
amt: '1000.0000 NCO',
payer: name,
payer_prv_key: prv_key_active
} ;
let resp : NCReturnTxs = await api.stakeMainDAO(n) ;
console.log(resp);
expect(typeof resp.TxID_stakeMainDAO).toBe('string');
}, 60000)
});
describe("instant unstake MainDAO pool transaction", () => {
it("unstake maindao pool", async () => {
let n: NCStakeMainDao = {
amt: '100.0000 GNCO',
payer: name,
payer_prv_key: prv_key_active
} ;
// check balance?
let resp : NCReturnTxs = await api.instUnstakeMainDAO(n) ;
console.log(resp);
expect(typeof resp.TxID_unstakeMainDAO).toBe('string');
}, 60000)
});
describe("delayed unstake MainDAO pool transaction", () => {
it("delayed unstake maindao pool", async () => {
let n: NCStakeMainDao = {
amt: '100.0000 GNCO',
payer: name,
payer_prv_key: prv_key_active
} ;
let resp : NCReturnTxs = await api.dldUnstakeMainDAO(n) ;
console.log(resp);
expect(typeof resp.TxID_unstakeMainDAO).toBe('string');
}, 60000)
});
describe("stake to pool transaction", () => {
it("stake pool", async () => {
let n: NCStakePool = {
owner: name,
amt: '100.0000 GNCO',
payer: name,//'io',
payer_prv_key: prv_key_active//"5KdRwMUrkFssK2nUXASnhzjsN1rNNiy8bXAJoHYbBgJMLzjiXHV"
} ;
let resp : NCReturnTxs = await api.stakePool(n) ;
console.log(resp);
pool_code = resp.pool_code as string;
expect(pool_code).toBeDefined();
expect(typeof resp.TxID_stakePool).toBe('string');
}, 60000);
});
describe("IO stake to pool transaction", () => {
it("stake pool", async () => {
let n: NCStakePool = {
owner: name,
amt: '100.0000 GNCO',
payer: 'io',
payer_prv_key: "5KdRwMUrkFssK2nUXASnhzjsN1rNNiy8bXAJoHYbBgJMLzjiXHV"
} ;
let resp : NCReturnTxs = await api.stakePool(n) ;
console.log(resp);
pool_code = resp.pool_code as string;
expect(pool_code).toBeDefined();
expect(typeof resp.TxID_stakePool).toBe('string');
}, 60000);
});
describe("unstake from pool transaction", () => {
it("withdraw from pool", async () => {
expect(pool_code).toBeDefined();
const n: NCUnstakePool = {
amt: '5.0000 '+pool_code,
payer: name, //"io",
payer_prv_key: prv_key_active//"5KdRwMUrkFssK2nUXASnhzjsN1rNNiy8bXAJoHYbBgJMLzjiXHV"//
} ;
console.log("unstake action: "+ JSON.stringify(n));
let resp : NCReturnTxs = await api.unstakePool(n) ;
console.log(resp);
expect(typeof resp.TxID_unstakePool).toBe('string');
}, 60000)
});
describe("'create dao' transaction", () => {
it("create dao", async () => {
let n: NCCreateDao = {
author: name,
author_prv_key: prv_key_active,
descr: "test DAO by "+ name
} ;
let resp :NCReturnTxs = await api.createDao(n) ;
console.log(resp);
expect(typeof resp.TxID_createDao).toBe('string');
}, 60000)
});
describe("'create whitelist proposal' transaction", () => {
it("create whitelist proposal", async () => {
let start = new Date();
let end = start;
start = new Date(start.setSeconds(start.getSeconds() + 7));
end = new Date(end.setSeconds(end.getSeconds() + 27));
let n: NCCreateDaoUserWhitelistProposal = {
proposer: name,
proposer_prv_key: prv_key_active,
dao_owner:name,
vote_start: start.toISOString().slice(0,-5), //now.toISOString(),
vote_end: end.toISOString().slice(0,-5), //new Date(now.getTime()+ 8*24*60*60*1000).toISOString()
user: "io"
} ;
console.log("Arguments for whitelist user proposal creation : " + JSON.stringify(n));
let resp :NCReturnTxs = await api.createDaoUserWhitelistProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_createDaoProposal).toBe('string');
// @ts-ignore
dao_id = resp.dao_id.toString() ;
// @ts-ignore
expect(~~dao_id).toBeGreaterThan(0);
}, 60000)
});
describe("get whitelist proposal by ID", () => {
it("get proposal by id", async () => {
let n: NCGetDaoProposals = {
proposal_id: "0",
dao_id: dao_id
};
console.log("Arguments for DAO proposal search: " + JSON.stringify(n));
let resp = await api.getDaoWhitelistProposal(n);
console.log(JSON.stringify(resp));
console.log(
"Quantities: "
+ " --- Vote YES: " + JSON.stringify(resp.rows[0].vote_yes)
+ " --- Vote NO: " + JSON.stringify(resp.rows[0].vote_no ));
expect(resp.rows[0].id).toBe(0);
}, 60000)
});
describe("list whitelist proposals", () => {
it("list whitelist proposals for dao", async () => {
let n: NCGetDaoProposals = {
dao_owner: name,
//proposal_author: name
};
//console.log("Arguments for DAO proposal list: " + JSON.stringify(n));
let resp = await api.listDaoWhitelistProposals(n);
console.log("list of WL proposals " + JSON.stringify(resp));
// @ts-ignore
expect(resp.list[0].id).toBe(0);
}, 60000)
});
describe("'approve whitelist proposal' transaction", () => {
it("approve WL proposal", async () => {
let n: NCApproveDaoProposal = {
approver: name, approver_prv_key: prv_key_active,
dao_owner: name, proposal_id: 0
};
console.log("Arguments for DAO proposal approval: " + JSON.stringify(n));
let resp :NCReturnTxs = await api.approveDaoWhitelistProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_approveDaoProposal).toBe('string');
}, 60000)
});
describe("vote dao whitelist proposal transaction", () => {
it("vote proposal",async () => {
let n: NCDaoProposalVote = {
voter: name, voter_prv_key: prv_key_active,
dao_id: dao_id,
proposal_id: "0",
proposal_type: "whitelist",
quantity: "3.1000 " + pool_code,
option: "YES"
};
console.log("Arguments for Voting whitelist: " + JSON.stringify(n));
let resp :NCReturnTxs = await api.voteOnProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_voteDaoProposal).toBe('string');
}, 30000);
});
describe("'execute whitelist proposal' transaction", () => {
it("execute whitelist proposal", async () => {
console.log("waiting 40 sec .... ");
await wait(40000);
let n: NCExecuteDaoProposal = {
exec: name,
exec_prv_key: prv_key_active,
dao_owner: name,
proposal_id: 0
};
console.log("Arguments for WL proposal execution: " + JSON.stringify(n));
let resp :NCReturnTxs = await api.executeDaoWhitelistProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_executeDaoProposal).toBe('string');
}, 60000)
});
describe("get whitelist by daoID", () => {
it("get whitelist by daoid", async () => {
let n: NCGetDaoWhiteList = {
dao_id: dao_id
};
console.log("Arguments for whitelist search: " + JSON.stringify(n));
let resp = await api.getDaoWhitelist(n);
console.log(JSON.stringify(resp));
//expect(resp.rows[0].id).toBe(0);
}, 60000)
});
describe("'create dao proposal' transaction", () => {
it("create dao proposal", async () => {
let start = new Date();
let end = start;
start = new Date(start.setSeconds(start.getSeconds() + 10));
end = new Date(end.setSeconds(start.getSeconds() + 20));
console.log("start vote: " + start);
console.log("end vote: " + end);
//end.setMinutes(start.getMinutes() + 1);
let n: NCCreateDaoProposal = {
proposer: name,
proposer_prv_key: prv_key_active,
dao_owner:name,
title: "Latest news",
summary: "Don't panic",
url: "meduza.io",
vote_start: start.toISOString().slice(0,-5), //now.toISOString(),
vote_end: end.toISOString().slice(0,-5) //new Date(now.getTime()+ 8*24*60*60*1000).toISOString()
} ;
console.log("Arguments for DAO proposal creation : " + JSON.stringify(n));
let resp :NCReturnTxs = await api.createDaoProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_createDaoProposal).toBe('string');
// @ts-ignore
dao_id = resp.dao_id.toString() ;
// @ts-ignore
expect(~~dao_id).toBeGreaterThan(0);
}, 60000)
});
describe("'approve dao proposal' transaction", () => {
it("approve dao proposal", async () => {
let n: NCApproveDaoProposal = {
approver: name,
approver_prv_key: prv_key_active,
dao_owner: name,
proposal_id: 0
};
console.log("Arguments for DAO proposal approval: " + JSON.stringify(n));
let resp :NCReturnTxs = await api.approveDaoProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_approveDaoProposal).toBe('string');
}, 60000)
});
describe("get DAO proposal by ID", () => {
it("get proposal by id", async () => {
let n: NCGetDaoProposals = {
proposal_id: "0",
dao_id: dao_id
};
console.log("Arguments for DAO proposal search: " + JSON.stringify(n));
let resp = await api.getDaoProposal(n);
console.log(JSON.stringify(resp));
console.log(
"Quantities: "
+ " --- Vote YES: " + JSON.stringify(resp.rows[0].vote_yes)
+ " --- Vote NO: " + JSON.stringify(resp.rows[0].vote_no ));
expect(resp.rows[0].id).toBe(0);
}, 60000)
});
describe("list proposals", () => {
it("list proposals for dao", async () => {
let n: NCGetDaoProposals = {
dao_owner: name
};
//console.log("Arguments for DAO proposal list: " + JSON.stringify(n));
let resp = await api.listDaoProposals(n);
console.log("list of DAO proposals " + JSON.stringify(resp));
// @ts-ignore
expect(resp.list[0].id).toBe(0);
}, 60000)
});
describe("vote dao proposal transaction", () => {
it("vote DAO proposal",async () => {
let n: NCDaoProposalVote = {
voter: name,
voter_prv_key: prv_key_active,
dao_id: dao_id,
proposal_id: "0",
proposal_type: "standart",
quantity: "2.1000 " + pool_code,
option: "YES"
};
console.log("Arguments for Voting: " + JSON.stringify(n));
let resp :NCReturnTxs = await api.voteOnProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_voteDaoProposal).toBe('string');
}, 45000);
});
describe(" whitelisted IO vote dao proposal transaction", () => {
it("IO vote proposal",async () => {
let n: NCDaoProposalVote = {
voter: "io",
voter_prv_key: "5KdRwMUrkFssK2nUXASnhzjsN1rNNiy8bXAJoHYbBgJMLzjiXHV",
dao_id: dao_id,
proposal_id: "0",
proposal_type: "standart",
quantity: "2.5000 " + pool_code,
option: "NO"
};
console.log("Arguments for Voting: " + JSON.stringify(n));
let resp :NCReturnTxs = await api.voteOnProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_voteDaoProposal).toBe('string');
}, 45000);
});
describe("'execute dao proposal' transaction", () => {
it("execute dao proposal", async () => {
console.log("waiting 25 sec .... ");
await wait(25000);
let n: NCExecuteDaoProposal = {
exec: name,
exec_prv_key: prv_key_active,
dao_owner: name,
proposal_id: 0
};
console.log("Arguments for DAO proposal execution: " + JSON.stringify(n));
let resp :NCReturnTxs = await api.executeDaoProposal(n) ;
console.log(resp);
expect(typeof resp.TxID_executeDaoProposal).toBe('string');
}, 60000)
});
// ================= minting ==================================================
describe("mint ERC721 asset", () => {
it("Mint asset", async () => {
let test = "1".repeat(64);
let n: NCMintAsset = {
creator: name,
payer: name,
payer_prv_key: prv_key_active,
immutable_data: [
{'key': 'name', 'value': ['string', name+'_'+(new Date()).getTime()]},
{'key': 'description','value': ['string', 'demo nft']},
{'key': 'image','value': ['string', 'https://storage.googleapis.com/opensea-prod.appspot.com/creature/50.png']},
{'key': "external_url",'value':['string', '']},
{'key': 'content_type','value':['string', 'text']},
{'key': 'content','value':['string', test]},
{'key': "license",'value':['string', 'CC-EX-123456']},
//{'key': "template_name"}, {'value': ['string', '']},
//{'key': "attributes"}, { 'value': ['string[]', []] }
],
mutable_data: [
//{'key': 'storage', 'value': ['string', test]}
]
};
let resp :NCReturnTxs = await api.mintAsset(n) ;
console.log(resp);
expect(typeof resp.TxID_mintAsset).toBe('string');
}, 60000);
it("Mint SBT", async () => {
//let test = "1".repeat(64);
let n: NCMintAsset = {
creator: name,
//col_name: "sbtcollctn11",
sch_name: normalizeUsername(name, "s"),
payer: name,
payer_prv_key: prv_key_active,
immutable_data: [
{'key': 'name', 'value': ['string', name+'_'+(new Date()).getTime()]},
{'key': 'description','value': ['string', 'demo nft']},
{'key': 'image','value': ['string', 'https://storage.googleapis.com/opensea-prod.appspot.com/creature/50.png']},
{ 'key': 'type', 'value':['string', 'non transferable SBT'] },
{ 'key': 'issuer', 'value': ['string', 'io'] },
{ 'key': 'recipient','value': ['string', name] },
{ 'key': 'quantifiers','value': ['string', ''] },
{ 'key': 'signature', 'value': ['string', 'SIG_example'] },
{ 'key': 'content', 'value': ['string', 'example JSON here'] },
{ 'key': 'version', 'value': ['string', '1.0']}
],
mutable_data: [
//{'key': 'storage', 'value': ['string', test]}
]
};
let resp :NCReturnTxs = await api.mintAsset(n) ;
console.log(resp);
expect(typeof resp.TxID_mintAsset).toBe('string');
}, 60000);
});
//jest.retryTimes(3);
describe("get DAO whitelist", () => {
it("get dao whitelist", async () => {
let n: NCGetDaoWhiteList = {
dao_id: "97"
};
let resp = await api.getDaoWhitelist(n);
console.log(JSON.stringify(resp));
expect(resp.rows.length).toBe(2);
}, 60000)
});
describe("list votes", () => {
it("list votes for a proposer", async () => {
let n: NCGetVotes = {
voter: "testaaagt.io",
lower_bound: "2",
limit: "12"
};
console.log("Arguments for DAO votes list: " + JSON.stringify(n));
let resp = await api.getVotes(n);
console.log("Answer" + JSON.stringify(resp));
//console.log("Quantity field: " + JSON.stringify(resp.rows[0].quantity));
expect(resp.rows[0].id).toBe(0);
}, 60000)
});
describe("get vote deposit back", () => {
it("vote deposit back", async () => {
let n: NCDaoWithdrawVoteDeposit = {
voter: name,
voter_prv_key: prv_key_active,
vote_id: "0",
};
console.log("Arguments for get vote depost back : " + JSON.stringify(n));
let resp = await api.withdrawVoteDeposit(n);
//console.log("Answer" + JSON.stringify(resp));
//console.log("Quantity field: " + JSON.stringify(resp.rows[0].quantity));
expect(typeof resp.TxID_WithdrawVoteDeposit).toBe('string');
}, 60000)
});
describe("get account pools balances", () => {
it("get pool balances", async () => {
let n: NCGetAccInfo = { owner: 'io', contract: 'pools2.nco' } ;
let resp:NCReturnInfo = { acc_balances: [] }
resp = await api.getAccountBalance(n) as NCReturnInfo ;
console.log("NEW POOL COINS" + JSON.stringify(resp));
n.contract = "pool.nco";
resp = await api.getAccountBalance(n) as NCReturnInfo ;
console.log("GNCO balance" + JSON.stringify(resp));
if(resp.acc_balances)
expect(typeof resp.acc_balances[0]).toBe('string');
else
expect(false).toBe(true);
}, 60000)
});
});