Skip to content

Commit

Permalink
add mocknet
Browse files Browse the repository at this point in the history
  • Loading branch information
mr-zwets authored and rkalis committed Sep 24, 2024
1 parent 68c61c1 commit 573da29
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 18 deletions.
10 changes: 5 additions & 5 deletions src/components/App.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Components
import React, { useState } from 'react';
import { Artifact, ElectrumNetworkProvider, NetworkProvider } from 'cashscript';
import { Artifact, MockNetworkProvider, NetworkProvider } from 'cashscript';
import Header from './Header'
import Main from './Main'
import Footer from './Footer';
Expand All @@ -13,7 +13,7 @@ import Contracts from './Contracts';
import TransactionBuilder from './TransactionBuilder';

function App() {
const [provider, setProvider] = useState<NetworkProvider>(new ElectrumNetworkProvider("chipnet"))
const [provider, setProvider] = useState<NetworkProvider>(new MockNetworkProvider())
const [wallets, setWallets] = useState<Wallet[]>([])
const [artifacts, setArtifacts] = useState<Artifact[] | undefined>(undefined);
const [contracts, setContracts] = useState<ContractInfo[] | undefined>(undefined)
Expand Down Expand Up @@ -41,7 +41,7 @@ contract TransferWithTimeout(pubkey sender, pubkey recipient, int timeout) {
if (!currentContract) return
// create a separate lists for utxos and mutate entry
const utxosList = contracts.map(contract => contract.utxos ?? [])
const contractUtxos = await currentContract.getUtxos();
const contractUtxos = await provider.getUtxos(currentContract.address);
utxosList[contractIndex] = contractUtxos
// map is the best way to deep clone array of complex objects
const newContracts: ContractInfo[] = contracts.map((contractInfo,index) => (
Expand All @@ -54,7 +54,7 @@ contract TransferWithTimeout(pubkey sender, pubkey recipient, int timeout) {
if(!contracts) return

const utxosPromises = contracts.map(contractInfo => {
const contractUtxos = contractInfo.contract.getUtxos();
const contractUtxos = provider.getUtxos(contractInfo.contract.address);
return contractUtxos ?? []
})
const utxosContracts = await Promise.all(utxosPromises)
Expand Down Expand Up @@ -82,7 +82,7 @@ contract TransferWithTimeout(pubkey sender, pubkey recipient, int timeout) {
<NewContract artifacts={artifacts} provider={provider} setProvider={setProvider} contracts={contracts} setContracts={setContracts} updateUtxosContract={updateUtxosContract} />
</Tab>
<Tab eventKey="contracts" title="Contracts">
<Contracts contracts={contracts} setContracts={setContracts} updateUtxosContract={updateUtxosContract} />
<Contracts provider={provider} contracts={contracts} setContracts={setContracts} updateUtxosContract={updateUtxosContract} />
</Tab>
<Tab eventKey="wallets" title="Wallets">
<WalletInfo provider={provider} wallets={wallets} setWallets={setWallets}/>
Expand Down
15 changes: 11 additions & 4 deletions src/components/ContractFunction.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react'
import { AbiFunction, NetworkProvider, FunctionArgument, Recipient, SignatureTemplate } from 'cashscript'
import { AbiFunction, NetworkProvider, FunctionArgument, Recipient, SignatureTemplate, MockNetworkProvider } from 'cashscript'
import { Form, InputGroup, Button, Card } from 'react-bootstrap'
import { readAsType, ExplorerString, Wallet, NamedUtxo, ContractInfo } from './shared'

Expand Down Expand Up @@ -289,10 +289,17 @@ const ContractFunction: React.FC<Props> = ({ contractInfo, abi, provider, wallet
// if noAutomaticChange is enabled, add this to the transaction in construction
if (noAutomaticChange) transaction.withoutChange().withoutTokenChange()
transaction.to(outputs)
const { txid } = await transaction.send()

alert(`Transaction successfully sent: ${ExplorerString[provider.network]}/tx/${txid}`)
console.log(`Transaction successfully sent: ${ExplorerString[provider.network]}/tx/${txid}`)
// check for mocknet
if(provider instanceof MockNetworkProvider){
await transaction.debug()
alert(`Transaction evalution passed! Bitauth IDE link: ${await transaction.bitauthUri()}`)
console.log(`Transaction evalution passed! Bitauth IDE link: ${await transaction.bitauthUri()}`)
} else {
const { txid } = await transaction.send()
alert(`Transaction successfully sent: ${ExplorerString[provider.network]}/tx/${txid}`)
console.log(`Transaction successfully sent: ${ExplorerString[provider.network]}/tx/${txid}`)
}
updateUtxosContract(contract.name)
} catch (e: any) {
alert(e.message)
Expand Down
25 changes: 23 additions & 2 deletions src/components/Contracts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@ import CopyText from './shared/CopyText'
import { Card, Button } from 'react-bootstrap'
import { ContractInfo } from './shared'
import InfoUtxos from './InfoUtxos'
import { MockNetworkProvider, NetworkProvider, randomUtxo } from 'cashscript'

interface Props {
provider: NetworkProvider
contracts: ContractInfo[] | undefined
setContracts: (contract: ContractInfo[] | undefined) => void
updateUtxosContract: (contractName: string) => void
}

const Contracts: React.FC<Props> = ({ contracts, setContracts, updateUtxosContract }) => {
const Contracts: React.FC<Props> = ({ provider, contracts, setContracts, updateUtxosContract }) => {

const removeContract = (contractInfo: ContractInfo) => {
const contractToRemove = contractInfo.contract
Expand All @@ -19,6 +21,12 @@ const Contracts: React.FC<Props> = ({ contracts, setContracts, updateUtxosContra
setContracts(newContracts)
}

const addRandomUtxo = (contractInfo:ContractInfo) => {
if(!(provider instanceof MockNetworkProvider)) return
provider.addUtxo(contractInfo.contract.address, randomUtxo())
updateUtxosContract(contractInfo.contract.name)
}

return (
<div style={{
height: 'calc(100vh - 170px)',
Expand Down Expand Up @@ -66,9 +74,11 @@ const Contracts: React.FC<Props> = ({ contracts, setContracts, updateUtxosContra
<p>loading ...</p>:
(<div>
{contractInfo?.utxos.length} {contractInfo?.utxos.length == 1 ? "utxo" : "utxos"}
<span onClick={() => {}} style={{cursor:"pointer", marginLeft:"10px"}}>
{ undefined === (provider as MockNetworkProvider)?.addUtxo ? (<>
<span onClick={() => {}} style={{cursor:"pointer", marginLeft:"10px"}}>
<Button size='sm' onClick={() => updateUtxosContract(contractInfo.contract.name)} variant='secondary' style={{padding:" 0px 2px"}}>refresh ⭯</Button>
</span>
</>) : null}
{contractInfo.utxos.length ?
<details>
<summary>Show utxos</summary>
Expand All @@ -78,6 +88,17 @@ const Contracts: React.FC<Props> = ({ contracts, setContracts, updateUtxosContra
</details> : null}
</div>)
}
{ undefined !== (provider as MockNetworkProvider)?.addUtxo ? (
<div>
<strong>Create new contract utxo</strong>
<div onClick={() => addRandomUtxo(contractInfo)} style={{cursor:"pointer"}}>
<Button size='sm' variant='secondary' style={{padding:" 0px 2px"}}>add random utxo</Button>
</div>
<details>
<summary>Create custom utxo</summary>
<p>coming soon...</p>
</details>
</div>) : null}
<strong>Total contract balance</strong>
{contractInfo.utxos == undefined?
<p>loading ...</p>:
Expand Down
9 changes: 6 additions & 3 deletions src/components/NewContract.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,22 @@ const NewContract: React.FC<Props> = ({ artifacts, provider, setProvider, contra
</Form.Control>
)

function changeNetwork(newNetwork: Network){
const newprovider = new ElectrumNetworkProvider(newNetwork)
function changeNetwork(newNetwork: "mocknet" | Network){
const newprovider = newNetwork == "mocknet" ?
new MockNetworkProvider() : new ElectrumNetworkProvider(newNetwork)
setProvider(newprovider)
}

const networkSelector = (
<Form.Control size="sm" id="network-selector" style={{width: "350px", display:"inline-block"}}
as="select"
value={provider.network}
value={provider.network != "chipnet" ? provider.network
: ((provider as MockNetworkProvider)?.addUtxo)? "mocknet" : "chipnet" }
onChange={(event) => {
changeNetwork(event.target.value as Network)
}}
>
<option>mocknet</option>
<option>chipnet</option>
<option>testnet3</option>
<option>testnet4</option>
Expand Down
27 changes: 23 additions & 4 deletions src/components/Wallets.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useEffect } from 'react'
import { NetworkProvider } from 'cashscript'
import { MockNetworkProvider, NetworkProvider, randomUtxo } from 'cashscript'
import { ColumnFlex, Wallet } from './shared'
import { Button, Card } from 'react-bootstrap'
import {
Expand Down Expand Up @@ -123,6 +123,12 @@ const WalletInfo: React.FC<Props> = ({provider, wallets, setWallets}) => {
setWallets(walletsCopy)
}

const addRandomUtxo = (wallet: Wallet, index: number) => {
if(!(provider instanceof MockNetworkProvider)) return
provider.addUtxo(wallet.address, randomUtxo())
updateUtxosWallet(wallet, index)
}

const walletList = wallets.map((wallet, index) => (
<Card style={{ marginBottom: '10px' }} key={wallet.privKeyHex}>
<Card.Header style={{ display:"flex", justifyContent:"space-between"}}>
Expand All @@ -148,10 +154,23 @@ const WalletInfo: React.FC<Props> = ({provider, wallets, setWallets}) => {
<Card.Text><strong>Wallet utxos</strong></Card.Text>
<div>
<span>{wallet.utxos?.length} {wallet.utxos?.length == 1 ? "utxo" : "utxos"}</span>
<span onClick={() => updateUtxosWallet(wallet,index)} style={{cursor:"pointer", marginLeft:"10px"}}>
<Button size='sm' variant='secondary' style={{padding:" 0px 2px"}}>refresh ⭯</Button>
</span>
{ undefined === (provider as MockNetworkProvider)?.addUtxo ? (<>
<span onClick={() => updateUtxosWallet(wallet,index)} style={{cursor:"pointer", marginLeft:"10px"}}>
<Button size='sm' variant='secondary' style={{padding:" 0px 2px"}}>refresh ⭯</Button>
</span>
</>) : null}
</div>
{ undefined !== (provider as MockNetworkProvider)?.addUtxo ? (
<div>
<strong>Create new wallet utxo</strong>
<div onClick={() => addRandomUtxo(wallet, index)} style={{cursor:"pointer"}}>
<Button size='sm' variant='secondary' style={{padding:" 0px 2px"}}>add random utxo</Button>
</div>
<details>
<summary>Create custom utxo</summary>
<p>coming soon...</p>
</details>
</div>) : null}
<Card.Text><strong>Wallet Balance</strong></Card.Text>
<div>{wallet.utxos?.reduce((acc, utxo) => acc + utxo.satoshis, 0n).toString()} satoshis</div>
<strong>Private Key</strong>
Expand Down

0 comments on commit 573da29

Please sign in to comment.