Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

start.ts 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import * as dotevnv from "dotenv"
  2. import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256
  3. ,Transaction,formatEther,
  4. ZeroHash,ethers,keccak256,id
  5. } from 'ethers'
  6. import {Calulator} from "../inc/calc";
  7. import axios from "axios";
  8. import {
  9. SecurityToken,
  10. SecurityToken__factory,
  11. } from '../typechain'
  12. import chalk from "chalk";
  13. import {checkReceipt,checkReceipt2, setProvider,getDeploymentAddresses,
  14. getElapsed, sleep,getBlockInfo} from '../inc/util'
  15. dotevnv.config();
  16. if (!process.env.RPCURL) {
  17. console.log(`No rpcur value specified...`)
  18. }
  19. async function getNonce(addr: string): Promise<number> {
  20. const nonce = await provider.getTransactionCount(addr);
  21. return nonce;
  22. }
  23. async function spareToken(symbol: string , amount: number = 50000) {
  24. const proxy = getDeploymentAddresses(symbol).address;
  25. console.log(`토큰 주소 : ${proxy}`);
  26. const token = new SecurityToken__factory(issuer).attach(proxy) as SecurityToken;
  27. const adminToken = await token.connect(admin);
  28. const n = await token.decimals();
  29. const decimals = Number(n);
  30. const digit = 10 ** Number(decimals);
  31. const ops = await token.operators();
  32. console.log(ops);
  33. let operatorRegistered = false;
  34. for(let i = 0; i < ops.length; i++) {
  35. //console.log(`${ops[i].toLocaleLowerCase()} == ${issuer.address.toLocaleLowerCase()}`)
  36. if( ops[i].toLocaleLowerCase() == issuer.address.toLocaleLowerCase()) {
  37. operatorRegistered = true;
  38. }
  39. }
  40. if(!operatorRegistered) {
  41. console.log('issuer not registered as operator .. so register');
  42. let ret = await adminToken.grantRole( id('OPERATOR_ROLE'),issuer,{ gasLimit: 20000000});
  43. await ret.wait();
  44. }
  45. const partitions = await token.getDefaultPartitions();
  46. console.log(partitions);
  47. let balance = await token.balanceOf(firstHolder);
  48. console.log(`initial balance = ${balance}`);
  49. let addressesToKyc = [];
  50. let b = await token.isTokenHolderKYC(firstHolder);
  51. if(!b) {
  52. console.log('firstHolder needs to be registered');
  53. addressesToKyc.push(firstHolder);
  54. }
  55. b = await token.isTokenHolderKYC(holder1.address);
  56. if(!b) {
  57. console.log('holder1 needs to be registered');
  58. addressesToKyc.push(holder1.address);
  59. }
  60. b = await token.isTokenHolderKYC(holder2.address);
  61. if(!b) {
  62. console.log('holder1 needs to be registered');
  63. addressesToKyc.push(holder2.address);
  64. }
  65. if(addressesToKyc.length != 0) {
  66. let r = await token.KYCtokenHolders(addressesToKyc);
  67. await r.wait();
  68. }
  69. balance = await token.balanceOf(holder1);
  70. let fixedBalance = (1/digit) * Number(balance);
  71. console.log(`holder1(${holder1.address}) balance = ${fixedBalance.toFixed(decimals)}`);
  72. if(Number(balance) == 0) {
  73. console.log('holder1 needs to be filled..');
  74. let r = await token.operatorTransferByPartition(partitions[0],firstHolder,holder1, amount * digit,ZeroHash,ZeroHash,{gasLimit: 20000000});
  75. await r.wait();
  76. }
  77. balance = await token.balanceOf(holder2);
  78. fixedBalance = (1/digit) * Number(balance);
  79. console.log(`holder2(${holder2.address}) balance = ${fixedBalance.toFixed(decimals)}`);
  80. if(Number(balance) == 0) {
  81. console.log('holder2 needs to be filled..');
  82. let r = await token.operatorTransferByPartition(partitions[0],firstHolder,holder2, amount * digit,ZeroHash,ZeroHash,{gasLimit: 20000000});
  83. await r.wait();
  84. }
  85. }
  86. function getAuthHeader(token: string) : any{
  87. return {
  88. headers: {
  89. 'Content-Type': 'application/json;charset=UTF-8',
  90. 'Access-Control-Allow-Origin': '*',
  91. 'Authorization': `Bearer ${token}`
  92. }
  93. };
  94. }
  95. async function getBalance(symbol: string, address: string ): Promise<number> {
  96. const path = `holders/${address}/tokens/${symbol}/balance`;
  97. const ret = await axios.get(gateWay + path, getAuthHeader(authToken));
  98. return ret.data;
  99. }
  100. async function getTx(signerAddress:string, tokenSymbol: string, from: string, to: string, value: number) : Promise<any> {
  101. const path = 'transfer/tx/data';
  102. const ret = await axios.post(gateWay + path, {
  103. signerAddress,
  104. tokenSymbol,
  105. transfers : [{
  106. partitionName:'초기',
  107. from,
  108. to,
  109. value,
  110. data:'0x0000000000000000000000000000000000000000000000000000000000000000',
  111. operatorData:'0x0000000000000000000000000000000000000000000000000000000000000000'
  112. }]
  113. },getAuthHeader(authToken));
  114. return ret;
  115. }
  116. async function send(signedTransaction: string) {
  117. const path = 'transaction/send';
  118. const ret = await axios.post(gateWay + path, {
  119. signedTransaction
  120. },getAuthHeader(authToken));
  121. return ret;
  122. }
  123. async function sign(tx: Transaction,signer: Wallet) : Promise<any> {
  124. const signed = await signer.signTransaction(tx);
  125. return {nonce: tx.nonce, sig: signed , txid: keccak256(signed)}
  126. }
  127. async function transfer(signer: Wallet,symbol:string,from: Wallet, to: Wallet, amount: number = 1, count: number = 10) {
  128. const proxy = getDeploymentAddresses(symbol).address;
  129. console.log(`토큰 주소 : ${proxy}`);
  130. const token = new SecurityToken__factory(issuer).attach(proxy) as SecurityToken;
  131. const decimals = await token.decimals();
  132. const digit = 10 ** Number(decimals);
  133. let fb = await getBalance(symbol,from.address);
  134. let tb = await getBalance(symbol,to.address);
  135. fb = (1/digit) * fb;
  136. tb = (1/digit) * tb;
  137. console.log(chalk.yellow('###################### 전송전 잔고 ###################################'))
  138. console.log(`balance of sender(${from.address}) = ${fb.toFixed(Number(decimals))}\r\nbalance of receiver(${to.address}) = ${tb.toFixed(Number(decimals))}`);
  139. let firstTx:string = null;
  140. let lastTx:string = null;
  141. let start = Date.now();
  142. console.log(chalk.cyan(`전송시작 시간 : ${new Date(start).toUTCString()}`));
  143. let unsignedProms = [];
  144. for(let i = 0; i < count; i++) {
  145. unsignedProms.push(getTx(signer.address,symbol,from.address,to.address, amount * digit));
  146. }
  147. let txMap = new Map<string,boolean>();
  148. let unsigned = await Promise.all(unsignedProms);
  149. let signedProms = [];
  150. unsigned.forEach(u => {
  151. const tx = Transaction.from(u.data);
  152. signedProms.push(sign(tx,signer));
  153. });
  154. let signedData = await Promise.all(signedProms);
  155. const elapsed = getElapsed(start,1000);
  156. console.log(`TxPrepared within ${elapsed} seconds`);
  157. console.log(chalk.yellow(`sending ${count} transactions`));
  158. start = Date.now();
  159. console.log(chalk.cyan(`실제 전송시작 시간 : ${new Date(start).toUTCString()}`));
  160. let proms = [];
  161. for(let i = 0; i < count; i++) {
  162. //console.log(`sending ${i} , nonce : ${signedData[i].nonce}`);
  163. proms.push(send(signedData[i].sig));
  164. }
  165. let resolved = await Promise.all(proms);
  166. resolved.forEach(tx => {
  167. txMap.set(tx.data.transactionHash,false)
  168. //console.log(tx.data.transactionHash);
  169. });
  170. console.log(`sent txid count = ${txMap.size}`);
  171. let nonce = 0;
  172. signedData.forEach( tx => {
  173. if(tx.nonce > nonce) {
  174. lastTx = tx.txid;
  175. }
  176. })
  177. const blockHashes = await checkReceipt2(txMap,[firstTx as string, lastTx as string], 'wait for receipt...');
  178. //const firstBlockHash = blockHashes.get(firstTx);
  179. const lastBlockHash = blockHashes.get(lastTx);
  180. //console.log(`firstBlockHash = ${firstBlockHash} \nlastBlockHash = ${lastBlockHash}`);
  181. console.log(`lastBlockHash = ${lastBlockHash}`);
  182. fb = await getBalance(symbol,from.address);
  183. tb = await getBalance(symbol,to.address);
  184. fb = (1/digit) * fb;
  185. tb = (1/digit) * tb;
  186. console.log(chalk.yellow('###################### 전송후 잔고 ###################################'))
  187. console.log(`balance of sender(${from.address}) = ${fb.toFixed(Number(decimals))}\r\nbalance of receiver(${to.address}) = ${tb.toFixed(Number(decimals))}`);
  188. const lastB = await getBlockInfo(lastBlockHash);
  189. const lastTimeStamp = parseInt(lastB.timestamp,16);
  190. console.log(`eth_getBlockByHash(${lastBlockHash}).timestamp = ${lastTimeStamp}`)
  191. const d = new Date(lastTimeStamp * 1000);
  192. console.log(chalk.cyan(`전송종료 시간(블록완결시간) : ${d.toUTCString()}`));
  193. console.log(chalk.yellow(`start timestamp = ${start}`));
  194. console.log(chalk.yellow(`end timestamp = ${lastTimeStamp * 1000}`));
  195. const tps = calc.CTPS(count,start,lastTimeStamp * 1000);
  196. console.log(`CTPS = ${tps}`);
  197. }
  198. const firstHolder = '0x3050C8Eab31E2cbB6d29683f831CaB2FD52a9872';
  199. const calc = new Calulator();
  200. const rpcUrl = process.env.RPCURL;
  201. const gateWay = process.env.GATE_WAY;
  202. const authToken=process.env.AUTHTOKEN;
  203. const provider = new JsonRpcProvider(rpcUrl);
  204. setProvider(provider);
  205. const admin = new Wallet('0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3',provider);
  206. const issuer = new Wallet('0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63',provider);
  207. const holder1 = new Wallet('0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f',provider);
  208. const holder2 = new Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',provider);
  209. // const signer = holder1;
  210. console.log(`목적 서버 : ${gateWay}`);
  211. async function main() {
  212. //spareToken('BCG_TEST');
  213. transfer(holder1,'BCG_TEST',holder2, holder1,1, 1000);
  214. }
  215. main();