Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Promote develop to master #141

Merged
merged 50 commits into from
Oct 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
a8fb11d
getWalletPublicKey returning an address
ccali11 Sep 22, 2022
de3cab9
Get ethereum address from ledger device
ccali11 Sep 22, 2022
e4b52f8
Stashing active changes (createEthTransaction) before switching branch
ccali11 Sep 23, 2022
67c84a2
Set up signMessage method and vue component
ccali11 Sep 23, 2022
04d1fa1
Handle signMessage for Metamask and CoinBase wallet
ccali11 Sep 23, 2022
8fda00c
Handle IoTex message signing
ccali11 Sep 23, 2022
6def61d
Get sendTransaction to request wallet to sign and send
ccali11 Oct 2, 2022
cfd9714
Stash changes
ccali11 Oct 2, 2022
a192dcb
Move most of ledger code into its composable
ccali11 Oct 2, 2022
7fbafab
Sign message with ledger
ccali11 Oct 2, 2022
5ac7b08
Merge branch 'feature/ledger-eth' into feature/ledger-eth-nonce-signing
ccali11 Oct 3, 2022
3cd9607
Fix merge conflicts and merge branch 'feature/nonce-signing' into fea…
ccali11 Oct 3, 2022
ab7372d
Resolve Shane's comments from PR (and add some notes)
ccali11 Oct 3, 2022
88808ed
Add default local networks to dev script
shanejearley Oct 4, 2022
f30fe81
Add parenthesis around pwd in ledger compile
shanejearley Oct 4, 2022
8f294b1
Offload the ethereum browser wallet logic to ethers.ts from connectWa…
ccali11 Oct 5, 2022
2522eae
Move ethereum browser wallet sendTransaction logic to ethers.ts
ccali11 Oct 5, 2022
8809e99
Offload ethereum browser wallet signMessage to ethers.ts
ccali11 Oct 5, 2022
7722686
Add crawler test script and refactor existing scripts
shanejearley Oct 5, 2022
623530a
Reset package-lock
shanejearley Oct 5, 2022
cb24947
Merge pull request #140 from consensusnetworks/enhancement/scripts-re…
shanejearley Oct 5, 2022
7734d46
Add depoist event
hawyar Oct 6, 2022
1ff2187
Clean
hawyar Oct 6, 2022
3786eaf
Use one tx ref for use by different providers in respective composables
ccali11 Oct 6, 2022
4df4a69
Use disableWalletConnect from composable to disconnect WalletConnect
ccali11 Oct 6, 2022
fc958b4
Update wallet component with phantom code
ccali11 Oct 6, 2022
78f9faa
Connect to phantom address working
ccali11 Oct 7, 2022
15cf1c8
Phantom sending transactions
ccali11 Oct 7, 2022
00776ed
Improve formatting
ccali11 Oct 7, 2022
41d66a2
Implement signSolanaMessage
ccali11 Oct 7, 2022
5314318
Autoformat on save solana.ts
ccali11 Oct 7, 2022
1470cf5
More changes
hawyar Oct 7, 2022
eb8cec8
Update const tx to no longer be a ref
ccali11 Oct 7, 2022
4567ded
Add providerString as an attribute on the tx object
ccali11 Oct 7, 2022
e666d36
Update signLedgerMessage naming
ccali11 Oct 7, 2022
5f985d9
Clean up signMessage with MessageInit interface
ccali11 Oct 7, 2022
9d1c9c5
Clean up walletConnect.ts with appropriate interface
ccali11 Oct 7, 2022
d833cd5
Merge changes from develop
shanejearley Oct 7, 2022
f1d3175
Uninstall @ledgerhq/hw-transport-webhid
shanejearley Oct 7, 2022
dea36e3
Merge pull request #137 from consensusnetworks/feature/ledger-eth-non…
ccali11 Oct 7, 2022
d96f4c7
Merge changes from develop
shanejearley Oct 7, 2022
9a39605
Merge pull request #143 from consensusnetworks/feature/phantom-new
ccali11 Oct 7, 2022
1f98d14
Update schema
hawyar Oct 8, 2022
b68e45f
Quick fix
hawyar Oct 10, 2022
9bc0ed5
Get contract of interest logs
hawyar Oct 11, 2022
17c0417
Clean
hawyar Oct 11, 2022
599149d
Merge branch 'develop' into feature/beacon-deposit-event
shanejearley Oct 11, 2022
20e5c3c
Fix gas data types
hawyar Oct 11, 2022
467fcc2
Merge branch 'feature/beacon-deposit-event' of https://github.com/con…
hawyar Oct 11, 2022
100f421
Merge pull request #142 from consensusnetworks/feature/beacon-deposit…
hawyar Oct 11, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,3 @@ template.out
aws.env
*.log
.idea

# Hardhat
contracts/evm/build/cache
12 changes: 12 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,18 @@
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"[html]": {
"editor.defaultFormatter": "Vue.volar"
},
"[vue]": {
"editor.defaultFormatter": "Vue.volar"
},
"[javascript]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"[json]": {
"editor.defaultFormatter": "vscode.json-language-features"
},
"eslint.validate": [
"vue",
"typescript"
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,21 +95,21 @@ You can get up and running without configuration. You can also mock local backen

### Hardhat

EVM contract development is serviced through [Hardhat](https://hardhat.io/). The Hardhat development environment is configured in the [contracts/evm/hardhat.config.ts](contracts/evm/hardhat.config.ts) file.
Ethereum contract development is serviced through [Hardhat](https://hardhat.io/). The Hardhat development environment is configured in the [contracts/ethereum/hardhat.config.ts](contracts/ethereum/hardhat.config.ts) file.

1. Compile the contracts in [contracts/evm](contracts/evm).
1. Compile the contracts in [contracts/ethereum](contracts/ethereum).

```zsh
npm run task:compile
```

2. Deploy a contract, specifically [contracts/evm/src/Sample.sol](contracts/evm/src/Sample.sol) with [contracts/evm/deploy/sample.ts](contracts/evm/deploy/sample.ts).
2. Deploy a contract, specifically [contracts/ethereum/src/Sample.sol](contracts/ethereum/src/Sample.sol) with [contracts/ethereum/deploy/sample.ts](contracts/ethereum/deploy/sample.ts).

```zsh
npm run deploy:sample
```

3. Test the Sample with the tests in [contracts/evm/test/sample.ts](contracts/evm/test/sample.ts).
3. Test the Sample with the tests in [contracts/ethereum/test/sample.ts](contracts/ethereum/test/sample.ts).

```zsh
npm run test:contracts
Expand All @@ -127,7 +127,7 @@ EVM contract development is serviced through [Hardhat](https://hardhat.io/). The
// Todo add Casimir Typescript usage
```

7. Clean [contracts/evm/build/artifacts](contracts/evm/build/artifacts) and [contracts/evm/build/cache](contracts/evm/build/cache)).
7. Clean [contracts/ethereum/build/artifacts](contracts/ethereum/build/artifacts) and [contracts/ethereum/build/cache](contracts/ethereum/build/cache)).

```zsh
npm run task:clean
Expand Down
4 changes: 3 additions & 1 deletion apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@
"dependencies": {
"@heroicons/vue": "^1.0.6",
"@ledgerhq/hw-app-eth": "^6.29.4",
"@ledgerhq/hw-transport-webhid": "^6.27.2",
"@ledgerhq/hw-transport-webusb": "^6.27.4",
"@solana/web3.js": "^1.63.1",
"@walletconnect/client": "^1.8.0",
"@walletconnect/qrcode-modal": "^1.8.0",
"borsh": "^0.7.0",
"buffer": "^6.0.3",
"ethers": "^5.6.9",
"iotex-antenna": "^0.31.3",
Expand Down
96 changes: 75 additions & 21 deletions apps/web/src/components/Wallet.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@
</p>
</div>
<div class="coinbase-div">
<button class="coinbase-btn" @click="connectWallet('CoinbaseWallet')">
<button
class="coinbase-btn"
@click="connectWallet('CoinbaseWallet')"
>
{{ coinbaseButtonText }}
</button>
<p>
Expand All @@ -20,15 +23,33 @@
</p>
</div>
<div class="ioPay-div">
<button class="iopay-btn" @click="connectWallet('IoPay')">
<button
class="iopay-btn"
@click="connectWallet('IoPay')"
>
{{ ioPayButtonText }}
</button>
<p>
Connected ioPay Account:
<span> {{ ioPayAccountsResult }} </span>
</p>
</div>
<button class="ledger-btn" @click="connectWallet('Ledger')">
<div class="phantom-div">
<button
class="phantom-btn"
@click="connectWallet('Phantom')"
>
{{ phantomButtonText }}
</button>
<p>
Connected phantom Account:
<span> {{ phantomAccountsResult }} </span>
</p>
</div>
<button
class="ledger-btn"
@click="connectWallet('Ledger')"
>
Connect Ledger
</button>
<div>
Expand All @@ -38,28 +59,37 @@
>
WalletConnect
</button>
<button
class="wallet-connect-btn"
@click="sendTransaction('WalletConnect')"
>
Send WalletConnect Transaction
</button>
<button
class="wallet-connect-btn"
@click="disconnectWallet('WalletConnect')"
>
Disable WalletConnect
</button>
</div>
</div>
<div class="form-container">
<form @submit.prevent="sendTransaction(selectedProvider)">
<div class="sign-message-container">
<input
v-model="message"
type="text"
placeholder="Write a message to sign"
>
<button @click="signMessage(message)">
Sign Message
</button>
<p>{{ signedMessage }}</p>
</div>
<form @submit.prevent="sendTransaction()">
<label for="address">Address</label>
<input v-model="toAddress" type="text" placeholder="To Address" />
<br />
<input
v-model="toAddress"
type="text"
placeholder="To Address"
>
<br>
<label for="amount">Amount</label>
<input v-model="amount" type="text" placeholder="Amount Ether" />
<button type="submit">Send Transaction</button>
<input
v-model="amount"
type="text"
placeholder="Amount Ether"
>
<button type="submit">
Send Transaction
</button>
</form>
</div>
</div>
Expand All @@ -69,21 +99,26 @@
import { ref, watchEffect } from 'vue'
import useWallet from '@/composables/wallet'
const message = ref('')
const signedMessage = ref('')
const metamaskButtonText = ref<string>('Connect Metamask')
const metamaskAccountsResult = ref<string>('Address Not Active')
const coinbaseButtonText = ref<string>('Connect Coinbase')
const coinbaseAccountsResult = ref<string>('Address Not Active')
const ioPayButtonText = ref<string>('Connect ioPay')
const ioPayAccountsResult = ref<string>('Address Not Active')
const phantomButtonText = ref<string>('Connect Phantom')
const phantomAccountsResult = ref<string>('Address Not Active')
const {
selectedProvider,
selectedAccount,
toAddress,
amount,
connectWallet,
disconnectWallet,
sendTransaction,
signMessage,
} = useWallet()
watchEffect(() => {
Expand All @@ -94,20 +129,35 @@ watchEffect(() => {
ioPayButtonText.value = 'Connect ioPay'
coinbaseAccountsResult.value = 'Not Active'
ioPayAccountsResult.value = 'Not Active'
phantomButtonText.value = 'Connect Phantom'
phantomAccountsResult.value = 'Not Active'
} else if (selectedProvider.value === 'CoinbaseWallet') {
metamaskButtonText.value = 'Connect Metamask'
coinbaseButtonText.value = 'Coinbase Connected'
ioPayButtonText.value = 'Connect ioPay'
metamaskAccountsResult.value = 'Not Active'
coinbaseAccountsResult.value = selectedAccount.value
ioPayAccountsResult.value = 'Not Active'
phantomButtonText.value = 'Connect Phantom'
phantomAccountsResult.value = 'Not Active'
} else if (selectedProvider.value === 'IoPay') {
metamaskButtonText.value = 'Connect MetaMask'
coinbaseButtonText.value = 'Connect Coinbase'
ioPayButtonText.value = 'Connected'
metamaskAccountsResult.value = 'Not Active'
coinbaseAccountsResult.value = 'Not Active'
ioPayAccountsResult.value = selectedAccount.value || 'Not Active'
phantomButtonText.value = 'Connect Phantom'
phantomAccountsResult.value = 'Not Active'
} else if (selectedProvider.value === 'Phantom') {
metamaskButtonText.value = 'Connect MetaMask'
coinbaseButtonText.value = 'Connect Coinbase'
ioPayButtonText.value = 'Connect ioPay'
phantomButtonText.value = 'Connected'
metamaskAccountsResult.value = 'Not Active'
coinbaseAccountsResult.value = 'Not Active'
ioPayAccountsResult.value = 'Not Active'
phantomAccountsResult.value = selectedAccount.value || 'Not Active'
}
})
</script>
Expand Down Expand Up @@ -155,6 +205,10 @@ button {
background-color: rgb(0, 0, 0);
}
.phantom-btn {
background-color: purple;
}
.connect-wallet-container {
display: flex;
flex-direction: column;
Expand Down
70 changes: 66 additions & 4 deletions apps/web/src/composables/ethers.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,75 @@
import { ref } from 'vue'
import { ethers } from 'ethers'
import { BrowserProviders } from '@/interfaces/BrowserProviders'
import { EthersProvider } from '@/interfaces/EthersProvider'
import { ProviderString } from '@/types/ProviderString'
import { TransactionInit } from '@/interfaces/TransactionInit'
import { MessageInit } from '@/interfaces/MessageInit'

const defaultProviders = {
MetaMask: undefined,
CoinbaseWallet: undefined,
}

const ethereum: any = window.ethereum
const availableProviders = ref<BrowserProviders>(getBrowserProviders(ethereum))

export default function useEthers() {
async function requestEthersAccount(provider: EthersProvider) {
if (provider.request) {
return await provider.request({
const ethersProviderList = ['MetaMask', 'CoinbaseWallet']
async function requestEthersAccount(provider: ProviderString) {
const browserExtensionProvider =
availableProviders.value[provider as keyof BrowserProviders]
if (browserExtensionProvider?.request) {
return await browserExtensionProvider.request({
method: 'eth_requestAccounts',
})
}
}

return { requestEthersAccount }
async function sendEthersTransaction(
{ to, value, providerString }: TransactionInit
) {
const browserProvider =
availableProviders.value[providerString as keyof BrowserProviders]
const web3Provider: ethers.providers.Web3Provider =
new ethers.providers.Web3Provider(browserProvider as EthersProvider)
const signer = web3Provider.getSigner()
const etherAmount = ethers.utils.parseEther(value)
const tx = {
to,
value: etherAmount,
}
const { hash } = await signer.sendTransaction(tx)
return hash
}

async function signEthersMessage(messageInit: MessageInit): Promise<string> {
const { providerString, hashedMessage } = messageInit
const browserProvider =
availableProviders.value[
providerString as keyof BrowserProviders
]
const web3Provider: ethers.providers.Web3Provider =
new ethers.providers.Web3Provider(browserProvider as EthersProvider)
const signer = web3Provider.getSigner()
const signature = await signer.signMessage(hashedMessage)
return signature
}

return { ethersProviderList, requestEthersAccount, getBrowserProviders, sendEthersTransaction, signEthersMessage }
}

function getBrowserProviders(ethereum: any) {
if (!ethereum) return defaultProviders
else if (!ethereum.providerMap) {
return {
MetaMask: ethereum.isMetaMask ? ethereum : undefined,
CoinbaseWallet: ethereum.isCoinbaseWallet ? ethereum : undefined,
}
} else {
return {
MetaMask: ethereum.providerMap.get('MetaMask'),
CoinbaseWallet: ethereum.providerMap.get('CoinbaseWallet'),
}
}
}
18 changes: 13 additions & 5 deletions apps/web/src/composables/iopay.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import Antenna from 'iotex-antenna'
import { WsSignerPlugin } from 'iotex-antenna/lib/plugin/ws'
import { toRau } from 'iotex-antenna/lib/account/utils'
import { TransactionInit } from '@/interfaces/TransactionInit'
import { MessageInit } from '@/interfaces/MessageInit'

export default function useIoPay() {
const signer = new WsSignerPlugin()
Expand All @@ -12,22 +14,27 @@ export default function useIoPay() {
return await signer.getAccounts()
}

const sendIoPayTransaction = async (toAddress: string, amount: string) => {
const sendIoPayTransaction = async ({ to, value }: TransactionInit) => {
try {
const transResp = await antenna?.iotx.sendTransfer({
to: `${toAddress}`,
to: `${to}`,
from: antenna.iotx.accounts[0].address,
value: toRau(amount, 'Iotx'),
value: toRau(value, 'Iotx'),
gasLimit: '100000',
gasPrice: toRau('1', 'Qev')
gasPrice: toRau('1', 'Qev'),
})
console.log('transResp :>> ', transResp)
return transResp
} catch (err) {
// TODO: handle submit error and guide user
console.log(err)
}
}

const signIoPayMessage = async (messageInit: MessageInit): Promise<Buffer> => {
const { hashedMessage } = messageInit
return await signer.signMessage(hashedMessage)
}

// const stakeIoPay = async () => {
// // TODO: Replace with appropriate abi, etc.
// const transResp = await antenna?.iotx.executeContract(
Expand All @@ -49,6 +56,7 @@ export default function useIoPay() {
return {
getIoPayAccounts,
sendIoPayTransaction,
signIoPayMessage,
// stakeIoPay,
}
}
Loading