_section: Quick Start _subsection: Connecting to Ethereum: Metamask The quickest and easiest way to experiment and begin developing on Ethereum is to use [[link-metamask]], which is a browser extension that provider: - A connection to the Ethereum network - Holds your private key and can sign thing _code: Connecting to Metamask // A Web3Provider wraps a standard Web3 provider, which is // what Metamask injects into every page you visit as window.ethereum const provider = new ethers.providers.Web3Provider(window.ethereum) // The Metamask plugin also allows signing transactions to send ether // and pay to change state within the blockchain. For this, we need // the account signer... const signer = provider.getSigner() _heading: Querying the Blockchain Once you have a [[Provider]], you have a read-only connection to the blockchain, which can be used to query the current state, fetch historic logs, look up deployed code and so on. _code: Basic Queries // const provider = ethers.getDefaultProvider(); // // Look up the current block number provider.getBlockNumber() // Get the balance of an account (by address or ENS name) provider.getBalance("ethers.eth") _heading: Writing to the Blockchain Every write costs ... etc _code: Sending Ether // Send 1 ether to an ens name. const tx = signer.sendTransaction({ to: "ricmoo.firefly.eth", value: ethers.utils.parseEther("1.0") }); _subsection: Contracts _heading: Connecting to a Contract To connect to an contract... Explain ABI Explain meta-class and the aBI _code: Connecting to a Contract // The ERC-20 Contract ABI, which is a common contract interface // for tokens. const abi = [ // Some simple details about the token "function namd() view returns (string)", "function symbol() view returns (string)", // Get the account balance "function balanceOf(address) view returns (uint)", // Send some of your tokens to someone else "function transfer(address to, uint amount")", // An event triggered whenever anyone transfers to someone else "event Transfer(address indexed from, address indexed to, uint amount)" ]; const contract = new ethers.Contract(address, abi, provider); const contract = new ethers.Contract(address, abi, provider); _heading: Read-Only Methods _code: Querying the DAI Contract // // const contract = new Contract("dai.tokens.ethers.eth", abi, provider); contract.name() //! contract.symbol() //! contract.balanceOf("ricmoo.firefly.eth") //! _heading: State Changing Methods _heading: Listening to Events _code: Listening to Events // const contract = ... // // Receive an event when ANY transfer occurs contract.on("Transfer", (from, to, amount, event) => { console.log(`${ from } sent ${ formatEther(amount) } to ${ to}`); }); // Receive an event when a specific address receives a token const filter = contract.filters.Transfer(null, address) contract.on(filter, (from, to, amount, event) => { // The to will always be "address" console.log(`I got ${ formatEther(amount) } from ${ from }.`); }); _heading: Listing Historic Events _code: Historic Events by Name // List all transfers from anyone to anyone in the first XXX contract.queryFilter("Transfer", 0, XXX) //! _code: Filtering Historic Events // const contract = ... // const address = signer.getAddress() // Filter for all token transfers we've sent const filterFrom = contract.filter.Transfer(address, null); // filterFrom // //! // Filter for all token transfers we've received const filterTo = contract.filter.Transfer(null, address); // filterTo // //! // List all transfers we've sent between ... contract.queryFilter(filterFrom, 0, 100000) //! // List all transfers we've received in blockhash XXX contract.queryFilter(filterTo, XXX) //! _subsection: Signing Messages