Skip to content

Commit eb96679

Browse files
authored
Merge pull request #214 from Lamden/lamden_vault_update
Lamden vault update
2 parents 7bf2c17 + 53e57ab commit eb96679

File tree

152 files changed

+15229
-7205
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

152 files changed

+15229
-7205
lines changed

README.md

-9
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,6 @@ npm run dev
103103
"name": "IdeMain" // do not edit
104104
}
105105
},
106-
{
107-
"id": "token-swap", // do not edit
108-
"show": true,
109-
"logo": "swap", // do not edit
110-
"name": "Token Swap",
111-
"page": {
112-
"name": "Swaps" // do not edit
113-
}
114-
},
115106
{
116107
"id": "devtools", // do not edit
117108
"show": true,

package-lock.json

+9,924-131
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+22-18
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,40 @@
11
{
22
"name": "lamden-wallet",
3-
"version": "1.9.7",
3+
"version": "2.0.0",
44
"description": "A secure wallet for making transactions on the Lamden blockchain.",
55
"author": "Jeff Scott <[email protected]>",
66
"license": "",
77
"scripts": {
88
"build": "node utils/build.js",
9-
"tests": "npm run build && mocha --recursive --timeout 30000 selenium/tests/",
10-
"test-firstrun": "mocha --recursive --timeout 30000 selenium/tests/ui/firstrun/*.js",
11-
"test-firstrun-new": "mocha --recursive --timeout 30000 selenium/tests/ui/firstrun/FirstRun_CreateWallet.js",
12-
"test-firstrun-restore": "mocha --recursive --timeout 30000 selenium/tests/ui/firstrun/FirstRun_RestoreWallet.js",
13-
"test-dapps": "mocha --recursive --timeout 30000 selenium/tests/dapp/*.js",
14-
"test-dapps-wallet-connect": "mocha --timeout 30000 selenium/tests/dapp/content_lamdenWalletConnect.js",
15-
"test-dapps-get-info": "mocha --timeout 30000 selenium/tests/dapp/content_lamdenWalletGetInfo.js",
16-
"test-dapps-sendtx": "mocha --timeout 30000 selenium/tests/dapp/content_lamdenWalletSendTx.js",
9+
"tests": "npm run build && mocha --recursive --retries 3 --timeout 60000 selenium/tests/",
10+
"test-firstrun": "mocha --recursive --timeout 60000 selenium/tests/ui/firstrun/*.js",
11+
"test-firstrun-new": "mocha --recursive --timeout 60000 selenium/tests/ui/firstrun/FirstRun_CreateWallet.js",
12+
"test-firstrun-restore": "mocha --recursive --timeout 60000 selenium/tests/ui/firstrun/FirstRun_RestoreWallet*.js",
13+
"test-firstrun-restore-keystroe": "mocha --recursive --timeout 60000 selenium/tests/ui/firstrun/FirstRun_RestoreWalletByKetstore.js",
14+
"test-firstrun-restore-mnemonic": "mocha --recursive --timeout 60000 selenium/tests/ui/firstrun/FirstRun_RestoreWalletByMnemonic.js",
15+
"test-firstrun-restore-privatekey": "mocha --recursive --timeout 60000 selenium/tests/ui/firstrun/FirstRun_RestoreWalletByPrivatekey.js",
16+
"test-dapps": "mocha --recursive --timeout 60000 selenium/tests/dapp/*.js",
17+
"test-dapps-wallet-connect": "mocha --timeout 60000 selenium/tests/dapp/content_lamdenWalletConnect.js",
18+
"test-dapps-get-info": "mocha --timeout 60000 selenium/tests/dapp/content_lamdenWalletGetInfo.js",
19+
"test-dapps-sendtx": "mocha --timeout 60000 selenium/tests/dapp/content_lamdenWalletSendTx.js",
1720
"test-tokens": "mocha --recursive --timeout 50000 selenium/tests/ui/tokens/*.js",
1821
"test-tokens-add": "mocha --timeout 50000 selenium/tests/ui/tokens/tokens-add.js",
19-
"test-tokens-upload": "mocha --timeout 30000 selenium/tests/ui/tokens/tokens-upload-images.js",
20-
"test-tokens-edit": "mocha --timeout 30000 selenium/tests/ui/tokens/tokens-edit.js",
21-
"test-tokens-transactions": "mocha --timeout 30000 selenium/tests/ui/tokens/tokens-transactions.js",
22-
"test-coin": "mocha --timeout 30000 selenium/tests/ui/coin/*.js",
23-
"test-coin-btn": "mocha --timeout 30000 selenium/tests/ui/coin/coin-btn.js",
24-
"test-coin-backup-notification": "mocha --timeout 30000 selenium/tests/ui/coin/coin-backup-notification.js",
25-
"test-coin-changepassword": "mocha --timeout 30000 selenium/tests/ui/coin/coin-changepassword.js",
22+
"test-tokens-upload": "mocha --timeout 60000 selenium/tests/ui/tokens/tokens-upload-images.js",
23+
"test-tokens-edit": "mocha --timeout 60000 selenium/tests/ui/tokens/tokens-edit.js",
24+
"test-tokens-transactions": "mocha --timeout 60000 selenium/tests/ui/tokens/tokens-transactions.js",
25+
"test-coin": "mocha --timeout 60000 selenium/tests/ui/coin/*.js",
26+
"test-coin-btn": "mocha --timeout 60000 selenium/tests/ui/coin/coin-btn.js",
27+
"test-coin-backup-notification": "mocha --timeout 60000 selenium/tests/ui/coin/coin-backup-notification.js",
28+
"test-coin-changepassword": "mocha --timeout 60000 selenium/tests/ui/coin/coin-changepassword.js",
29+
"test-misc": "mocha --timeout 60000 selenium/tests/ui/misc/*.js",
2630
"dev": "node utils/webserver.js"
2731
},
2832
"repository": {
2933
"type": "git",
3034
"url": "https://github.com/Lamden/wallet.git"
3135
},
3236
"devDependencies": {
33-
"chromedriver": "^94.0.0",
37+
"chromedriver": "^97.0.2",
3438
"clean-webpack-plugin": "^1.0.0",
3539
"copy-webpack-plugin": "^5.1.1",
3640
"css-loader": "2.1.0",
@@ -51,7 +55,7 @@
5155
"dependencies": {
5256
"easyqrcodejs": "^4.4.6",
5357
"faunadb": "^4.4.1",
54-
"lamden-js": "^1.6.1",
58+
"lamden-js": "^3.5.8",
5559
"monaco-editor": "^0.19.0",
5660
"monaco-editor-webpack-plugin": "^1.8.1",
5761
"node-cryptojs-aes": "^0.4.0",

selenium/config/config.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ This test will use the local install of the metamask plugin from your chrome ins
88
Once installed validate that your chome installation has installed the metamask pluging into the directory specified in the "getMetaMaskLocation" function
99
Then validate metamask version's folder is correct as per the config item below
1010
11-
Seed Phrase:
12-
The seed phrase will restore wallet which will be used to swap test dTAU from.
11+
Recovery Phrase:
12+
The Recovery Phrase will restore wallet which will be used to swap test dTAU from.
1313
1414
This ETH wallet 0x00eB12f5C96B15001bf8f32bEEd970d178719AcC needs to be funded with KOVAN dTAU before testing is run (the test swaps 10 dTAU).
1515

selenium/fixtures/existingTokenInfo.json

+4-4
Large diffs are not rendered by default.

selenium/fixtures/mnemonic.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"mnemonic": "voice hold limit pact other slide satoshi wonder hobby rain trend crop foster warfare tonight brief joy cluster ecology august ocean novel artist fruit",
3+
"vk": "37d05a43874dd70f56a03625df1680a358b4728510228d5e5f280de51554a12b"
4+
}

selenium/fixtures/privatekey.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"sk": "cc75de468b91f45ec985cf47c87a9e6f22ec1477b15ec8174dc508da3ef92c1c",
3+
"vk": "37d05a43874dd70f56a03625df1680a358b4728510228d5e5f280de51554a12b"
4+
}

selenium/helpers/helpers-token.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const path = require('path')
77
const placeholder_base64 = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiPjxjaXJjbGUgc3Ryb2tlPSJub25lIiBmaWxsPSIjOGU3Yjk4IiByPSI0OCUiIGN4PSI1MCUiIGN5PSI1MCUiPjwvY2lyY2xlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUwIDUwKSBzY2FsZSgwLjY5IDAuNjkpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoLTUwIC01MCkiIHN0eWxlPSJmaWxsOiNmZmZmZmYiPjxzdmcgZmlsbD0iI2ZmZmZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgdmVyc2lvbj0iMS4xIiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjt0ZXh0LXJlbmRlcmluZzpnZW9tZXRyaWNQcmVjaXNpb247aW1hZ2UtcmVuZGVyaW5nOm9wdGltaXplUXVhbGl0eTsiIHZpZXdCb3g9IjAgMCA1OCA4OCIgeD0iMHB4IiB5PSIwcHgiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIj48ZGVmcz48c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAKICAgIC5maWwwIHtmaWxsOiNmZmZmZmZ9CiAgIAogIDwvc3R5bGU+PC9kZWZzPjxnPjxwYXRoIGNsYXNzPSJmaWwwIiBkPSJNMCAyNGMwLC0zMSA1OCwtMzMgNTgsLTEgMCwxOSAtMTksMTggLTIzLDM2IC0yLDkgLTE0LDggLTE0LC0yIDAsLTE3IDE0LC0xOCAyMCwtMjkgNCwtOCAtMywtMTYgLTExLC0xNiAtMTcsMCAtMTEsMTkgLTIyLDE5IC00LDAgLTgsLTMgLTgsLTd6bTI4IDY0Yy0xMiwwIC0xMSwtMTggMCwtMTggMTIsMCAxMiwxOCAwLDE4eiI+PC9wYXRoPjwvZz48L3N2Zz48L2c+PC9zdmc+"
88

99
const openAddAccountsAndTokens = async (driver) => {
10-
await helpers.sleep(1000);
10+
await helpers.sleep(2000);
1111
await driver.findElement(By.id('accounts')).click();
1212
await driver.findElement(By.id('add-btn')).click();
1313
}
@@ -46,14 +46,16 @@ const addToken_Save = async (driver, token) => {
4646
assert.equal(message, `${token.tokenName} added successfully`);
4747
await driver.findElement(By.id("home-btn")).click()
4848
await helpers.sleep(500, true)
49-
await helpers.ignoreBackupModal(driver)
50-
await validateTokenOnAccountsScreen(driver, token)
49+
//await helpers.ignoreBackupModal(driver)
50+
//await validateTokenOnAccountsScreen(driver, token)
5151
}
5252

5353
const validateTokenOnAccountsScreen = async (driver, token) => {
5454
await helpers.gotoAccountsPage(driver)
55-
await driver.wait(until.elementLocated(By.id(`token-row-${token.tokenSymbol}-${token.tokenName.replace(" ", "")}`)), 5000);
55+
await driver.findElement(By.className("collapse-btn")).click()
56+
await driver.wait(until.elementLocated(By.id(`token-row-${token.tokenSymbol}-${token.tokenName.replace(" ", "")}`)), 15000);
5657
await validateTokenLogo(driver, token)
58+
await driver.findElement(By.className("collapse-btn")).click()
5759
}
5860

5961
const validateTokenNotOnAccountsScreen = async (driver, token)=> {
@@ -178,6 +180,9 @@ const saveTokenModal = async (driver, token) => {
178180
}
179181

180182
const gotoTokenDetails = async (driver, token) => {
183+
let element = driver.findElement(By.className('collapse-btn'))
184+
await driver.executeScript("arguments[0].click();", element)
185+
await helpers.sleep(500);
181186
await driver.findElement(By.xpath(`//div[contains(text(),'${token.tokenName}')]`)).click()
182187
}
183188

@@ -215,10 +220,14 @@ const openAccountsScreen = async (driver) => {
215220
}
216221

217222
const openCoinReceiveModal = async (driver) => {
223+
await driver.findElement(By.className("collapse-btn")).click()
224+
await helpers.sleep(2000)
218225
await driver.findElement(By.id('receive-btn')).click();
219226
}
220227

221228
const openCoinSendModal = async (driver) => {
229+
await driver.findElement(By.className("collapse-btn")).click()
230+
await helpers.sleep(1000)
222231
await driver.findElement(By.id('send-btn')).click();
223232
}
224233

selenium/helpers/helpers.js

+103-17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const http = require('http')
77
const https = require('https')
88
const assert = require('assert');
99
const { CryptoJS } = nodeCryptoJs;
10+
const mnemonicWords = require("../fixtures/mnemonic.json")
1011

1112
const { testnetMasternode, testnetBlockService } = config;
1213

@@ -34,7 +35,8 @@ const switchWindow = async (driver, windowNum) => {
3435

3536
const gotoAccountsPage = async (driver) => {
3637
await sleep(1000, true)
37-
await driver.findElement(By.id('accounts')).click();
38+
let element = driver.findElement(By.id('accounts'))
39+
await driver.executeScript("arguments[0].click();", element)
3840
}
3941

4042
const completeFirstRunSetup = async (driver, walletPassword, lock = true, testnet = true) => {
@@ -43,9 +45,39 @@ const completeFirstRunSetup = async (driver, walletPassword, lock = true, testne
4345
await driver.executeScript(`document.getElementById('pwd1').value='${walletPassword}'`);
4446
await driver.executeScript(`document.getElementById('pwd2').value='${walletPassword}'`);
4547
await driver.findElement(By.id('save-pwd')).click()
48+
await sleep(2000)
49+
50+
let elements = await driver.findElements(By.css('.mnemonic .cell input'))
51+
52+
let vals;
53+
let words = [];
54+
elements.forEach(element => {
55+
let value = element.getAttribute("value");
56+
words.push(value);
57+
});
58+
await Promise.all(words).then((res)=>{
59+
vals = res;;
60+
})
61+
await driver.findElement(By.css('.chk-checkmark')).click();
62+
await driver.findElement(By.id('next')).click();
63+
await sleep(3000);
64+
65+
elements = await driver.findElements(By.css('.mnemonic .cell input'));
66+
for(let i=0; i<24; i++){
67+
try {
68+
await elements[i].sendKeys(`${vals[i]}\n`);
69+
} catch {
70+
// tbd
71+
}
72+
}
73+
await driver.findElement(By.id('next')).click();
74+
await sleep(2000)
75+
76+
await driver.findElement(By.css('.chk-checkmark')).click();
4677
await driver.findElement(By.id('i-understand')).click()
47-
await sleep(5000)
48-
await ignoreBackupModal(driver)
78+
await sleep(3000)
79+
80+
// await ignoreBackupModal(driver)
4981
if (testnet) await changeToTestnet(driver)
5082
await driver.findElement(By.id('refresh-icon')).click()
5183
await sleep(3000, true)
@@ -55,8 +87,8 @@ const completeFirstRunSetup = async (driver, walletPassword, lock = true, testne
5587
}
5688

5789
const ignoreBackupModal = async (driver) => {
58-
await validBackupModal(driver)
59-
await driver.findElement(By.id('ignore-btn')).click();
90+
// await validBackupModal(driver)
91+
await driver.wait(until.elementLocated(By.id(`ignore-btn`)), 25000).click();
6092
await sleep(1000, true)
6193
}
6294

@@ -66,24 +98,30 @@ const completeFirstRunSetupRestore = async (driver, workingDir, walletInfo, lock
6698
await driver.executeScript(`document.getElementById('pwd1').value='${walletInfo.walletPassword}'`);
6799
await driver.executeScript(`document.getElementById('pwd2').value='${walletInfo.walletPassword}'`);
68100
await driver.findElement(By.id('save-pwd')).click()
69-
await driver.findElement(By.id('filePicker')).sendKeys(path.join(workingDir, walletInfo.keystoreInfo.file))
70-
await driver.findElement(By.id('confirm-keystore-btn')).click()
71101
await sleep(2000)
72-
await driver.executeScript(`document.getElementById('pwd-input').value='${walletInfo.keystoreInfo.password}'`)
73-
await driver.findElement(By.id('pwd-btn')).click()
102+
103+
let words = mnemonicWords.mnemonic.split(' ');
104+
let elements = await driver.findElements(By.css('.mnemonic .cell input'));
105+
for(let i=0; i<24; i++){
106+
await elements[i].sendKeys(`${words[i]}\n`);
107+
}
108+
await driver.findElement(By.id('next')).click();
109+
await sleep(2000)
110+
74111
await driver.executeScript(`document.getElementById('chk-all').innerText='testing'`)
75112
await driver.findElement(By.id('chk-all')).click()
76113
await driver.findElement(By.id('restore-btn')).click()
77114
await sleep(2000)
78115
await driver.findElement(By.id('home-btn')).click()
79-
await sleep(4000)
116+
await sleep(3000)
117+
// await driver.findElement(By.id('ignore-btn')).click()
80118
await ignoreBackupModal(driver)
81119
if (testnet) {
82120
await changeToTestnet(driver)
83121
await sleep(2000)
84122
}
85123
await driver.findElement(By.id('refresh-icon')).click()
86-
await sleep(6000, true)
124+
await sleep(3000, true)
87125
if (lock){
88126
await driver.findElement(By.id('lock')).click()
89127
}
@@ -107,7 +145,8 @@ const lockWallet = async (driver, switchback) => {
107145
await sleep(1000, true)
108146
}
109147
const changeToTestnet = async (driver) => {
110-
let navNetwork = await driver.wait(until.elementLocated(By.id("nav-network-info")), 5000);
148+
await driver.wait(until.elementLocated(By.id('nav-network-currently-selected')), 5000).click();
149+
let navNetwork = await driver.wait(until.elementLocated(By.id("select-option-1")), 5000);
111150
navNetwork.click()
112151
await sleep(2000, true)
113152
}
@@ -116,7 +155,7 @@ const setAsTrustedDapp = async (driver) => {
116155
await sleep(500, true)
117156
await driver.findElement(By.id("dapp-connections")).click()
118157
await driver.wait(until.elementLocated(By.id("dapp-appname-0")), 5000).click()
119-
await sleep(500, true)
158+
await sleep(1000, true)
120159
await driver.findElement(By.id("modify-dapp-btn")).click()
121160
await sleep(500, true)
122161
await driver.findElement(By.id("preapproval-btn")).click()
@@ -154,6 +193,7 @@ const approvePopup = async (driver, popupWindow, switchback, trusted = true) =>
154193
await accountLink_Button.click()
155194

156195
if (!trusted){
196+
await sleep(1000)
157197
let trusted_Radio = await driver.wait(until.elementLocated(By.id("not-trusted")), 5000);
158198
await trusted_Radio.click()
159199
}
@@ -346,7 +386,7 @@ const setupMetamask = async (driver, kovan = true) => {
346386
await driver.findElement(By.xpath("//button[contains(text(),'No Thanks')]")).click()
347387
await sleep(1000)
348388

349-
await driver.findElement(By.xpath("//input[@placeholder='Paste seed phrase from clipboard']")).sendKeys(config.metamaskBackupPhrase)
389+
await driver.findElement(By.xpath("//input[@placeholder='Paste Recovery Phrase from clipboard']")).sendKeys(config.metamaskBackupPhrase)
350390
await driver.findElement(By.id("password")).sendKeys(config.metamaskPassword)
351391
await driver.findElement(By.id("confirm-password")).sendKeys(config.metamaskPassword)
352392
await driver.findElement(By.className("first-time-flow__terms")).click()
@@ -387,7 +427,7 @@ const addAccount = async (driver) => {
387427
await driver.findElement(By.css('.submit-button')).click();
388428
let messageField = await driver.wait(until.elementLocated(By.id(`message-text`)), 25000);
389429
let message = await messageField.getAttribute("innerText")
390-
assert.equal(message, `Added New Lamden Account to your wallet`);
430+
assert.equal(message, `Added New Tau Account to your Lamden Vault`);
391431
await driver.findElement(By.id("home-btn")).click()
392432
await sleep(500, true)
393433
await ignoreBackupModal(driver)
@@ -401,7 +441,7 @@ const addTrackedAccount = async (driver, address) => {
401441
await driver.findElement(By.css('.submit-button')).click();
402442
let messageField = await driver.wait(until.elementLocated(By.id(`message-text`)), 25000);
403443
let message = await messageField.getAttribute("innerText")
404-
assert.equal(message, `Added New Lamden Account to your wallet`);
444+
assert.equal(message, `Added New Tau Account to your Lamden Vault`);
405445
await driver.findElement(By.id("home-btn")).click()
406446
await sleep(500, true)
407447
let emts = await driver.findElements(By.className("notification"))
@@ -419,6 +459,49 @@ const changePassword = async (driver, oldpd, newpd, confirmpd) => {
419459
await driver.findElement(By.id("change-pw-btn")).click();
420460
}
421461

462+
const gotoNetwork = async (driver) => {
463+
await sleep(500)
464+
await driver.findElement(By.id("settings")).click();
465+
await driver.findElement(By.id("networks-btn")).click();
466+
await sleep(500)
467+
}
468+
469+
const clearNetwork = async (driver) => {
470+
await driver.findElement(By.id("name")).clear();
471+
await driver.findElement(By.id("currencySymbol")).clear();
472+
await driver.findElements(By.css("#mainbox-hostlist>div>.text-btn")).then(res => {
473+
res.forEach(async item => {
474+
await driver.executeScript(`arguments[0].style.display = 'inline-block'`, item)
475+
await item.click()
476+
});
477+
})
478+
await driver.findElements(By.css("#mainbox-blockServiceList>div>.text-btn")).then(res => {
479+
480+
res.forEach(async item => {
481+
await driver.executeScript(`arguments[0].style.display = 'inline-block'`, item)
482+
await item.click()
483+
});
484+
})
485+
await driver.findElement(By.id("explorer")).clear();
486+
}
487+
488+
const fillNetworkForm = async (driver, networkinfo) => {
489+
await driver.findElement(By.id("name")).sendKeys(networkinfo.name);
490+
await driver.findElement(By.id("currencySymbol")).sendKeys(networkinfo.currencySymbol);
491+
492+
let hostinput = await driver.findElement(By.id("hostlist"))
493+
await hostinput.sendKeys(networkinfo.host)
494+
await driver.findElement(By.css("#hostlist + .add-btn")).click()
495+
496+
let blockserviceInput = await driver.findElement(By.id("blockServiceList"))
497+
await blockserviceInput.sendKeys(networkinfo.blockservice)
498+
await driver.findElement(By.css("#blockServiceList + .add-btn")).click()
499+
500+
if (networkinfo.explorer) {
501+
await driver.findElement(By.id("explorer")).sendKeys(networkinfo.explorer);
502+
}
503+
}
504+
422505
module.exports = {
423506
changePassword,
424507
sleep,
@@ -440,5 +523,8 @@ module.exports = {
440523
ignoreBackupModal,
441524
validBackupModal,
442525
addAccount,
443-
addTrackedAccount
526+
addTrackedAccount,
527+
gotoNetwork,
528+
clearNetwork,
529+
fillNetworkForm
444530
}

0 commit comments

Comments
 (0)