diff --git a/abi.js b/abi.js index 423c0cc..27f4455 100644 --- a/abi.js +++ b/abi.js @@ -19,6 +19,12 @@ export const erc20Abi = [ ] +export const mockErc20Abi = [ + ...erc20Abi, + 'function mint(address,uint256)', +] + + const factoryAbi = [ 'function deployVault(address owner, uint8 num) returns (address vault)', 'event VaultCreated( address deployer, address owner )', diff --git a/faucet.js b/faucet.js new file mode 100644 index 0000000..9560cea --- /dev/null +++ b/faucet.js @@ -0,0 +1,30 @@ +import {ethers} from "ethers"; +import {getProvider} from "./blockchain.js"; +import {chainInfo} from "./chain.js"; +import {vaultAddress} from "./vault.js"; +import {mockErc20Abi} from "./abi.js"; + + +export async function faucet( chainId, owner, vault=null ) { + if( chainId === 31337 ) { + if( vault === null ) + vault = vaultAddress(chainId, owner) + const provider = getProvider(chainId); + let faucet = new ethers.Wallet( + // Dev Account #8 + '0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97', + provider + ) + let nonce = await provider.getTransactionCount(faucet.address, 'pending') + faucet = new ethers.NonceManager(faucet) + await faucet.sendTransaction({to:owner, value:1n *10n**18n, nonce: nonce++}) + const info = chainInfo[31337] + if( info.mockCoins ) { + const [coinAddr, usdAddr] = info.mockCoins + const signer = await provider.getSigner() + await new ethers.Contract(coinAddr, mockErc20Abi, signer).mint(vault, 10n *10n**18n) + await new ethers.Contract(usdAddr, mockErc20Abi, signer).mint(vault, 10_1000n *10n**6n) + } + } +} + diff --git a/main.js b/main.js index 2507739..8d260e8 100644 --- a/main.js +++ b/main.js @@ -2,9 +2,10 @@ import 'dotenv/config' import {lookupToken} from "./token.js"; import {httpServer, io} from "./io.js"; -import {ensureVault, loginAddress} from "./vault.js"; +import {ensureVault, loginAddress, vaultAddress} from "./vault.js"; import {chainInfo, VAULT_INIT_CODE_HASH} from "./chain.js"; import {subPools, unsubPools} from "./pool.js"; +import {faucet} from "./faucet.js"; // setup socket.io @@ -18,13 +19,16 @@ io.on("connection", (socket) => { socket.on('subPools', (chainId, addresses) => subPools(socket, chainId, addresses) ) socket.on('unsubPools', (chainId, addresses) => unsubPools(socket, chainId, addresses) ) socket.on('ensureVault', (chainId,owner,num) => ensureVault(socket, chainId, owner, num) ) + if( 31337 in chainInfo && chainInfo[31337]?.mockenv ) + socket.on('faucet', async (chainId, owner) => await faucet(chainId, owner)) socket.join('public') socket.emit('welcome', {chainInfo, vaultInitCodeHash:VAULT_INIT_CODE_HASH}) }); -io.on("disconnection", (socket)=>{ - socket.leave('public') -}) +// io.on("disconnection", (socket)=>{ +// socket.leave('public') // todo isn't this automatic? +// todo unsub pools etc? +// }) const port = parseInt(process.env.DEXORDER_PORT) || 3000; httpServer.listen(port) diff --git a/order.js b/order.js index d3208af..d6b4967 100644 --- a/order.js +++ b/order.js @@ -62,9 +62,7 @@ export async function recentOrders( socket, chainId, vault, limit=25 ) { where oi.chain=${chainId} and oi.vault='${vault}' and sd.series='o' and sd.key=concat('${vault}','|',to_char(oi.order_index, 'FM00000')) order by oi.order_index desc limit ${limit}`; - console.log('sql',sql) const query = await db.query(sql) - console.log('got historical statuses', query) const result = [] for( const {order_index, value} of query.rows) result.push([order_index,JSON.parse(value)]) diff --git a/token.js b/token.js index 217201b..4409d73 100644 --- a/token.js +++ b/token.js @@ -12,6 +12,10 @@ const tokens = { 31337: std_arbitrum_tokens, } +export function erc20(chainId, addr, provider=null) { + return new ethers.Contract(addr, erc20Abi, provider?provider:getProvider(chainId)); +} + export async function lookupToken(chainId, address) { // console.log('lookupToken', chainId, address) const chainTokens = tokens[chainId] @@ -26,7 +30,7 @@ export async function lookupToken(chainId, address) { // todo look in tokens project const addr = ethers.getAddress(address) // console.log('addr', addr) - const token = new ethers.Contract(addr, erc20Abi, getProvider(chainId)) + const token = erc20(chainId, addr) const symbol = await token.symbol() // console.log('symbol', symbol) const decimals = Number(await token.decimals()) diff --git a/vault.js b/vault.js index 776231b..7ebd310 100644 --- a/vault.js +++ b/vault.js @@ -4,6 +4,7 @@ import {getProvider, getSigner} from "./blockchain.js"; import {vaultBalances, vaults} from './cache.js'; import {chainInfo, VAULT_INIT_CODE_HASH} from "./chain.js"; import {sendVaultOrders} from "./order.js"; +import {faucet} from "./faucet.js"; // Vault // address owner @@ -90,22 +91,22 @@ async function createVault(chainId, owner, num) { console.log('createVault', chainId, owner, num ) const signer = getSigner(chainId); const deployer = new ethers.Contract(chainInfo[chainId].factory, factoryAbi, signer) - const addr = vaultAddress(chainId, owner, num) + const vaultAddr = vaultAddress(chainId, owner, num) try { const tx = await deployer.deployVault(owner, num) // console.log(`deploying vault for ${owner} #${num} with tx ${tx.hash}`) await tx.wait() } catch (e) { - const vault = new ethers.Contract(addr, vaultAbi, getProvider(chainId)) + const vault = new ethers.Contract(vaultAddr, vaultAbi, getProvider(chainId)) try { const ver = await vault.version() - console.log(`vault already deployed at ${addr} with version ${ver}`) + console.log(`vault already deployed at ${vaultAddr} with version ${ver}`) } catch (e2) { console.error('could not deploy vault:',e) return null } } - return addr + return vaultAddr }