| @@ -0,0 +1,249 @@ | |||
| // | |||
| import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, ethers ,Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256 | |||
| ,Transaction,formatEther, | |||
| decodeBase64 | |||
| } from 'ethers' | |||
| import { connect } from 'http2'; | |||
| const PF_TOKEN_ABI = [ | |||
| "function mint(address to, uint256 amount) external", | |||
| "function transfer(address to, uint256 amount) external returns (bool)", | |||
| "function batchMint(address[] calldata recipients, uint256[] calldata amounts) external", | |||
| "function balanceOf(address account) external view returns (uint256)", | |||
| "function totalSupply() external view returns (uint256)", | |||
| "function name() external view returns (string)", | |||
| "function symbol() external view returns (string)", | |||
| "function decimals() external view returns (uint8)", | |||
| "function hasRole(bytes32 role, address account) external view returns (bool)", | |||
| "event TokensMinted(address indexed to, uint256 amount, address indexed minter)", | |||
| "function recordInterestPayment(uint256 amount) external", | |||
| ]; | |||
| const SHS_ADDRESS="0x306f182eEdfe85d61aC2eA88acE58f565edf3DFe"; | |||
| const SHS_PRIVATE_KEY="0x3221ea02f27a2929f3a7ec75f5cac6f8207eb910a66f7e31d6391143dfbef5bf"; | |||
| const MASSET_ADDESS="0xDfc4dB2811a325DDd296C55D7A4055eD3bdB391D"; | |||
| const MASSET_PRIVATE_KEY="0x920a8a7f062b2f31da7bea211af1a5c0adb316e32301040c19d1d3748d6b7ab0"; | |||
| //TR_A | |||
| // export const SPF_CONTRACT_ADDRESS = | |||
| // "0x4e4637E3199E8a11a6dDafF64F1DCc8c7C2Aab36"; // sPF 주소 | |||
| // export const SPF_CONTRACT_ADDRESS = | |||
| // "0x3B24bfdD5D52d4b25EE5812F35334A831ecA553d"; // sPF 주소 (이자함수포함) | |||
| //TR_B | |||
| // export const SPF_CONTRACT_ADDRESS = | |||
| // "0xa1b2A55AEaEf5093fc9b04438Dc194C3B631f118"; // sPF 주소 | |||
| export const SPF_CONTRACT_ADDRESS = | |||
| "0xaB72Fe1511ac371E369DFf3B0f6Bba23198baFD2"; // sPF 주소 (이자함수포함) | |||
| const PULSE_RPC_URL = "https://secuchain.testnet.stopulse.co.kr/"; | |||
| // export const SOL_ADDRESS = "0x8DFeB78ecEe391149b1c2739cEd0f6992D0a5663"; | |||
| // const PRIVATE_KEY = | |||
| // "0x47c496fe62e38aebcf4c5298cdae6889efed27b308fb473311d4a209e512f20e"; | |||
| const PULSE_PRIVATE_KEY = | |||
| "0xcd2336d7c471a0f2f1da77e91bcaf71e96e40481415bdb062152b4d045e1702c"; | |||
| const provider = new ethers.JsonRpcProvider(PULSE_RPC_URL); | |||
| const wallet = new ethers.Wallet(SHS_PRIVATE_KEY, provider); | |||
| const wallet2 = new ethers.Wallet(MASSET_PRIVATE_KEY, provider); | |||
| const walletAdmin = new ethers.Wallet(PULSE_PRIVATE_KEY, provider); | |||
| const contractAdmin = new ethers.Contract( | |||
| SPF_CONTRACT_ADDRESS, | |||
| PF_TOKEN_ABI, | |||
| walletAdmin | |||
| ); | |||
| const contract = new ethers.Contract( | |||
| SPF_CONTRACT_ADDRESS, | |||
| PF_TOKEN_ABI, | |||
| wallet | |||
| ); | |||
| function getNewPrivateKey(){ | |||
| const newWallet = ethers.Wallet.createRandom(); | |||
| const wallet = new ethers.Wallet(newWallet.privateKey, provider); | |||
| console.log(newWallet.address); | |||
| console.log(newWallet.privateKey); | |||
| return newWallet.privateKey; | |||
| } | |||
| async function setup() { | |||
| // await mintToAddress(SHS_ADDRESS, "30000000000"); | |||
| await mintToAddress(MASSET_ADDESS, "16000000000"); | |||
| } | |||
| async function view() { | |||
| // const precision = await mmfToken.getNAVPrecision(); | |||
| const precision = await contract.getNAVPrecision(); | |||
| console.log(precision.toString()); | |||
| const currentNAV = await contract.currentNAV(); | |||
| console.log(currentNAV.toString()); | |||
| const balance = await contract.balanceOf(SHS_ADDRESS); | |||
| console.log(`balance = ${balance.toString()}}`); | |||
| } | |||
| /** | |||
| * 특정 주소에 원하는 만큼 SPF 토큰을 minting하는 함수 | |||
| * @param toAddress - 토큰을 받을 주소 | |||
| * @param amount - minting할 토큰 양 (ether 단위) | |||
| */ | |||
| async function mintToAddress(toAddress: string, amount: string) { | |||
| console.log(`Minting ${amount} SPF tokens to ${toAddress}...`); | |||
| const tx = await contractAdmin.mint( | |||
| toAddress, | |||
| ethers.parseEther(amount), | |||
| { | |||
| gasLimit: 500000, | |||
| gasPrice: 0, | |||
| } | |||
| ); | |||
| await tx.wait(1); | |||
| console.log(`Successfully minted ${amount} SPF tokens to ${toAddress}`); | |||
| // 잔액 확인 | |||
| const balance = await contractAdmin.balanceOf(toAddress); | |||
| console.log(`New balance: ${ethers.formatEther(balance)} SPF`); | |||
| } | |||
| /** | |||
| * 특정 주소의 SPF 토큰을 burn하는 함수 (dead address로 전송) | |||
| * @param fromAddress - 토큰을 burn할 주소 (이 주소의 private key를 가진 wallet 필요) | |||
| * @param amount - burn할 토큰 양 (ether 단위) | |||
| * @param privateKey - fromAddress의 private key | |||
| */ | |||
| async function burnFromAddress(fromAddress: string, amount: string, privateKey: string) { | |||
| const DEAD_ADDRESS = "0x000000000000000000000000000000000000dEaD"; | |||
| console.log(`Burning ${amount} SPF tokens from ${fromAddress} to dead address...`); | |||
| // burn할 주소의 wallet 생성 | |||
| const burnerWallet = new ethers.Wallet(privateKey, provider); | |||
| const burnerContract = new ethers.Contract( | |||
| SPF_CONTRACT_ADDRESS, | |||
| PF_TOKEN_ABI, | |||
| burnerWallet | |||
| ); | |||
| const tx = await burnerContract.transfer( | |||
| DEAD_ADDRESS, | |||
| ethers.parseEther(amount), | |||
| { | |||
| gasLimit: 500000, | |||
| gasPrice: 0, | |||
| } | |||
| ); | |||
| await tx.wait(1); | |||
| console.log(`Successfully burned ${amount} SPF tokens from ${fromAddress}`); | |||
| // 잔액 확인 | |||
| const balance = await burnerContract.balanceOf(fromAddress); | |||
| console.log(`Remaining balance: ${ethers.formatEther(balance)} SPF`); | |||
| } | |||
| /** | |||
| * SPF 토큰을 특정 주소에서 다른 주소로 전송하는 함수 | |||
| * @param fromAddress - 토큰을 보낼 주소 | |||
| * @param toAddress - 토큰을 받을 주소 | |||
| * @param amount - 전송할 토큰 양 (ether 단위) | |||
| * @param privateKey - fromAddress의 private key | |||
| */ | |||
| async function transferToken(fromAddress: string, toAddress: string, amount: string, privateKey: string) { | |||
| console.log(`Transferring ${amount} SPF tokens from ${fromAddress} to ${toAddress}...`); | |||
| // 전송할 주소의 wallet 생성 | |||
| const senderWallet = new ethers.Wallet(privateKey, provider); | |||
| const senderContract = new ethers.Contract( | |||
| SPF_CONTRACT_ADDRESS, | |||
| PF_TOKEN_ABI, | |||
| senderWallet | |||
| ); | |||
| // 전송 전 잔액 확인 | |||
| const beforeBalance = await senderContract.balanceOf(fromAddress); | |||
| console.log(`Current balance: ${ethers.formatEther(beforeBalance)} SPF`); | |||
| const amountWei = ethers.parseEther(amount); | |||
| if (beforeBalance < amountWei) { | |||
| throw new Error(`Insufficient balance. Have: ${ethers.formatEther(beforeBalance)} SPF, Need: ${amount} SPF`); | |||
| } | |||
| const tx = await senderContract.transfer( | |||
| toAddress, | |||
| amountWei, | |||
| { | |||
| gasLimit: 500000, | |||
| gasPrice: 0, | |||
| } | |||
| ); | |||
| await tx.wait(1); | |||
| console.log(`Successfully transferred ${amount} SPF tokens from ${fromAddress} to ${toAddress}`); | |||
| // 양쪽 주소의 잔액 확인 | |||
| const fromBalance = await senderContract.balanceOf(fromAddress); | |||
| const toBalance = await senderContract.balanceOf(toAddress); | |||
| console.log(`From address balance: ${ethers.formatEther(fromBalance)} SPF`); | |||
| console.log(`To address balance: ${ethers.formatEther(toBalance)} SPF`); | |||
| } | |||
| async function recordInterestPayment(amount: string) { | |||
| console.log(`Recording interest payment of ${amount} SPF...`); | |||
| console.log(`payInterest of ${amount} ...`); | |||
| const tx = await contractAdmin.recordInterestPayment( | |||
| ethers.parseEther(amount), | |||
| { | |||
| gasLimit: 500000, | |||
| gasPrice: 0, | |||
| } | |||
| ); | |||
| await tx.wait(1); | |||
| console.log(`Successfully payed ${amount} of interests`); | |||
| } | |||
| async function main() { | |||
| // recordInterestPayment("750000000"); | |||
| // recordInterestPayment("1200000000"); | |||
| // await setup(); | |||
| // await transferToken(SHS_ADDRESS,MASSET_ADDESS,"300000",SHS_PRIVATE_KEY); | |||
| //await setNav(); | |||
| // await view(); | |||
| // getNewPrivateKey(); | |||
| // getNewPrivateKey(); | |||
| } | |||
| main(); | |||
| @@ -0,0 +1,23 @@ | |||
| import { AlchemyProvider, Wallet } from 'ethers'; | |||
| // 1. 네트워크와 API 키 설정 | |||
| const network = 'matic-amoy'; // Polygon Amoy 테스트넷 | |||
| const alchemyApiKey = 'o5F9YD_LHZZEde-gXzZyv'; // 여기에 본인의 API 키 입력 | |||
| // 2. Alchemy Provider 생성 | |||
| const provider = new AlchemyProvider(network, alchemyApiKey); | |||
| // 3. 지갑 연결 (테스트용 private key 사용) | |||
| const privateKey = 'ccb3131e009c579f16e6088f89218744f670e9b09c28514c671d5ae239f0c532'; // 절대 실제 자산이 있는 키 사용 금지! | |||
| const wallet = new Wallet(privateKey, provider); | |||
| // 4. 예제: 지갑 주소와 잔액 출력 | |||
| async function main() { | |||
| const address = await wallet.getAddress(); | |||
| const balance = await provider.getBalance(address); | |||
| console.log(`🪪 Address: ${address}`); | |||
| console.log(`🪪 Balance: ${balance}`); | |||
| //console.log(`💰 Balance: ${ethers.formatEther(balance)} MATIC`); | |||
| } | |||
| main().catch(console.error); | |||
| @@ -0,0 +1,14 @@ | |||
| import Web3 from 'web3'; | |||
| const web3 = new Web3(); | |||
| async function MathInterface() { | |||
| const contract = new web3.eth.Contract(ABI, "0xc4cce39ae1e0006b811101b619d627448e5a342b"); | |||
| const uri = await contract.methods.tokenURI(9).call(); | |||
| console.log(uri); | |||
| } | |||
| @@ -0,0 +1,159 @@ | |||
| import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, ethers ,Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256 | |||
| ,Transaction,formatEther, | |||
| decodeBase64 | |||
| } from 'ethers' | |||
| import { connect } from 'http2'; | |||
| const MMF_ABI = [ | |||
| // ========== ERC20 기본 함수 ========== | |||
| "function name() view returns (string)", | |||
| "function symbol() view returns (string)", | |||
| "function decimals() view returns (uint8)", | |||
| "function totalSupply() view returns (uint256)", | |||
| "function balanceOf(address account) view returns (uint256)", | |||
| "function transfer(address to, uint256 amount) returns (bool)", | |||
| "function allowance(address owner, address spender) view returns (uint256)", | |||
| "function approve(address spender, uint256 amount) returns (bool)", | |||
| "function transferFrom(address from, address to, uint256 amount) returns (bool)", | |||
| // ========== Share-Based 함수 ========== | |||
| "function sharesOf(address account) view returns (uint256)", | |||
| "function getSharesByTokenAmount(uint256 tokenAmount) view returns (uint256)", | |||
| "function getTokenAmountByShares(uint256 shareAmount) view returns (uint256)", | |||
| // ========== Purchase 함수 ========== | |||
| "function purchaseWithDT(address buyer, uint256 dtAmount) returns (uint256)", | |||
| "function processPendingPurchase(address buyer, uint256 index) returns (bool)", | |||
| // ========== Redemption 함수 ========== | |||
| "function redeemToDT(uint256 tokenAmount) returns (uint256)", | |||
| "function redeemAll() returns (uint256)", | |||
| // ========== NAV & Rebase 함수 ========== | |||
| "function currentNAV() view returns (uint256)", | |||
| "function updateNAVAndRebase(uint256 newNAV) returns (bool)", | |||
| "function lastNAVUpdateTime() view returns (uint256)", | |||
| "function lastRebaseTime() view returns (uint256)", | |||
| "function totalRebaseAmount() view returns (uint256)", | |||
| "function getNAVDecimal() view returns (uint256, uint256)", | |||
| // ========== Lockup 함수 ========== | |||
| "function lockupUntil(address) view returns (uint256)", | |||
| "function defaultLockupPeriod() view returns (uint256)", | |||
| "function getLockupTimeRemaining(address user) view returns (uint256)", | |||
| // ========== Pending Purchase 함수 ========== | |||
| "function getPendingPurchaseCount(address user) view returns (uint256)", | |||
| "function getPendingPurchase(address user, uint256 index) view returns (uint256 dtAmount, uint256 timestamp, uint256 navAtPurchase, bool processed)", | |||
| // ========== Access Control 함수 ========== | |||
| "function hasRole(bytes32 role, address account) view returns (bool)", | |||
| "function paused() view returns (bool)", | |||
| // ========== Admin 함수 ========== | |||
| "function setDTTokenAddress(address _dtTokenAddress)", | |||
| "function setDefaultLockupPeriod(uint256 period)", | |||
| "function setUserLockup(address user, uint256 until)", | |||
| "function pause()", | |||
| "function unpause()", | |||
| "function updateNAVWithDecimals(uint256 value, uint256 decimalPlaces) external returns (bool)", | |||
| "function getNAVPrecision() external pure returns (uint256)", | |||
| // ========== Events ========== | |||
| "event Transfer(address indexed from, address indexed to, uint256 value)", | |||
| "event Approval(address indexed owner, address indexed spender, uint256 value)", | |||
| "event TokensPurchased(address indexed buyer, uint256 dtAmount, uint256 tokenAmount, uint256 nav, uint256 timestamp)", | |||
| "event TokensRedeemed(address indexed redeemer, uint256 tokenAmount, uint256 dtAmount, uint256 nav, uint256 timestamp)", | |||
| "event NAVUpdated(uint256 oldNAV, uint256 newNAV, uint256 timestamp, address updater)", | |||
| "event Rebased(uint256 oldTotalSupply, uint256 newTotalSupply, int256 rebaseAmount, uint256 nav, uint256 timestamp)", | |||
| "event LockupUpdated(address indexed user, uint256 lockupUntil)", | |||
| "event PurchasePending(address indexed buyer, uint256 dtAmount, uint256 nav, uint256 timestamp)", | |||
| "event PurchaseProcessed(address indexed buyer, uint256 index, uint256 timestamp)", | |||
| ]; | |||
| export const SMMF_CONTRACT_ADDRESS = | |||
| "0xC290e84BE1886a08760b3468D4C3083A36C17a21"; // sMMF 주소 | |||
| const PULSE_RPC_URL = "https://secuchain.testnet.stopulse.co.kr/"; | |||
| export const SOL_ADDRESS = "0x8DFeB78ecEe391149b1c2739cEd0f6992D0a5663"; | |||
| const PRIVATE_KEY = | |||
| "0x47c496fe62e38aebcf4c5298cdae6889efed27b308fb473311d4a209e512f20e"; | |||
| const PULSE_PRIVATE_KEY = | |||
| "0xcd2336d7c471a0f2f1da77e91bcaf71e96e40481415bdb062152b4d045e1702c"; | |||
| const provider = new ethers.JsonRpcProvider(PULSE_RPC_URL); | |||
| const wallet = new ethers.Wallet(PRIVATE_KEY, provider); | |||
| const walletAdmin = new ethers.Wallet(PULSE_PRIVATE_KEY, provider); | |||
| const contractAdmin = new ethers.Contract( | |||
| SMMF_CONTRACT_ADDRESS, | |||
| MMF_ABI, | |||
| walletAdmin | |||
| ); | |||
| const contract = new ethers.Contract( | |||
| SMMF_CONTRACT_ADDRESS, | |||
| MMF_ABI, | |||
| wallet | |||
| ); | |||
| async function setup() { | |||
| const amount = "1000000000"; | |||
| let tx = await contractAdmin.purchaseWithDT( | |||
| SOL_ADDRESS, | |||
| ethers.parseEther(amount), | |||
| { | |||
| gasLimit: 500000, // 가스 한도 증가 | |||
| gasPrice: 0, | |||
| } | |||
| ); | |||
| await tx.wait(1); | |||
| const currentNAV = await contractAdmin.currentNAV(); | |||
| console.log(currentNAV.toString()); | |||
| // const balance = await mmfToken.balanceOf(userA.address); | |||
| const balance = await contractAdmin.balanceOf(SOL_ADDRESS); | |||
| console.log(`balance = ${balance.toString()}}`); | |||
| } | |||
| async function setNav() { | |||
| await contractAdmin.updateNAVWithDecimals(10002365, 7); | |||
| } | |||
| async function view() { | |||
| // const precision = await mmfToken.getNAVPrecision(); | |||
| const precision = await contract.getNAVPrecision(); | |||
| console.log(`precision = : ${precision.toString()}`); | |||
| const currentNAV = await contract.currentNAV(); | |||
| console.log(`currentNAV = : ${ currentNAV.toString()}`); | |||
| const balance = await contract.balanceOf(SOL_ADDRESS); | |||
| console.log(`balance = ${balance.toString()}}`); | |||
| } | |||
| async function main() { | |||
| //await setup(); | |||
| //await setNav(); | |||
| await view(); | |||
| } | |||
| main(); | |||
| @@ -0,0 +1,24 @@ | |||
| import { createPublicClient, http, Block } from "viem"; | |||
| import { polygonAmoy } from "viem/chains"; | |||
| async function main() { | |||
| const client = createPublicClient({ | |||
| chain: polygonAmoy, | |||
| transport: http("https://polygon-amoy.g.alchemy.com/v2/o5F9YD_LHZZEde-gXzZyv"), | |||
| }); | |||
| const block: Block = await client.getBlock({ | |||
| blockNumber: 123456n, | |||
| }); | |||
| console.log(block); | |||
| } | |||
| main(); | |||
| @@ -16,6 +16,7 @@ | |||
| "ethers": "^6.13.4", | |||
| "hardhat-ethers": "^1.0.1", | |||
| "typescript": "^5.6.3", | |||
| "viem": "^2.36.0", | |||
| "web3": "^4.16.0" | |||
| }, | |||
| "devDependencies": { | |||
| @@ -12,7 +12,7 @@ | |||
| resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" | |||
| integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== | |||
| "@adraffy/ens-normalize@^1.8.8": | |||
| "@adraffy/ens-normalize@^1.11.0", "@adraffy/ens-normalize@^1.8.8": | |||
| version "1.11.0" | |||
| resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" | |||
| integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== | |||
| @@ -469,6 +469,11 @@ | |||
| tweetnacl "^1.0.3" | |||
| tweetnacl-util "^0.15.1" | |||
| "@noble/ciphers@^1.3.0": | |||
| version "1.3.0" | |||
| resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.3.0.tgz#f64b8ff886c240e644e5573c097f86e5b43676dc" | |||
| integrity sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw== | |||
| "@noble/curves@1.2.0", "@noble/curves@~1.2.0": | |||
| version "1.2.0" | |||
| resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" | |||
| @@ -483,6 +488,20 @@ | |||
| dependencies: | |||
| "@noble/hashes" "1.4.0" | |||
| "@noble/curves@1.9.6": | |||
| version "1.9.6" | |||
| resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.6.tgz#b45ebedca85bb75782f6be7e7f120f0c423c99e0" | |||
| integrity sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA== | |||
| dependencies: | |||
| "@noble/hashes" "1.8.0" | |||
| "@noble/curves@^1.9.1", "@noble/curves@~1.9.0": | |||
| version "1.9.7" | |||
| resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951" | |||
| integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw== | |||
| dependencies: | |||
| "@noble/hashes" "1.8.0" | |||
| "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": | |||
| version "1.2.0" | |||
| resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" | |||
| @@ -498,6 +517,11 @@ | |||
| resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" | |||
| integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== | |||
| "@noble/hashes@1.8.0", "@noble/hashes@^1.8.0", "@noble/hashes@~1.8.0": | |||
| version "1.8.0" | |||
| resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" | |||
| integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== | |||
| "@noble/hashes@^1.4.0": | |||
| version "1.5.0" | |||
| resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" | |||
| @@ -817,6 +841,11 @@ | |||
| resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" | |||
| integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== | |||
| "@scure/base@~1.2.5": | |||
| version "1.2.6" | |||
| resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" | |||
| integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== | |||
| "@scure/bip32@1.1.5": | |||
| version "1.1.5" | |||
| resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" | |||
| @@ -844,6 +873,15 @@ | |||
| "@noble/hashes" "~1.4.0" | |||
| "@scure/base" "~1.1.6" | |||
| "@scure/bip32@1.7.0", "@scure/bip32@^1.7.0": | |||
| version "1.7.0" | |||
| resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.7.0.tgz#b8683bab172369f988f1589640e53c4606984219" | |||
| integrity sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw== | |||
| dependencies: | |||
| "@noble/curves" "~1.9.0" | |||
| "@noble/hashes" "~1.8.0" | |||
| "@scure/base" "~1.2.5" | |||
| "@scure/bip39@1.1.1": | |||
| version "1.1.1" | |||
| resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" | |||
| @@ -868,6 +906,14 @@ | |||
| "@noble/hashes" "~1.4.0" | |||
| "@scure/base" "~1.1.6" | |||
| "@scure/bip39@1.6.0", "@scure/bip39@^1.6.0": | |||
| version "1.6.0" | |||
| resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.6.0.tgz#475970ace440d7be87a6086cbee77cb8f1a684f9" | |||
| integrity sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A== | |||
| dependencies: | |||
| "@noble/hashes" "~1.8.0" | |||
| "@scure/base" "~1.2.5" | |||
| "@sentry/core@5.30.0": | |||
| version "5.30.0" | |||
| resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" | |||
| @@ -1080,6 +1126,16 @@ abitype@1.0.0: | |||
| resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" | |||
| integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== | |||
| abitype@1.0.8: | |||
| version "1.0.8" | |||
| resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" | |||
| integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== | |||
| abitype@^1.0.8: | |||
| version "1.0.9" | |||
| resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.9.tgz#f66940f69caf2b6c190088a017e289dbe41090a6" | |||
| integrity sha512-oN0S++TQmlwWuB+rkA6aiEefLv3SP+2l/tC5mux/TLj6qdA6rF15Vbpex4fHovLsMkwLwTIRj8/Q8vXCS3GfOg== | |||
| acorn-walk@^8.1.1: | |||
| version "8.3.4" | |||
| resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" | |||
| @@ -2075,7 +2131,7 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: | |||
| is-hex-prefixed "1.0.0" | |||
| strip-hex-prefix "1.0.0" | |||
| eventemitter3@^5.0.1: | |||
| eventemitter3@5.0.1, eventemitter3@^5.0.1: | |||
| version "5.0.1" | |||
| resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" | |||
| integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== | |||
| @@ -2837,6 +2893,11 @@ isows@1.0.3: | |||
| resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" | |||
| integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== | |||
| isows@1.0.7: | |||
| version "1.0.7" | |||
| resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.7.tgz#1c06400b7eed216fbba3bcbd68f12490fc342915" | |||
| integrity sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg== | |||
| jackspeak@^3.1.2: | |||
| version "3.4.3" | |||
| resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" | |||
| @@ -3233,6 +3294,20 @@ os-tmpdir@~1.0.2: | |||
| resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" | |||
| integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== | |||
| ox@0.9.1: | |||
| version "0.9.1" | |||
| resolved "https://registry.yarnpkg.com/ox/-/ox-0.9.1.tgz#d3300afe70c5b2ec50a9df3097f8bb0523b306a5" | |||
| integrity sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now== | |||
| dependencies: | |||
| "@adraffy/ens-normalize" "^1.11.0" | |||
| "@noble/ciphers" "^1.3.0" | |||
| "@noble/curves" "^1.9.1" | |||
| "@noble/hashes" "^1.8.0" | |||
| "@scure/bip32" "^1.7.0" | |||
| "@scure/bip39" "^1.6.0" | |||
| abitype "^1.0.8" | |||
| eventemitter3 "5.0.1" | |||
| p-limit@^3.0.2: | |||
| version "3.1.0" | |||
| resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" | |||
| @@ -4104,6 +4179,20 @@ viem@2.7.14: | |||
| isows "1.0.3" | |||
| ws "8.13.0" | |||
| viem@^2.36.0: | |||
| version "2.36.0" | |||
| resolved "https://registry.yarnpkg.com/viem/-/viem-2.36.0.tgz#e564484018c6e4432dfa936fdda4ca585008d4f7" | |||
| integrity sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ== | |||
| dependencies: | |||
| "@noble/curves" "1.9.6" | |||
| "@noble/hashes" "1.8.0" | |||
| "@scure/bip32" "1.7.0" | |||
| "@scure/bip39" "1.6.0" | |||
| abitype "1.0.8" | |||
| isows "1.0.7" | |||
| ox "0.9.1" | |||
| ws "8.18.3" | |||
| web3-core@^4.4.0, web3-core@^4.5.0, web3-core@^4.6.0, web3-core@^4.7.1: | |||
| version "4.7.1" | |||
| resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-4.7.1.tgz#bc56cd7959fe44ee77139d591211f69851140009" | |||
| @@ -4462,6 +4551,11 @@ ws@8.17.1: | |||
| resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" | |||
| integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== | |||
| ws@8.18.3: | |||
| version "8.18.3" | |||
| resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" | |||
| integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== | |||
| ws@^7.4.6: | |||
| version "7.5.10" | |||
| resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" | |||