| # CHAINID=1337 | # CHAINID=1337 | ||||
| #OCI | #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 | CHAINID=1337 | ||||
| GATE_WAY=http://api.stopulse.co.kr/main/v1/ | GATE_WAY=http://api.stopulse.co.kr/main/v1/ | ||||
| GATE_WAY_RAW=http://api.stopulse.co.kr/ | GATE_WAY_RAW=http://api.stopulse.co.kr/ |
| return web3.utils.hexToAscii(bytes32).replace(/\0/g, ''); // null 문자 제거 | 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, | async function balanceOf(tokenAddress: string, operator: Wallet, | ||||
| isin: string, account: string) | isin: string, account: string) | ||||
| { | { | ||||
| } | } | ||||
| // 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) { | async function listenIssuable(tokenAddress: string, operator: Wallet, isin: string) { | ||||
| console.log(`TokenIssuableKSD2 event received at ${tokenAddress} , ${isin}`); | console.log(`TokenIssuableKSD2 event received at ${tokenAddress} , ${isin}`); | ||||
| console.log(`${isin} , ${totalIssueQty} , ${KSDAccounts} , ${amounts} , ${slipSeqKSD}`); | console.log(`${isin} , ${totalIssueQty} , ${KSDAccounts} , ${amounts} , ${slipSeqKSD}`); | ||||
| console.log(event); | 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) => { | token.on(token.filters.TokenIssuableKSD,(isin,slipSeqKSD, event) => { |
| // KR5STO000188 (토큰증권 테스트 종목18) -> 0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf | // KR5STO000188 (토큰증권 테스트 종목18) -> 0x984f4DbAD8fC003138312293Fd431E5D8bAC1daf | ||||
| // KR5STO000199 (토큰증권 테스트 종목19) -> 0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247 | // KR5STO000199 (토큰증권 테스트 종목19) -> 0xa36116158Cdfbcc57c3FEB9cc2A1cdfF8Cf5e247 | ||||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED | // KR5STO000202 (토큰증권 테스트 종목20) -> 0x93302A7eeD96b27D47Ec692c6560cA5Fd5E9e7ED | ||||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x9D084404B8558604a1e69B9782A6f421870bd907 - 폐기된 종목 | |||||
| // KR5STO000202 (토큰증권 테스트 종목20) -> 0x9D084404B8558604a1e69B9782A6f421870bd907 - 폐기된 종목 | |||||
| const accountSelf = '0x8909ba8b4dd517de907ab83dc5226352a151f74f'; | const accountSelf = '0x8909ba8b4dd517de907ab83dc5226352a151f74f'; | ||||
| const ksdAccountSelf = '000002000001'; | const ksdAccountSelf = '000002000001'; | ||||
| const accountCustomer = '0x1C69DB7373505C1b69c9A2Dce0Be88EeE3c5f5e5'; | const accountCustomer = '0x1C69DB7373505C1b69c9A2Dce0Be88EeE3c5f5e5'; | ||||
| const ksdAccountCustomer = '000002000002'; | const ksdAccountCustomer = '000002000002'; | ||||
| const accountHanwha = '0xf48de4a0c2939e62891f3c6aca68982975477e45'; | |||||
| const ksdAccountHanwha = '000021000002'; | |||||
| const accountMeritz = '0x0886328869e4e1f401e1052a5f4aae8b45f42610'; | |||||
| const ksdAccountMeritz = '000010000002'; | |||||
| async function main() { | async function main() { | ||||
| //,isin: string, account: string, KSDAccount: string, qty: number, slipSeqKSD: string | //,isin: string, account: string, KSDAccount: string, qty: number, slipSeqKSD: string | ||||
| // 종목20 | // 종목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, | // await issueKSD(tokenAddress,admin, | ||||
| // Symbol1, | // Symbol1, | ||||
| // accountCustomer, | |||||
| // ksdAccountCustomer, | |||||
| // accountMeritz, | |||||
| // ksdAccountMeritz, | |||||
| // qty, | // qty, | ||||
| // slipSeqKSD | // slipSeqKSD | ||||
| // ); | // ); | ||||
| await balanceOf(tokenAddress,admin,Symbol1,accountCustomer); | 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 | // ,isin: string, account: string, KSDAccount: string, rsnCode: string, qty: number | ||||
| // await disposalLimitSetupKSD(tokenAddress,admin, | // await disposalLimitSetupKSD(tokenAddress,admin, | ||||
| // Symbol1, | // Symbol1, | ||||
| // qty | // qty | ||||
| // ); | // ); | ||||
| rsnCode = '203'; | |||||
| // rsnCode = '203'; | |||||
| // ,isin: string, account: string, KSDAccount: string, qty: number, rsnCode: string, slipSeqKSD: string | // ,isin: string, account: string, KSDAccount: string, qty: number, rsnCode: string, slipSeqKSD: string | ||||
| // await erasureKSD(tokenAddress,admin, | // await erasureKSD(tokenAddress,admin, | ||||
| // Symbol1, | // Symbol1, |
| async function main() { | 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')); | |||||
| } | } |
| 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(); | |||||
| 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(); | |||||
| 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(); | |||||
| "snap/1" | "snap/1" | ||||
| ], | ], | ||||
| "network": { | "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 | "inbound": false | ||||
| }, | }, | ||||
| "port": "0x7662", | |||||
| "id": "0x7731be78572000f1bd2f0746f5db82d1e5c3b104d7e2e7355fe95bb909ba6ce97f54ae9f6e5a9d2cbdd42e129d2761d12b796623516fa049f9a292b12a61367e", | |||||
| "port": "0x765f", | |||||
| "id": "0x8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02", | |||||
| "protocols": { | "protocols": { | ||||
| "eth": { | "eth": { | ||||
| "difficulty": "0x114f64", | |||||
| "head": "0x179799015009e868c8f9072b4c8a146dddc049539becef95b37fda17ebc091a8", | |||||
| "difficulty": "0x11727e", | |||||
| "head": "0xb163a41b01b62a68b6a85647a99f387aa5f9a40f97cca4f38868dfd61924f85c", | |||||
| "version": 68 | "version": 68 | ||||
| } | } | ||||
| }, | }, | ||||
| "enode": "enode://7731be78572000f1bd2f0746f5db82d1e5c3b104d7e2e7355fe95bb909ba6ce97f54ae9f6e5a9d2cbdd42e129d2761d12b796623516fa049f9a292b12a61367e@10.19.13.85:30303" | |||||
| "enode": "enode://8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02@10.19.13.66:30303" | |||||
| }, | }, | ||||
| { | { | ||||
| "version": "0x5", | "version": "0x5", | ||||
| "snap/1" | "snap/1" | ||||
| ], | ], | ||||
| "network": { | "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 | "inbound": true | ||||
| }, | }, | ||||
| "port": "0x765f", | |||||
| "id": "0x8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02", | |||||
| "port": "0x778b", | |||||
| "id": "0x4a94d2e59ae5dcbe008762d259bf210c7aa82ec6bc8b5284e1787c0ba1d58f175e58bc171cc1475a152b39185e64ddd77e44521b0235f09b477cc129b88188a8", | |||||
| "protocols": { | "protocols": { | ||||
| "eth": { | "eth": { | ||||
| "difficulty": "0x114f64", | |||||
| "head": "0x179799015009e868c8f9072b4c8a146dddc049539becef95b37fda17ebc091a8", | |||||
| "difficulty": "0x11727e", | |||||
| "head": "0xb163a41b01b62a68b6a85647a99f387aa5f9a40f97cca4f38868dfd61924f85c", | |||||
| "version": 68 | "version": 68 | ||||
| } | } | ||||
| }, | }, | ||||
| "enode": "enode://8f0a13b7f83e3f98df9aee2c41889b793480340a63694a2e0e55c0b1a11f983b4e189c4886a77b2426d13ab67ebb99c01b10bace5a98dfcea58875ee01a58b02@10.21.20.78:30303?discport=0" | |||||
| "enode": "enode://4a94d2e59ae5dcbe008762d259bf210c7aa82ec6bc8b5284e1787c0ba1d58f175e58bc171cc1475a152b39185e64ddd77e44521b0235f09b477cc129b88188a8@10.19.0.33:30603?discport=0" | |||||
| }, | }, | ||||
| { | { | ||||
| "version": "0x5", | "version": "0x5", | ||||
| "snap/1" | "snap/1" | ||||
| ], | ], | ||||
| "network": { | "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 | "inbound": true | ||||
| }, | }, | ||||
| "port": "0x765f", | "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", | "id": "0xda226ac863c382c92e23c13424ec175691df4fa7660796c2d4126876cae855ea84c6fd11c8396b2605b71ee9c00601b7344d7048e0f90664f0cfe32b0282d00e", | ||||
| "protocols": { | "protocols": { | ||||
| "eth": { | "eth": { | ||||
| "difficulty": "0x114f64", | |||||
| "head": "0x179799015009e868c8f9072b4c8a146dddc049539becef95b37fda17ebc091a8", | |||||
| "difficulty": "0x11727e", | |||||
| "head": "0xb163a41b01b62a68b6a85647a99f387aa5f9a40f97cca4f38868dfd61924f85c", | |||||
| "version": 68 | "version": 68 | ||||
| } | } | ||||
| }, | }, | ||||
| "enode": "enode://da226ac863c382c92e23c13424ec175691df4fa7660796c2d4126876cae855ea84c6fd11c8396b2605b71ee9c00601b7344d7048e0f90664f0cfe32b0282d00e@10.21.20.126:30303?discport=0" | |||||
| "enode": "enode://da226ac863c382c92e23c13424ec175691df4fa7660796c2d4126876cae855ea84c6fd11c8396b2605b71ee9c00601b7344d7048e0f90664f0cfe32b0282d00e@10.19.13.67:30303" | |||||
| } | } | ||||
| ] | ] |