| @@ -5,7 +5,10 @@ | |||
| # CHAINID=1337 | |||
| #OCI | |||
| RPCURL=http://193.123.252.127:80 | |||
| #RPCURL=http://193.123.252.127:80 | |||
| #WSURL=ws://193.123.252.127/ws | |||
| RPCURL=http://132.145.89.161:8545 | |||
| CHAINID=1337 | |||
| GATE_WAY=http://api.stopulse.co.kr/main/v1/ | |||
| GATE_WAY_RAW=http://api.stopulse.co.kr/ | |||
| @@ -40,18 +40,6 @@ const bytes32ToString = (bytes32: string): string => { | |||
| return web3.utils.hexToAscii(bytes32).replace(/\0/g, ''); // null 문자 제거 | |||
| }; | |||
| // function toBytes32(data: string): BytesLike { | |||
| // return hexlify(zeroPadValue(toUtf8Bytes(data), 32)); | |||
| // } | |||
| // /** | |||
| // * Converts solidity byte32 to utf8 string | |||
| // */ | |||
| // function bytes32ToString(data: BytesLike): string { | |||
| // return toUtf8String(stripZerosLeft(data)); | |||
| // } | |||
| async function balanceOf(tokenAddress: string, operator: Wallet, | |||
| isin: string, account: string) | |||
| { | |||
| @@ -65,13 +53,23 @@ async function balanceOf(tokenAddress: string, operator: Wallet, | |||
| } | |||
| // event TokenIssuableKSD2( | |||
| // bytes32 isin, | |||
| // uint256 totalIssueQty, | |||
| // bytes32[] KSDAccounts, | |||
| // uint256[] amounts, | |||
| // bytes32 slipSeqKSD | |||
| // ); | |||
| async function issueKSD(address: string, operator: Wallet | |||
| ,isin: string, account: string, KSDAccount: string, qty: number, slipSeqKSD: string | |||
| ) { | |||
| const token = new SecurityToken__factory(operator).attach(address) as SecurityToken; | |||
| await token.connect(operator); | |||
| // const decimals = await token.decimals(); | |||
| // console.log(decimals); | |||
| // const symbol = await token.symbol(); | |||
| // console.log(symbol); | |||
| // const is = await token.retrieveIsinKSD(toBytes32(isin)); | |||
| // console.log( bytes32ToString(is)); | |||
| let r = await token.issueKSD(toBytes32(isin),account,toBytes32(KSDAccount),qty,toBytes32(slipSeqKSD),{gasLimit: 2100000}); | |||
| const receipt1 = await r.wait(); | |||
| console.log(receipt1.hash); | |||
| } | |||
| async function listenIssuable(tokenAddress: string, operator: Wallet, isin: string) { | |||
| @@ -83,6 +81,13 @@ async function listenIssuable(tokenAddress: string, operator: Wallet, isin: stri | |||
| console.log(`TokenIssuableKSD2 event received at ${tokenAddress} , ${isin}`); | |||
| console.log(`${isin} , ${totalIssueQty} , ${KSDAccounts} , ${amounts} , ${slipSeqKSD}`); | |||
| console.log(event); | |||
| // const accountCustomer = '0x1C69DB7373505C1b69c9A2Dce0Be88EeE3c5f5e5'; | |||
| // const ksdAccountCustomer = '000002000002'; | |||
| // issueKSD(tokenAddress,operator,isin,accountCustomer,ksdAccountCustomer,Number(amounts),toBytes32(slipSeqKSD)).catch((error) => { | |||
| // console.log(error); | |||
| // }); | |||
| }); | |||
| token.on(token.filters.TokenIssuableKSD,(isin,slipSeqKSD, event) => { | |||
| @@ -128,35 +128,46 @@ const newOperator = new Wallet('a0e4679c61e04969499af0c4cdcdc66e9a9f2e3f6cbc17ed | |||
| // KR5STO000188 (토큰증권 테스트 종목18) -> 0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf | |||
| // KR5STO000199 (토큰증권 테스트 종목19) -> 0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247 | |||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED | |||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x9D084404B8558604a1e69B9782A6f421870bd907 - 폐기된 종목 | |||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x9D084404B8558604a1e69B9782A6f421870bd907 - 폐기된 종목 | |||
| const accountSelf = '0x8909ba8b4dd517de907ab83dc5226352a151f74f'; | |||
| const ksdAccountSelf = '000002000001'; | |||
| const accountCustomer = '0x1C69DB7373505C1b69c9A2Dce0Be88EeE3c5f5e5'; | |||
| const ksdAccountCustomer = '000002000002'; | |||
| const accountHanwha = '0xf48de4a0c2939e62891f3c6aca68982975477e45'; | |||
| const ksdAccountHanwha = '000021000002'; | |||
| const accountMeritz = '0x0886328869e4e1f401e1052a5f4aae8b45f42610'; | |||
| const ksdAccountMeritz = '000010000002'; | |||
| async function main() { | |||
| //,isin: string, account: string, KSDAccount: string, qty: number, slipSeqKSD: string | |||
| // 종목20 | |||
| let tokenAddress = '0x920c017843904A735458AA9d30779bE5FCfcF411'; | |||
| let slipSeqKSD = '0000000001'; | |||
| const Symbol1 = 'KR5STO000166'; | |||
| let qty = 100000; | |||
| let tokenAddress = '0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED'; | |||
| let slipSeqKSD = '001202503100000000008'; | |||
| const Symbol1 = 'KR5STO000202'; | |||
| let qty = 300000; | |||
| // await issueKSD(tokenAddress,admin, | |||
| // Symbol1, | |||
| // accountCustomer, | |||
| // ksdAccountCustomer, | |||
| // accountMeritz, | |||
| // ksdAccountMeritz, | |||
| // qty, | |||
| // slipSeqKSD | |||
| // ); | |||
| await balanceOf(tokenAddress,admin,Symbol1,accountCustomer); | |||
| qty = 100000; | |||
| let rsnCode = '203'; | |||
| // qty = 100000; | |||
| // let rsnCode = '203'; | |||
| // ,isin: string, account: string, KSDAccount: string, rsnCode: string, qty: number | |||
| // await disposalLimitSetupKSD(tokenAddress,admin, | |||
| // Symbol1, | |||
| @@ -166,7 +177,7 @@ async function main() { | |||
| // qty | |||
| // ); | |||
| rsnCode = '203'; | |||
| // rsnCode = '203'; | |||
| // ,isin: string, account: string, KSDAccount: string, qty: number, rsnCode: string, slipSeqKSD: string | |||
| // await erasureKSD(tokenAddress,admin, | |||
| // Symbol1, | |||
| @@ -154,43 +154,16 @@ const ksdAccountCustomer = '000002000002'; | |||
| async function main() { | |||
| //,isin: string, account: string, KSDAccount: string, qty: number, slipSeqKSD: string | |||
| // 종목20 | |||
| let tokenAddress = '0x3e7757d67F2DBc9C2D9d69d74eCF0E498988da4F'; | |||
| let slipSeqKSD = '0000000001'; | |||
| const Symbol1 = 'KR5STO000177'; | |||
| let qty = 100000; | |||
| // await issueKSD(tokenAddress,admin, | |||
| // Symbol1, | |||
| // accountCustomer, | |||
| // ksdAccountCustomer, | |||
| // qty, | |||
| // slipSeqKSD | |||
| // ); | |||
| await balanceOf(tokenAddress,admin,Symbol1,accountCustomer); | |||
| qty = 100000; | |||
| let rsnCode = '203'; | |||
| // ,isin: string, account: string, KSDAccount: string, rsnCode: string, qty: number | |||
| // await disposalLimitSetupKSD(tokenAddress,admin, | |||
| // Symbol1, | |||
| // accountCustomer, | |||
| // ksdAccountCustomer, | |||
| // rsnCode, | |||
| // qty | |||
| // ); | |||
| rsnCode = '203'; | |||
| // ,isin: string, account: string, KSDAccount: string, qty: number, rsnCode: string, slipSeqKSD: string | |||
| // await erasureKSD(tokenAddress,admin, | |||
| // Symbol1, | |||
| // accountCustomer, | |||
| // ksdAccountCustomer, | |||
| // qty, | |||
| // rsnCode, | |||
| // slipSeqKSD | |||
| // ); | |||
| console.log(bytes32ToString('0x4b523553544f3030303136360000000000000000000000000000000000000000')); | |||
| console.log(bytes32ToString('0x3030303030323030303030320000000000000000000000000000000000000000')); | |||
| console.log(bytes32ToString('0x3030303031303030303030320000000000000000000000000000000000000000')); | |||
| console.log(bytes32ToString('0x3030303032313030303030320000000000000000000000000000000000000000')); | |||
| console.log(bytes32ToString('0x3030313230323530333130303030303030303030380000000000000000000000')); | |||
| } | |||
| @@ -0,0 +1,163 @@ | |||
| import * as dotevnv from "dotenv" | |||
| import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256 | |||
| ,Transaction,formatEther, | |||
| ZeroHash,ethers,keccak256,id, | |||
| hexlify, | |||
| BytesLike, | |||
| toUtf8Bytes, | |||
| zeroPadValue, | |||
| stripZerosLeft | |||
| } from 'ethers' | |||
| import chalk from "chalk"; | |||
| import {Calulator} from "../inc/calc"; | |||
| import { TokenIssuer } from "../inc/TokenIssuer"; | |||
| import { | |||
| SecurityToken, | |||
| SecurityToken__factory, | |||
| } from '../typechain2' | |||
| import {checkReceipt,checkReceipt2, setProvider,getDeploymentAddresses, | |||
| getElapsed, sleep,getBlockInfo} from '../inc/util' | |||
| dotevnv.config(); | |||
| if (!process.env.RPCURL) { | |||
| console.log(`No rpcur value specified...`) | |||
| } | |||
| console.log(`목적 서버 : ${process.env.RPCURL}`); | |||
| import Web3 from 'web3'; | |||
| const web3 = new Web3(); | |||
| // 문자열을 bytes32로 변환하는 함수 | |||
| const toBytes32 = (inputString: string): string => { | |||
| return web3.utils.asciiToHex(inputString).padEnd(66, '0'); // 32 bytes로 패딩 추가 | |||
| }; | |||
| // bytes32를 문자열로 변환하는 함수 | |||
| const bytes32ToString = (bytes32: string): string => { | |||
| return web3.utils.hexToAscii(bytes32).replace(/\0/g, ''); // null 문자 제거 | |||
| }; | |||
| async function balanceOf(tokenAddress: string, operator: Wallet, | |||
| isin: string, account: string) | |||
| { | |||
| const token = new SecurityToken__factory(operator).attach(tokenAddress) as SecurityToken; | |||
| await token.connect(operator); | |||
| const balance = await token.balanceOfKSD(toBytes32(isin),account); | |||
| console.log(balance); | |||
| } | |||
| async function listenIssuable(tokenAddress: string, operator: Wallet, isin: string) { | |||
| const token = new SecurityToken__factory(operator).attach(tokenAddress) as SecurityToken; | |||
| await token.connect(operator); | |||
| token.on(token.filters.TokenIssuableKSD2,(isin,totalIssueQty,KSDAccounts,amounts,slipSeqKSD, event) => { | |||
| console.log(`TokenIssuableKSD2 event received at ${tokenAddress} , ${isin}`); | |||
| console.log(`${isin} , ${totalIssueQty} , ${KSDAccounts} , ${amounts} , ${slipSeqKSD}`); | |||
| console.log(event); | |||
| }); | |||
| token.on(token.filters.TokenIssuableKSD,(isin,slipSeqKSD, event) => { | |||
| console.log(`TokenIssuableKSD event received at ${tokenAddress} , ${isin}`); | |||
| console.log(`${isin} - ${slipSeqKSD}`); | |||
| console.log(event); | |||
| }); | |||
| // const filter = token.filters.TokenIssuableKSD(null,null); | |||
| // token.on(filter,(isin,slipSeqKSD, event) => { | |||
| // console.log(event); | |||
| // }); | |||
| // const abi = ['event TokenIssuableKSD(bytes32 isin, bytes32 slipSeqKSD)']; | |||
| // //const singer: JsonRpcSigner = await provider.getSigner(); | |||
| // const contract = new Contract( | |||
| // tokenAddress, | |||
| // abi, | |||
| // operator | |||
| // ); | |||
| // //contract.on('TokenIssuableKSD', (isin,slipSeqKSD, event) => { | |||
| // contract.on('TokenIssuableKSD', (data) => { | |||
| // console.log(data); | |||
| // // TokenIssuableKSD 에서 저장한 정보를 찾아서 | |||
| // //issueKSD() | |||
| // }); | |||
| console.log(`Listening for TokenIssuableKSD events... at ${tokenAddress} , ${isin}`); | |||
| setInterval(() => {}, 1000); | |||
| } | |||
| const calc = new Calulator(); | |||
| const rpcUrl = process.env.RPCURL; | |||
| const provider = new JsonRpcProvider(rpcUrl); | |||
| setProvider(provider); | |||
| const admin = new Wallet('0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3',provider); | |||
| const issuer = new Wallet('0x8f2a55949038a9610f50fb23b5883af3b4ecb3c3bb792cbcefbd1542c692be63',provider); | |||
| const holder1 = new Wallet('0xae6ae8e5ccbfb04590405997ee2d52d2b330726137b875053c36d94e974d162f',provider); | |||
| const holder2 = new Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',provider); | |||
| const user1 = new Wallet('5c7ff82446654833ed4cbd3dc7cca94b114b556def572a5f2f7f29224c757adb',provider); | |||
| const user2 = new Wallet('509157aeb1308d8ff8db8a3059d4392d92fb66960ef5083eda5a8dcc9118be31',provider); | |||
| const newOperator = new Wallet('a0e4679c61e04969499af0c4cdcdc66e9a9f2e3f6cbc17ede9e2137518f8e75d',provider); | |||
| // KR5STO000166 (토큰증권 테스트 종목16) -> 0x920c017843904A735458AA9d30779bE5FCfcF411 | |||
| // KR5STO000177 (토큰증권 테스트 종목17) -> 0x3e7757d67F2DBc9C2D9d69d74eCF0E498988da4F | |||
| // KR5STO000188 (토큰증권 테스트 종목18) -> 0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf | |||
| // KR5STO000199 (토큰증권 테스트 종목19) -> 0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247 | |||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED | |||
| const accountSelf = '0x8909ba8b4dd517de907ab83dc5226352a151f74f'; | |||
| const ksdAccountSelf = '000002000001'; | |||
| const accountCustomer = '0x1C69DB7373505C1b69c9A2Dce0Be88EeE3c5f5e5'; | |||
| const ksdAccountCustomer = '000002000002'; | |||
| async function main() { | |||
| //,isin: string, account: string, KSDAccount: string, qty: number, slipSeqKSD: string | |||
| // KR5STO000202 | |||
| let symbol = 'KR5STO000166'; | |||
| let qty = 1000000000; | |||
| let rsnCode = '203'; | |||
| let tokenAddress = '0x920c017843904A735458AA9d30779bE5FCfcF411'; | |||
| listenIssuable(tokenAddress,admin, symbol).catch((error) => { | |||
| console.log(error); | |||
| }); | |||
| symbol = 'KR5STO000177' | |||
| tokenAddress = '0x3e7757d67F2DBc9C2D9d69d74eCF0E498988da4F'; | |||
| listenIssuable(tokenAddress,admin, symbol).catch((error) => { | |||
| console.log(error); | |||
| }); | |||
| symbol = 'KR5STO000188' | |||
| tokenAddress = '0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf'; | |||
| listenIssuable(tokenAddress,admin, symbol).catch((error) => { | |||
| console.log(error); | |||
| }); | |||
| symbol = 'KR5STO000199' | |||
| tokenAddress = '0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247'; | |||
| listenIssuable(tokenAddress,admin, symbol).catch((error) => { | |||
| console.log(error); | |||
| }); | |||
| symbol = 'KR5STO000202' | |||
| tokenAddress = '0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED'; | |||
| listenIssuable(tokenAddress,admin, symbol).catch((error) => { | |||
| console.log(error); | |||
| }); | |||
| } | |||
| main(); | |||
| @@ -0,0 +1,217 @@ | |||
| import * as dotevnv from "dotenv" | |||
| import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256 | |||
| ,Transaction,formatEther, | |||
| ZeroHash,ethers,keccak256,id, | |||
| hexlify, | |||
| BytesLike, | |||
| toUtf8Bytes, | |||
| zeroPadValue, | |||
| stripZerosLeft | |||
| } from 'ethers' | |||
| import chalk from "chalk"; | |||
| import {Calulator} from "../inc/calc"; | |||
| import { TokenIssuer } from "../inc/TokenIssuer"; | |||
| import { | |||
| SecurityToken, | |||
| SecurityToken__factory, | |||
| } from '../typechain2' | |||
| // import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; | |||
| import { Partition } from '../inc/tokenData'; | |||
| import { Operator } from '../typechain/contracts/access/Operator'; | |||
| import { stringify } from 'querystring'; | |||
| import {checkReceipt,checkReceipt2, setProvider,getDeploymentAddresses, | |||
| getElapsed, sleep,getBlockInfo} from '../inc/util' | |||
| dotevnv.config(); | |||
| if (!process.env.RPCURL) { | |||
| console.log(`No rpcur value specified...`) | |||
| } | |||
| console.log(`목적 서버 : ${process.env.RPCURL}`); | |||
| import Web3 from 'web3'; | |||
| const web3 = new Web3(); | |||
| // 문자열을 bytes32로 변환하는 함수 | |||
| const toBytes32 = (inputString: string): string => { | |||
| return web3.utils.asciiToHex(inputString).padEnd(66, '0'); // 32 bytes로 패딩 추가 | |||
| }; | |||
| // bytes32를 문자열로 변환하는 함수 | |||
| const bytes32ToString = (bytes32: string): string => { | |||
| return web3.utils.hexToAscii(bytes32).replace(/\0/g, ''); // null 문자 제거 | |||
| }; | |||
| async function balanceOf(tokenAddress: string, operator: Wallet, | |||
| isin: string, account: string) | |||
| { | |||
| const token = new SecurityToken__factory(operator).attach(tokenAddress) as SecurityToken; | |||
| await token.connect(operator); | |||
| const balance = await token.balanceOfKSD(toBytes32(isin),account); | |||
| console.log(balance); | |||
| } | |||
| /// @notice 계좌대체 표준 함수 | |||
| /// @param isin 종목 isin 코드 | |||
| /// @param accountFrom 송신 지갑주소 | |||
| /// @param KSDAccountFrom 송신 642계좌 | |||
| /// @param accountTo 수신 지갑주소 | |||
| /// @param KSDAccountTo 수신 642계좌 | |||
| /// @param qty 전송 수량 | |||
| /// @param rsnCode 사유코드 | |||
| //function transferKSD(bytes32 isin, address accountFrom, bytes32 KSDAccountFrom, address accountTo, bytes32 KSDAccountTo, uint256 qty, bytes32 rsnCode) external; | |||
| async function transferKSD(address: string, operator: Wallet | |||
| ,isin: string, accountFrom: string, KSDAccountFrom: string, accountTo: string, KSDAccountTo: string, qty: number, rsnCode: string | |||
| ) { | |||
| console.log(`transferKSD(${isin},${accountFrom},${KSDAccountFrom},${accountTo},${KSDAccountTo},${qty},${rsnCode})`); | |||
| const token = new SecurityToken__factory(operator).attach(address) as SecurityToken; | |||
| await token.connect(operator); | |||
| let r = await token.transferKSD( | |||
| toBytes32(isin), | |||
| accountFrom,toBytes32(KSDAccountFrom), | |||
| accountTo,toBytes32(KSDAccountTo), | |||
| qty, | |||
| toBytes32(rsnCode), | |||
| {gasLimit: 2100000}); | |||
| const receipt1 = await r.wait(); | |||
| console.log(receipt1.hash); | |||
| } | |||
| async function issueKSD(address: string, operator: Wallet | |||
| ,isin: string, account: string, KSDAccount: string, qty: number, slipSeqKSD: string | |||
| ) { | |||
| const token = new SecurityToken__factory(operator).attach(address) as SecurityToken; | |||
| await token.connect(operator); | |||
| const decimals = await token.decimals(); | |||
| console.log(decimals); | |||
| const symbol = await token.symbol(); | |||
| console.log(symbol); | |||
| const is = await token.retrieveIsinKSD(toBytes32(isin)); | |||
| console.log( bytes32ToString(is)); | |||
| let r = await token.issueKSD(toBytes32(isin),account,toBytes32(KSDAccount),qty,toBytes32(slipSeqKSD),{gasLimit: 2100000}); | |||
| const receipt1 = await r.wait(); | |||
| console.log(receipt1.hash); | |||
| } | |||
| const rpcUrl = process.env.RPCURL; | |||
| const provider = new JsonRpcProvider(rpcUrl); | |||
| setProvider(provider); | |||
| const admin = new Wallet('0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3',provider); | |||
| // KR5STO000166 (토큰증권 테스트 종목16) -> 0x920c017843904A735458AA9d30779bE5FCfcF411 | |||
| // KR5STO000177 (토큰증권 테스트 종목17) -> 0x3e7757d67F2DBc9C2D9d69d74eCF0E498988da4F | |||
| // KR5STO000188 (토큰증권 테스트 종목18) -> 0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf | |||
| // KR5STO000199 (토큰증권 테스트 종목19) -> 0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247 | |||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED | |||
| // 신한 자기분계좌 | |||
| const accountShinhanSelf = '0x8909ba8b4dd517de907ab83dc5226352a151f74f'; | |||
| const ksdAccountShinhanSelf = '000002000001'; | |||
| // 신한 고객분계좌 | |||
| const accountShinhan = '0x1C69DB7373505C1b69c9A2Dce0Be88EeE3c5f5e5'; | |||
| const ksdAccountShinhan = '000002000002'; | |||
| // 한화 자기분 | |||
| const accountHanwhaSelf = '0xc575ebd70f293a2d1a74c3cb4058e439f1996922'; | |||
| const ksdAccountHanwhaSelf = '000021000001'; | |||
| // 한화 고객분계좌 | |||
| const accountHanwha = '0xf48de4a0c2939e62891f3c6aca68982975477e45'; | |||
| const ksdAccountHanwha = '000021000002'; | |||
| // 메리츠 고객분계좌 | |||
| const accountMeritz = '0x0886328869e4e1f401e1052a5f4aae8b45f42610'; | |||
| const ksdAccountMeritz = '000010000002'; | |||
| async function main() { | |||
| // 종목17 | |||
| let tokenAddress = '0x3e7757d67F2DBc9C2D9d69d74eCF0E498988da4F'; | |||
| let symbol = 'KR5STO000177'; | |||
| let qty = 500000; | |||
| // 신한(고객) -> 한화(자기) | |||
| // await transferKSD(tokenAddress,admin, | |||
| // symbol, | |||
| // accountShinhan, | |||
| // ksdAccountShinhan, | |||
| // accountHanwhaSelf, | |||
| // ksdAccountHanwhaSelf, | |||
| // qty, | |||
| // '000' | |||
| // ); | |||
| // 종목18 | |||
| tokenAddress = '0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf'; | |||
| symbol = 'KR5STO000188'; | |||
| qty = 250000; | |||
| // 신한(고객) -> 신한(자기) | |||
| // await transferKSD(tokenAddress,admin, | |||
| // symbol, | |||
| // accountShinhan, | |||
| // ksdAccountShinhan, | |||
| // accountShinhanSelf, | |||
| // ksdAccountShinhanSelf, | |||
| // qty, | |||
| // '000' | |||
| // ); | |||
| // 종목20 | |||
| tokenAddress = '0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED'; | |||
| symbol = 'KR5STO000202'; | |||
| qty = 200000; | |||
| // 신한(고객) -> 메리츠(고객) | |||
| // await transferKSD(tokenAddress,admin, | |||
| // symbol, | |||
| // accountShinhan, | |||
| // ksdAccountShinhan, | |||
| // accountMeritz, | |||
| // ksdAccountMeritz, | |||
| // qty, | |||
| // '000' | |||
| // ); | |||
| qty = 200000; | |||
| // 메리츠(고객) -> 한화(고객) | |||
| // await transferKSD(tokenAddress,admin, | |||
| // symbol, | |||
| // accountMeritz, | |||
| // ksdAccountMeritz, | |||
| // accountHanwha, | |||
| // ksdAccountHanwha, | |||
| // qty, | |||
| // '000' | |||
| // ); | |||
| qty = 200000; | |||
| // 한화(고객) -> 신한(고객) | |||
| // await transferKSD(tokenAddress,admin, | |||
| // symbol, | |||
| // accountHanwha, | |||
| // ksdAccountHanwha, | |||
| // accountShinhan, | |||
| // ksdAccountShinhan, | |||
| // qty, | |||
| // '000' | |||
| // ); | |||
| await balanceOf(tokenAddress,admin,symbol,accountShinhan); | |||
| } | |||
| main(); | |||
| @@ -0,0 +1,207 @@ | |||
| import * as dotevnv from "dotenv" | |||
| import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256 | |||
| ,Transaction,formatEther, | |||
| ZeroHash,ethers,keccak256,id, | |||
| hexlify, | |||
| BytesLike, | |||
| toUtf8Bytes, | |||
| zeroPadValue, | |||
| stripZerosLeft | |||
| } from 'ethers' | |||
| import chalk from "chalk"; | |||
| import {Calulator} from "../inc/calc"; | |||
| import { TokenIssuer } from "../inc/TokenIssuer"; | |||
| import { | |||
| SecurityToken, | |||
| SecurityToken__factory, | |||
| } from '../typechain2' | |||
| // import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; | |||
| import { Partition } from '../inc/tokenData'; | |||
| import { Operator } from '../typechain/contracts/access/Operator'; | |||
| import { stringify } from 'querystring'; | |||
| import {checkReceipt,checkReceipt2, setProvider,getDeploymentAddresses, | |||
| getElapsed, sleep,getBlockInfo} from '../inc/util' | |||
| dotevnv.config(); | |||
| if (!process.env.RPCURL) { | |||
| console.log(`No rpcur value specified...`) | |||
| } | |||
| console.log(`목적 서버 : ${process.env.RPCURL}`); | |||
| import Web3 from 'web3'; | |||
| const web3 = new Web3(); | |||
| // 문자열을 bytes32로 변환하는 함수 | |||
| const toBytes32 = (inputString: string): string => { | |||
| return web3.utils.asciiToHex(inputString).padEnd(66, '0'); // 32 bytes로 패딩 추가 | |||
| }; | |||
| // bytes32를 문자열로 변환하는 함수 | |||
| const bytes32ToString = (bytes32: string): string => { | |||
| return web3.utils.hexToAscii(bytes32).replace(/\0/g, ''); // null 문자 제거 | |||
| }; | |||
| async function balanceOf(tokenAddress: string, operator: Wallet, | |||
| isin: string, account: string) | |||
| { | |||
| const token = new SecurityToken__factory(operator).attach(tokenAddress) as SecurityToken; | |||
| await token.connect(operator); | |||
| const balance = await token.balanceOfKSD(toBytes32(isin),account); | |||
| console.log(balance); | |||
| } | |||
| async function erasureKSD(address: string, operator: Wallet | |||
| ,isin: string, account: string, KSDAccount: string, qty: number, rsnCode: string, slipSeqKSD: string | |||
| ) { | |||
| const token = new SecurityToken__factory(operator).attach(address) as SecurityToken; | |||
| await token.connect(operator); | |||
| let r = await token.erasureKSD(toBytes32(isin),account,toBytes32(KSDAccount),qty,toBytes32(rsnCode),toBytes32(slipSeqKSD),{gasLimit: 2100000}); | |||
| const receipt1 = await r.wait(); | |||
| console.log(receipt1.hash); | |||
| } | |||
| const rpcUrl = process.env.RPCURL; | |||
| const provider = new JsonRpcProvider(rpcUrl); | |||
| setProvider(provider); | |||
| const admin = new Wallet('0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3',provider); | |||
| // KR5STO000166 (토큰증권 테스트 종목16) -> 0x920c017843904A735458AA9d30779bE5FCfcF411 | |||
| // KR5STO000177 (토큰증권 테스트 종목17) -> 0x3e7757d67F2DBc9C2D9d69d74eCF0E498988da4F | |||
| // KR5STO000188 (토큰증권 테스트 종목18) -> 0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf | |||
| // KR5STO000199 (토큰증권 테스트 종목19) -> 0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247 | |||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED | |||
| // 신한 자기분계좌 | |||
| const accountShinhanSelf = '0x8909ba8b4dd517de907ab83dc5226352a151f74f'; | |||
| const ksdAccountShinhanSelf = '000002000001'; | |||
| // 신한 고객분계좌 | |||
| const accountShinhan = '0x1C69DB7373505C1b69c9A2Dce0Be88EeE3c5f5e5'; | |||
| const ksdAccountShinhan = '000002000002'; | |||
| // 한화 자기분 | |||
| const accountHanwhaSelf = '0xc575ebd70f293a2d1a74c3cb4058e439f1996922'; | |||
| const ksdAccountHanwhaSelf = '000021000001'; | |||
| // 한화 고객분계좌 | |||
| const accountHanwha = '0xf48de4a0c2939e62891f3c6aca68982975477e45'; | |||
| const ksdAccountHanwha = '000021000002'; | |||
| // 메리츠 고객분계좌 | |||
| const accountMeritz = '0x0886328869e4e1f401e1052a5f4aae8b45f42610'; | |||
| const ksdAccountMeritz = '000010000002'; | |||
| async function main() { | |||
| const slipSeqKSD = '003202503120000000006'; | |||
| const rsnCode = '316'; | |||
| // 종목17 | |||
| let tokenAddress = '0x3e7757d67F2DBc9C2D9d69d74eCF0E498988da4F'; | |||
| let symbol = 'KR5STO000177'; | |||
| let qty = 500000; | |||
| let account = accountShinhan; | |||
| let ksdAccount = ksdAccountShinhan; | |||
| //await erasureKSD(tokenAddress,admin,symbol,account,ksdAccount,qty,rsnCode,slipSeqKSD); | |||
| // 종목19 | |||
| tokenAddress = '0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247'; | |||
| symbol = 'KR5STO000199'; | |||
| qty = 150000; | |||
| account = accountShinhan; | |||
| ksdAccount = ksdAccountShinhan; | |||
| //await erasureKSD(tokenAddress,admin,symbol,account,ksdAccount,qty,rsnCode,slipSeqKSD); | |||
| qty = 150000; | |||
| account = accountHanwha; | |||
| ksdAccount = ksdAccountHanwha; | |||
| //await erasureKSD(tokenAddress,admin,symbol,account,ksdAccount,qty,rsnCode,slipSeqKSD); | |||
| // 종목20 | |||
| tokenAddress = '0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED'; | |||
| symbol = 'KR5STO000202'; | |||
| qty = 400000; | |||
| account = accountShinhan; | |||
| ksdAccount = ksdAccountShinhan; | |||
| //await erasureKSD(tokenAddress,admin,symbol,account,ksdAccount,qty,rsnCode,slipSeqKSD); | |||
| qty = 300000; | |||
| account = accountMeritz; | |||
| ksdAccount = ksdAccountMeritz; | |||
| //await erasureKSD(tokenAddress,admin,symbol,account,ksdAccount,qty,rsnCode,slipSeqKSD); | |||
| qty = 300000; | |||
| account = accountHanwha; | |||
| ksdAccount = ksdAccountHanwha; | |||
| //await erasureKSD(tokenAddress,admin,symbol,account,ksdAccount,qty,rsnCode,slipSeqKSD); | |||
| await balanceOf(tokenAddress,admin,symbol,accountShinhan); | |||
| } | |||
| function printParam() { | |||
| console.log('##################################################################################'); | |||
| console.log('disposalLimitSetupKSD'); | |||
| console.log('isin'); | |||
| console.log(bytes32ToString('0x4b523553544f3030303138380000000000000000000000000000000000000000')); | |||
| console.log('account'); | |||
| console.log('0x8909ba8b4dd517de907ab83dc5226352a151f74f'); | |||
| console.log('KSDAccount'); | |||
| console.log(bytes32ToString('0x3030303030323030303030310000000000000000000000000000000000000000')); | |||
| console.log('rsnCode'); | |||
| console.log(bytes32ToString('0x3331360000000000000000000000000000000000000000000000000000000000')); | |||
| console.log('qty'); | |||
| console.log('250000'); | |||
| console.log('##################################################################################'); | |||
| console.log('tokenErasableKSD'); | |||
| console.log('isin'); | |||
| console.log(bytes32ToString('0x4b523553544f3030303138380000000000000000000000000000000000000000')); | |||
| console.log('todalErasureQty'); | |||
| console.log('250000'); | |||
| console.log('KSDAccounts'); | |||
| console.log(`[${bytes32ToString('0x3030303030323030303030310000000000000000000000000000000000000000')}]`); | |||
| console.log('slipSeqKSD'); | |||
| console.log(bytes32ToString('0x3030333230323530333131303030303030303030360000000000000000000000')); | |||
| console.log('amounts'); | |||
| console.log(`[${250000}]`); | |||
| console.log('##################################################################################'); | |||
| console.log('disposalLimitErasureKSD'); | |||
| console.log('isin'); | |||
| console.log(bytes32ToString('0x4b523553544f3030303138380000000000000000000000000000000000000000')); | |||
| console.log('account'); | |||
| console.log('0x8909ba8b4dd517de907ab83dc5226352a151f74f'); | |||
| console.log('KSDAccount'); | |||
| console.log(bytes32ToString('0x3030303030323030303030310000000000000000000000000000000000000000')); | |||
| console.log('rsnCode'); | |||
| console.log(bytes32ToString('0x3331360000000000000000000000000000000000000000000000000000000000')); | |||
| console.log('qty'); | |||
| console.log('250000'); | |||
| console.log('slipSeqKSD'); | |||
| console.log(bytes32ToString('0x303033323032353033313130303030303030303036')); | |||
| } | |||
| //printParam(); | |||
| main(); | |||
| @@ -14,20 +14,20 @@ | |||
| "snap/1" | |||
| ], | |||
| "network": { | |||
| "localAddress": "172.21.0.2:34974", | |||
| "remoteAddress": "10.19.13.85:30303", | |||
| "localAddress": "172.25.0.2:48498", | |||
| "remoteAddress": "10.19.13.66:30303", | |||
| "inbound": false | |||
| }, | |||
| "port": "0x7662", | |||
| "id": "0x7731be78572000f1bd2f0746f5db82d1e5c3b104d7e2e7355fe95bb909ba6ce97f54ae9f6e5a9d2cbdd42e129d2761d12b796623516fa049f9a292b12a61367e", | |||
| "port": "0x765f", | |||
| "id": "0x8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02", | |||
| "protocols": { | |||
| "eth": { | |||
| "difficulty": "0x114f64", | |||
| "head": "0x179799015009e868c8f9072b4c8a146dddc049539becef95b37fda17ebc091a8", | |||
| "difficulty": "0x11727e", | |||
| "head": "0xb163a41b01b62a68b6a85647a99f387aa5f9a40f97cca4f38868dfd61924f85c", | |||
| "version": 68 | |||
| } | |||
| }, | |||
| "enode": "enode://7731be78572000f1bd2f0746f5db82d1e5c3b104d7e2e7355fe95bb909ba6ce97f54ae9f6e5a9d2cbdd42e129d2761d12b796623516fa049f9a292b12a61367e@10.19.13.85:30303" | |||
| "enode": "enode://8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02@10.19.13.66:30303" | |||
| }, | |||
| { | |||
| "version": "0x5", | |||
| @@ -44,20 +44,20 @@ | |||
| "snap/1" | |||
| ], | |||
| "network": { | |||
| "localAddress": "172.21.0.2:30303", | |||
| "remoteAddress": "10.21.20.78:54372", | |||
| "localAddress": "172.25.0.2:30306", | |||
| "remoteAddress": "10.19.0.33:31984", | |||
| "inbound": true | |||
| }, | |||
| "port": "0x765f", | |||
| "id": "0x8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02", | |||
| "port": "0x778b", | |||
| "id": "0x4a94d2e59ae5dcbe008762d259bf210c7aa82ec6bc8b5284e1787c0ba1d58f175e58bc171cc1475a152b39185e64ddd77e44521b0235f09b477cc129b88188a8", | |||
| "protocols": { | |||
| "eth": { | |||
| "difficulty": "0x114f64", | |||
| "head": "0x179799015009e868c8f9072b4c8a146dddc049539becef95b37fda17ebc091a8", | |||
| "difficulty": "0x11727e", | |||
| "head": "0xb163a41b01b62a68b6a85647a99f387aa5f9a40f97cca4f38868dfd61924f85c", | |||
| "version": 68 | |||
| } | |||
| }, | |||
| "enode": "enode://8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02@10.21.20.78:30303?discport=0" | |||
| "enode": "enode://4a94d2e59ae5dcbe008762d259bf210c7aa82ec6bc8b5284e1787c0ba1d58f175e58bc171cc1475a152b39185e64ddd77e44521b0235f09b477cc129b88188a8@10.19.0.33:30603?discport=0" | |||
| }, | |||
| { | |||
| "version": "0x5", | |||
| @@ -74,19 +74,49 @@ | |||
| "snap/1" | |||
| ], | |||
| "network": { | |||
| "localAddress": "172.21.0.2:30303", | |||
| "remoteAddress": "10.21.20.126:45800", | |||
| "localAddress": "172.25.0.2:30306", | |||
| "remoteAddress": "10.19.13.117:34974", | |||
| "inbound": true | |||
| }, | |||
| "port": "0x765f", | |||
| "id": "0x463d1f64c9484e70b6be3c6cbc91c4c526e8c2035a4e191d5c56f4dd43a1ed91ba0c60be2fcec7e733c6ac77ff2981c936107068560a10e0bfe38fb17469347f", | |||
| "protocols": { | |||
| "eth": { | |||
| "difficulty": "0x11727e", | |||
| "head": "0xb163a41b01b62a68b6a85647a99f387aa5f9a40f97cca4f38868dfd61924f85c", | |||
| "version": 68 | |||
| } | |||
| }, | |||
| "enode": "enode://463d1f64c9484e70b6be3c6cbc91c4c526e8c2035a4e191d5c56f4dd43a1ed91ba0c60be2fcec7e733c6ac77ff2981c936107068560a10e0bfe38fb17469347f@10.19.13.117:30303" | |||
| }, | |||
| { | |||
| "version": "0x5", | |||
| "name": "besu/v24.10.0/linux-x86_64/openjdk-java-21", | |||
| "caps": [ | |||
| "eth/62", | |||
| "eth/63", | |||
| "eth/64", | |||
| "eth/65", | |||
| "eth/66", | |||
| "eth/67", | |||
| "eth/68", | |||
| "istanbul/100", | |||
| "snap/1" | |||
| ], | |||
| "network": { | |||
| "localAddress": "172.25.0.2:54844", | |||
| "remoteAddress": "10.19.13.67:30303", | |||
| "inbound": false | |||
| }, | |||
| "port": "0x765f", | |||
| "id": "0xda226ac863c382c92e23c13424ec175691df4fa7660796c2d4126876cae855ea84c6fd11c8396b2605b71ee9c00601b7344d7048e0f90664f0cfe32b0282d00e", | |||
| "protocols": { | |||
| "eth": { | |||
| "difficulty": "0x114f64", | |||
| "head": "0x179799015009e868c8f9072b4c8a146dddc049539becef95b37fda17ebc091a8", | |||
| "difficulty": "0x11727e", | |||
| "head": "0xb163a41b01b62a68b6a85647a99f387aa5f9a40f97cca4f38868dfd61924f85c", | |||
| "version": 68 | |||
| } | |||
| }, | |||
| "enode": "enode://da226ac863c382c92e23c13424ec175691df4fa7660796c2d4126876cae855ea84c6fd11c8396b2605b71ee9c00601b7344d7048e0f90664f0cfe32b0282d00e@10.21.20.126:30303?discport=0" | |||
| "enode": "enode://da226ac863c382c92e23c13424ec175691df4fa7660796c2d4126876cae855ea84c6fd11c8396b2605b71ee9c00601b7344d7048e0f90664f0cfe32b0282d00e@10.19.13.67:30303" | |||
| } | |||
| ] | |||