feat(wallet) integrate Wallet Connect sign APIs

Bump status-go that brings the sign APIs support for send transaction
and personal sign

Extend SDK

- simple SDK event handling in QML
- support session request response APIs
- pairing management

Closes #12637
This commit is contained in:
Stefan 2023-11-06 21:05:18 +02:00 committed by Stefan Dunca
parent 9743fb2537
commit 783a755230
17 changed files with 3229 additions and 311 deletions

632
package-lock.json generated
View File

@ -7,6 +7,9 @@
"": { "": {
"name": "nim-status-client", "name": "nim-status-client",
"version": "0.0.0", "version": "0.0.0",
"dependencies": {
"nodemon": "3.0.1"
},
"devDependencies": { "devDependencies": {
"create-dmg": "status-im/create-dmg#678fbd4", "create-dmg": "status-im/create-dmg#678fbd4",
"fileicon": "0.3.0" "fileicon": "0.3.0"
@ -16,6 +19,11 @@
"npm": ">=7" "npm": ">=7"
} }
}, },
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"node_modules/ansi-regex": { "node_modules/ansi-regex": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@ -40,6 +48,18 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1" "url": "https://github.com/chalk/ansi-styles?sponsor=1"
} }
}, },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/appdmg": { "node_modules/appdmg": {
"version": "0.6.4", "version": "0.6.4",
"resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.4.tgz", "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.4.tgz",
@ -104,6 +124,11 @@
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true "dev": true
}, },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/base32-encode": { "node_modules/base32-encode": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz",
@ -133,6 +158,14 @@
} }
] ]
}, },
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"engines": {
"node": ">=8"
}
},
"node_modules/bplist-creator": { "node_modules/bplist-creator": {
"version": "0.0.8", "version": "0.0.8",
"resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz",
@ -142,6 +175,26 @@
"stream-buffers": "~2.2.0" "stream-buffers": "~2.2.0"
} }
}, },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/camelcase": { "node_modules/camelcase": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
@ -178,6 +231,32 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/cli-cursor": { "node_modules/cli-cursor": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@ -229,6 +308,11 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true "dev": true
}, },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"node_modules/create-dmg": { "node_modules/create-dmg": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "git+ssh://git@github.com/status-im/create-dmg.git#678fbd411585c87a92a74b4314190b85037b66eb", "resolved": "git+ssh://git@github.com/status-im/create-dmg.git#678fbd411585c87a92a74b4314190b85037b66eb",
@ -295,7 +379,6 @@
"version": "3.2.7", "version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"dependencies": { "dependencies": {
"ms": "^2.1.1" "ms": "^2.1.1"
} }
@ -414,6 +497,17 @@
"fileicon": "bin/fileicon" "fileicon": "bin/fileicon"
} }
}, },
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/find-up": { "node_modules/find-up": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
@ -457,6 +551,19 @@
"node": ">=8.6.0" "node": ">=8.6.0"
} }
}, },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": { "node_modules/function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@ -493,6 +600,17 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/gm": { "node_modules/gm": {
"version": "1.23.1", "version": "1.23.1",
"resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz", "resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz",
@ -560,6 +678,11 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
},
"node_modules/image-size": { "node_modules/image-size": {
"version": "0.7.5", "version": "0.7.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz",
@ -596,6 +719,17 @@
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true "dev": true
}, },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-core-module": { "node_modules/is-core-module": {
"version": "2.8.1", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
@ -608,6 +742,25 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-interactive": { "node_modules/is-interactive": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@ -636,6 +789,14 @@
"xtend": "^4.0.0" "xtend": "^4.0.0"
} }
}, },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-plain-obj": { "node_modules/is-plain-obj": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@ -866,6 +1027,17 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/minimist": { "node_modules/minimist": {
"version": "1.2.6", "version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
@ -888,8 +1060,7 @@
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
"dev": true
}, },
"node_modules/murmur-32": { "node_modules/murmur-32": {
"version": "0.2.0", "version": "0.2.0",
@ -920,6 +1091,96 @@
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true "dev": true
}, },
"node_modules/nodemon": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
"integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^3.2.7",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2",
"pstree.remy": "^1.1.8",
"semver": "^7.5.3",
"simple-update-notifier": "^2.0.0",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
},
"bin": {
"nodemon": "bin/nodemon.js"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/nodemon"
}
},
"node_modules/nodemon/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"engines": {
"node": ">=4"
}
},
"node_modules/nodemon/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/nodemon/node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/nodemon/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/nodemon/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"dependencies": {
"abbrev": "1"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
"node": "*"
}
},
"node_modules/normalize-package-data": { "node_modules/normalize-package-data": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@ -932,6 +1193,14 @@
"validate-npm-package-license": "^3.0.1" "validate-npm-package-license": "^3.0.1"
} }
}, },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm-run-path": { "node_modules/npm-run-path": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -1096,6 +1365,17 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pify": { "node_modules/pify": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
@ -1124,6 +1404,11 @@
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true "dev": true
}, },
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
},
"node_modules/pump": { "node_modules/pump": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@ -1180,6 +1465,17 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/redent": { "node_modules/redent": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
@ -1268,6 +1564,47 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true "dev": true
}, },
"node_modules/simple-update-notifier": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
"integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dependencies": {
"semver": "^7.5.3"
},
"engines": {
"node": ">=10"
}
},
"node_modules/simple-update-notifier/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/simple-update-notifier/node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/simple-update-notifier/node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/spdx-correct": { "node_modules/spdx-correct": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@ -1413,6 +1750,28 @@
"integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==",
"dev": true "dev": true
}, },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
"integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"dependencies": {
"nopt": "~1.0.10"
},
"bin": {
"nodetouch": "bin/nodetouch.js"
}
},
"node_modules/trim-newlines": { "node_modules/trim-newlines": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
@ -1431,6 +1790,11 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
},
"node_modules/unique-string": { "node_modules/unique-string": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
@ -1524,6 +1888,11 @@
} }
}, },
"dependencies": { "dependencies": {
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"ansi-regex": { "ansi-regex": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@ -1539,6 +1908,15 @@
"color-convert": "^2.0.1" "color-convert": "^2.0.1"
} }
}, },
"anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"appdmg": { "appdmg": {
"version": "0.6.4", "version": "0.6.4",
"resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.4.tgz", "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.4.tgz",
@ -1588,6 +1966,11 @@
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true "dev": true
}, },
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"base32-encode": { "base32-encode": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz",
@ -1603,6 +1986,11 @@
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true "dev": true
}, },
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
},
"bplist-creator": { "bplist-creator": {
"version": "0.0.8", "version": "0.0.8",
"resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz",
@ -1612,6 +2000,23 @@
"stream-buffers": "~2.2.0" "stream-buffers": "~2.2.0"
} }
}, },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"requires": {
"fill-range": "^7.0.1"
}
},
"camelcase": { "camelcase": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
@ -1639,6 +2044,21 @@
"supports-color": "^7.1.0" "supports-color": "^7.1.0"
} }
}, },
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
}
},
"cli-cursor": { "cli-cursor": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@ -1675,6 +2095,11 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true "dev": true
}, },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"create-dmg": { "create-dmg": {
"version": "git+ssh://git@github.com/status-im/create-dmg.git#678fbd411585c87a92a74b4314190b85037b66eb", "version": "git+ssh://git@github.com/status-im/create-dmg.git#678fbd411585c87a92a74b4314190b85037b66eb",
"dev": true, "dev": true,
@ -1722,7 +2147,6 @@
"version": "3.2.7", "version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
"requires": { "requires": {
"ms": "^2.1.1" "ms": "^2.1.1"
} }
@ -1822,6 +2246,14 @@
"integrity": "sha512-sIDuHQjKkM9UA5szqdCqcMbIfImg7jRVb83+0mWESRl6x3DTRxuAwYCUxXNhAJ2NdvALSxh9xlgARWBNRt8NMw==", "integrity": "sha512-sIDuHQjKkM9UA5szqdCqcMbIfImg7jRVb83+0mWESRl6x3DTRxuAwYCUxXNhAJ2NdvALSxh9xlgARWBNRt8NMw==",
"dev": true "dev": true
}, },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"requires": {
"to-regex-range": "^5.0.1"
}
},
"find-up": { "find-up": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
@ -1855,6 +2287,12 @@
"integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==", "integrity": "sha512-UVqkrEW0GfDabw4C3HOrFlxKfx0eeigfRne69FxSBdHIP8Qt5Sq6Pu3RM9KmMlkygtC4pPKkj5CiPO5USnj2GA==",
"dev": true "dev": true
}, },
"fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"optional": true
},
"function-bind": { "function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@ -1888,6 +2326,14 @@
"pump": "^3.0.0" "pump": "^3.0.0"
} }
}, },
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"requires": {
"is-glob": "^4.0.1"
}
},
"gm": { "gm": {
"version": "1.23.1", "version": "1.23.1",
"resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz", "resolved": "https://registry.npmjs.org/gm/-/gm-1.23.1.tgz",
@ -1945,6 +2391,11 @@
"integrity": "sha512-J7+RDRQApG/vChY5TP043NitBcNC7QMn1kOgGvlAkyrK65hozAaSwTNsTZ2HJh+br9e1NlzpBreAOpk4YuhOJA==", "integrity": "sha512-J7+RDRQApG/vChY5TP043NitBcNC7QMn1kOgGvlAkyrK65hozAaSwTNsTZ2HJh+br9e1NlzpBreAOpk4YuhOJA==",
"dev": true "dev": true
}, },
"ignore-by-default": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
},
"image-size": { "image-size": {
"version": "0.7.5", "version": "0.7.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz",
@ -1969,6 +2420,14 @@
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true "dev": true
}, },
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-core-module": { "is-core-module": {
"version": "2.8.1", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
@ -1978,6 +2437,19 @@
"has": "^1.0.3" "has": "^1.0.3"
} }
}, },
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-interactive": { "is-interactive": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@ -2003,6 +2475,11 @@
"xtend": "^4.0.0" "xtend": "^4.0.0"
} }
}, },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"is-plain-obj": { "is-plain-obj": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@ -2188,6 +2665,14 @@
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true "dev": true
}, },
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": { "minimist": {
"version": "1.2.6", "version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
@ -2207,8 +2692,7 @@
"ms": { "ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
"dev": true
}, },
"murmur-32": { "murmur-32": {
"version": "0.2.0", "version": "0.2.0",
@ -2239,6 +2723,67 @@
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true "dev": true
}, },
"nodemon": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
"integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
"requires": {
"chokidar": "^3.5.2",
"debug": "^3.2.7",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2",
"pstree.remy": "^1.1.8",
"semver": "^7.5.3",
"simple-update-notifier": "^2.0.0",
"supports-color": "^5.5.0",
"touch": "^3.1.0",
"undefsafe": "^2.0.5"
},
"dependencies": {
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"requires": {
"yallist": "^4.0.0"
}
},
"semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"requires": {
"lru-cache": "^6.0.0"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"requires": {
"has-flag": "^3.0.0"
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
},
"nopt": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
"integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"requires": {
"abbrev": "1"
}
},
"normalize-package-data": { "normalize-package-data": {
"version": "2.5.0", "version": "2.5.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
@ -2251,6 +2796,11 @@
"validate-npm-package-license": "^3.0.1" "validate-npm-package-license": "^3.0.1"
} }
}, },
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"npm-run-path": { "npm-run-path": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@ -2378,6 +2928,11 @@
"pify": "^3.0.0" "pify": "^3.0.0"
} }
}, },
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
"pify": { "pify": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
@ -2400,6 +2955,11 @@
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true "dev": true
}, },
"pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
},
"pump": { "pump": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
@ -2447,6 +3007,14 @@
"read-pkg": "^3.0.0" "read-pkg": "^3.0.0"
} }
}, },
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"requires": {
"picomatch": "^2.2.1"
}
},
"redent": { "redent": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
@ -2511,6 +3079,37 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true "dev": true
}, },
"simple-update-notifier": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
"integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"requires": {
"semver": "^7.5.3"
},
"dependencies": {
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"requires": {
"yallist": "^4.0.0"
}
},
"semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
"requires": {
"lru-cache": "^6.0.0"
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
},
"spdx-correct": { "spdx-correct": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@ -2623,6 +3222,22 @@
"integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==",
"dev": true "dev": true
}, },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
"is-number": "^7.0.0"
}
},
"touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
"integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"requires": {
"nopt": "~1.0.10"
}
},
"trim-newlines": { "trim-newlines": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
@ -2635,6 +3250,11 @@
"integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
"dev": true "dev": true
}, },
"undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
},
"unique-string": { "unique-string": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",

View File

@ -10,5 +10,8 @@
"engines": { "engines": {
"node": ">=10", "node": ">=10",
"npm": ">=7" "npm": ">=7"
},
"dependencies": {
"nodemon": "3.0.1"
} }
} }

View File

@ -5,6 +5,8 @@ import backend/wallet_connect as backend
import app/core/eventemitter import app/core/eventemitter
import app/core/signals/types import app/core/signals/types
import app_service/common/utils as common_utils
import constants import constants
QtObject: QtObject:
@ -45,6 +47,20 @@ QtObject:
if not ok: if not ok:
error "Failed to pair session" error "Failed to pair session"
proc respondSessionRequest*(self: Controller, sessionRequestJson: string, signedJson: string, error: bool) {.signal.}
proc sessionRequest*(self: Controller, sessionRequestJson: string, password: string) {.slot.} =
let hashedPasssword = common_utils.hashPassword(password)
let ok = backend.sessionRequest(sessionRequestJson, hashedPasssword, proc (res: JsonNode) =
let sessionRequestJson = if res.hasKey("sessionRequest"): $res["sessionRequest"] else: ""
let signedJson = if res.hasKey("signed"): $res["signed"] else: ""
self.respondSessionRequest(sessionRequestJson, signedJson, false)
)
if not ok:
self.respondSessionRequest(sessionRequestJson, "", true)
proc getProjectId*(self: Controller): string {.slot.} = proc getProjectId*(self: Controller): string {.slot.} =
return constants.WALLET_CONNECT_PROJECT_ID return constants.WALLET_CONNECT_PROJECT_ID

View File

@ -1,4 +1,4 @@
import options import options, logging
import json import json
import core, response_type import core, response_type
@ -14,6 +14,10 @@ const ErrorChainsNotSupported*: string = "chains not supported"
rpc(wCPairSessionProposal, "wallet"): rpc(wCPairSessionProposal, "wallet"):
sessionProposalJson: string sessionProposalJson: string
rpc(wCSessionRequest, "wallet"):
sessionRequestJson: string
hashedPassword: string
# TODO #12434: async answer # TODO #12434: async answer
proc pair*(sessionProposalJson: string, callback: proc(response: JsonNode): void): bool = proc pair*(sessionProposalJson: string, callback: proc(response: JsonNode): void): bool =
try: try:
@ -22,5 +26,15 @@ proc pair*(sessionProposalJson: string, callback: proc(response: JsonNode): void
callback(response.result) callback(response.result)
return response.error == nil return response.error == nil
except Exception as e: except Exception as e:
echo "@dd wCPairSessionProposal response: ", e.msg warn e.msg
return false return false
proc sessionRequest*(sessionRequestJson: string, hashedPassword: string, callback: proc(response: JsonNode): void): bool =
try:
let response = wCSessionRequest(sessionRequestJson, hashedPassword)
if response.error == nil and response.result != nil:
callback(response.result)
return response.error == nil
except Exception as e:
warn e.msg
return false

View File

@ -39,7 +39,13 @@ Item {
pairSessionProposal: function(sessionProposalJson) { pairSessionProposal: function(sessionProposalJson) {
proposeUserPair(sessionProposalJson, `{"eip155":{"methods":["eth_sendTransaction","personal_sign"],"chains":["eip155:5"],"events":["accountsChanged","chainChanged"],"accounts":["eip155:5:0x53780d79E83876dAA21beB8AFa87fd64CC29990b","eip155:5:0xBd54A96c0Ae19a220C8E1234f54c940DFAB34639","eip155:5:0x5D7905390b77A937Ae8c444aA8BF7Fa9a6A7DBA0"]}}`) proposeUserPair(sessionProposalJson, `{"eip155":{"methods":["eth_sendTransaction","personal_sign"],"chains":["eip155:5"],"events":["accountsChanged","chainChanged"],"accounts":["eip155:5:0x53780d79E83876dAA21beB8AFa87fd64CC29990b","eip155:5:0xBd54A96c0Ae19a220C8E1234f54c940DFAB34639","eip155:5:0x5D7905390b77A937Ae8c444aA8BF7Fa9a6A7DBA0"]}}`)
} }
projectId: SystemUtils.getEnvVar("STATUS_BUILD_WALLET_CONNECT_PROJECT_ID")
sessionRequest: function(sessionRequestJson, password) {
const signedJson = "0x1234567890"
this.respondSessionRequest(sessionRequestJson, signedJson, respondError.checked)
}
projectId: "87815d72a81d739d2a7ce15c2cfdefb3"
} }
clip: true clip: true
@ -58,6 +64,11 @@ Item {
font.bold: true font.bold: true
} }
} }
CheckBox {
id: respondError
text: "Respond Error"
checked: false
}
// spacer // spacer
ColumnLayout {} ColumnLayout {}
} }

View File

@ -11,5 +11,11 @@ Item {
// function pairSessionProposal(/*string*/ sessionProposalJson) // function pairSessionProposal(/*string*/ sessionProposalJson)
required property var pairSessionProposal required property var pairSessionProposal
signal respondSessionRequest(string sessionRequestJson, string signedJson, bool error)
// function sessionRequest(/*string*/ sessionRequestJson, /*string*/ password)
required property var sessionRequest
required property string projectId required property string projectId
} }

View File

@ -1977,8 +1977,8 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/status-im/doubleratchet v3.0.0+incompatible h1:aJ1ejcSERpSzmWZBgtfYtiU2nF0Q8ZkGyuEPYETXkCY= github.com/status-im/doubleratchet v3.0.0+incompatible h1:aJ1ejcSERpSzmWZBgtfYtiU2nF0Q8ZkGyuEPYETXkCY=
github.com/status-im/doubleratchet v3.0.0+incompatible/go.mod h1:1sqR0+yhiM/bd+wrdX79AOt2csZuJOni0nUDzKNuqOU= github.com/status-im/doubleratchet v3.0.0+incompatible/go.mod h1:1sqR0+yhiM/bd+wrdX79AOt2csZuJOni0nUDzKNuqOU=
github.com/status-im/go-ethereum v1.10.25-status.9 h1:NDuRs5TC4JjqPcYE8/sUtspdA+OwV1JRy3bbRLdIcL0= github.com/status-im/go-ethereum v1.10.25-status.11 h1:casDsgnrkXzyO9SQVyFsT+63XuInyFXzfEHRW/9eEVY=
github.com/status-im/go-ethereum v1.10.25-status.9/go.mod h1:Dt4K5JYMhJRdtXJwBEyGZLZn9iz/chSOZyjVmt5ZhwQ= github.com/status-im/go-ethereum v1.10.25-status.11/go.mod h1:Dt4K5JYMhJRdtXJwBEyGZLZn9iz/chSOZyjVmt5ZhwQ=
github.com/status-im/go-multiaddr-ethv4 v1.2.5 h1:pN+ey6wYKbvNNu5/xq9+VL0N8Yq0pZUTbZp0URg+Yn4= github.com/status-im/go-multiaddr-ethv4 v1.2.5 h1:pN+ey6wYKbvNNu5/xq9+VL0N8Yq0pZUTbZp0URg+Yn4=
github.com/status-im/go-multiaddr-ethv4 v1.2.5/go.mod h1:Fhe/18yWU5QwlAYiOO3Bb1BLe0bn5YobcNBHsjRr4kk= github.com/status-im/go-multiaddr-ethv4 v1.2.5/go.mod h1:Fhe/18yWU5QwlAYiOO3Bb1BLe0bn5YobcNBHsjRr4kk=
github.com/status-im/go-sqlcipher/v4 v4.5.4-status.2 h1:Oi9JTAI2DZEe5UKlpUcvKBCCSn3ULsLIrix7jPnEoPE= github.com/status-im/go-sqlcipher/v4 v4.5.4-status.2 h1:Oi9JTAI2DZEe5UKlpUcvKBCCSn3ULsLIrix7jPnEoPE=
@ -2088,8 +2088,8 @@ github.com/waku-org/go-discover v0.0.0-20221209174356-61c833f34d98 h1:xwY0kW5XZF
github.com/waku-org/go-discover v0.0.0-20221209174356-61c833f34d98/go.mod h1:eBHgM6T4EG0RZzxpxKy+rGz/6Dw2Nd8DWxS0lm9ESDw= github.com/waku-org/go-discover v0.0.0-20221209174356-61c833f34d98/go.mod h1:eBHgM6T4EG0RZzxpxKy+rGz/6Dw2Nd8DWxS0lm9ESDw=
github.com/waku-org/go-libp2p-rendezvous v0.0.0-20230628220917-7b4e5ae4c0e7 h1:0e1h+p84yBp0IN7AqgbZlV7lgFBjm214lgSOE7CeJmE= github.com/waku-org/go-libp2p-rendezvous v0.0.0-20230628220917-7b4e5ae4c0e7 h1:0e1h+p84yBp0IN7AqgbZlV7lgFBjm214lgSOE7CeJmE=
github.com/waku-org/go-libp2p-rendezvous v0.0.0-20230628220917-7b4e5ae4c0e7/go.mod h1:pFvOZ9YTFsW0o5zJW7a0B5tr1owAijRWJctXJ2toL04= github.com/waku-org/go-libp2p-rendezvous v0.0.0-20230628220917-7b4e5ae4c0e7/go.mod h1:pFvOZ9YTFsW0o5zJW7a0B5tr1owAijRWJctXJ2toL04=
github.com/waku-org/go-waku v0.8.1-0.20230930175749-dcc828749f67 h1:EL0KljfCIFPXbY1IfT0JjVIjJekuF951ys1WL2WnWyM= github.com/waku-org/go-waku v0.8.1-0.20231103161423-351dd55a1498 h1:2Y06Ni3tBj2LQA0ys1o1PspZxZPM9GOKwNEGolbueQ4=
github.com/waku-org/go-waku v0.8.1-0.20230930175749-dcc828749f67/go.mod h1:MnMLFtym7XUt+GNN4zTkjm5NJCsm7TERLWVPOV/Ct6w= github.com/waku-org/go-waku v0.8.1-0.20231103161423-351dd55a1498/go.mod h1:hem2hnXK5BdabxwJULszM0Rh1Yj+gD9IxjwLCGPPaxs=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20230916173259-d284a3d8f2fd h1:cu7CsUo7BK6ac/v193RIaqAzUcmpa6MNY4xYW9AenQI= github.com/waku-org/go-zerokit-rln v0.1.14-0.20230916173259-d284a3d8f2fd h1:cu7CsUo7BK6ac/v193RIaqAzUcmpa6MNY4xYW9AenQI=
github.com/waku-org/go-zerokit-rln v0.1.14-0.20230916173259-d284a3d8f2fd/go.mod h1:1PdBdPzyTaKt3VnpAHk3zj+r9dXPFOr3IHZP9nFle6E= github.com/waku-org/go-zerokit-rln v0.1.14-0.20230916173259-d284a3d8f2fd/go.mod h1:1PdBdPzyTaKt3VnpAHk3zj+r9dXPFOr3IHZP9nFle6E=
github.com/waku-org/go-zerokit-rln-apple v0.0.0-20230916172309-ee0ee61dde2b h1:KgZVhsLkxsj5gb/FfndSCQu6VYwALrCOgYI3poR95yE= github.com/waku-org/go-zerokit-rln-apple v0.0.0-20230916172309-ee0ee61dde2b h1:KgZVhsLkxsj5gb/FfndSCQu6VYwALrCOgYI3poR95yE=

View File

@ -1,227 +1,300 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="en">
<head> <head>
<meta charset="UTF-8" />
<title>Wallet Connect status-go test</title> <title>Wallet Connect status-go test</title>
<style></style>
</head> </head>
<body> <body>
<input <div id="log"></div>
type="text" <script src="bundle.js" type="module"></script>
id="pairLinkInput"
placeholder="Insert pair link"
disabled
/>
<div id="buttonRow">
<!-- TODO DEV <button id="pairButton" disabled>Pair</button>-->
<button id="pairButton">Pair</button>
<button id="authButton" disabled>Auth</button>
<button id="acceptButton" style="display: none">Accept</button>
<button id="rejectButton" style="display: none">Reject</button>
</div>
<div id="statusRow">
skd: <span id="statusText">-</span> ; status-go
<span id="statusGoStatusText">-</span>
</div>
<textarea id="echoTextArea" rows="10" cols="80"></textarea>
<script
src="bundle.js"
type="module"
onload="sdkLoaded()"
onerror="sdkFailLoading()"
></script>
<script> <script>
function statusGoReady() {}
</script>
<script>
function sdkLoaded() {
if (window.wc === undefined) {
goEcho(`FAILED missing "window.wc" SDK`);
setStatus(`FAILED missing "window.wc" SDK`);
} else {
window.getConfiguration().then(
(conf) => {
window.wc.init(conf.projectId).then(
(wc) => {
pairLinkInput.disabled = false;
setStatus("initialized");
},
(err) => {
setStatus(`SDK error: ${JSON.stringify(err)}`, "red");
}
);
},
(err) => {
goEcho(`SDK getConfiguration error: ${JSON.stringify(err)}`);
}
);
}
const pairLinkInput = document.getElementById("pairLinkInput");
const pairButton = document.getElementById("pairButton");
const authButton = document.getElementById("authButton");
const acceptButton = document.getElementById("acceptButton");
const rejectButton = document.getElementById("rejectButton");
pairLinkInput.addEventListener("input", function () {
pairButton.disabled = !(pairLinkInput.value.length > 0);
/*authButton.disabled = !(
pairLinkInput.value.length > 0
);*/
});
pairButton.addEventListener("click", function () {
setStatus("Pairing...");
try {
// TODO DEV: remove harcode
wc.pair(pairLinkInput.value)
.then((sessionProposal) => {
//let sessionProposal = JSON.parse(`{"id":1698771618724119,"params":{"id":1698771618724119,"pairingTopic":"4c36da43ac0d351336663276de6b5e2182f42068b7021e3cd1a460d9d7077e20","expiry":1698771923,"requiredNamespaces":{"eip155":{"methods":["eth_sendTransaction","personal_sign"],"chains":["eip155:5"],"events":["chainChanged","accountsChanged"]}},"optionalNamespaces":{"eip155":{"methods":["eth_signTransaction","eth_sign","eth_signTypedData","eth_signTypedData_v4"],"chains":["eip155:5"],"events":[]}},"relays":[{"protocol":"irn"}],"proposer":{"publicKey":"5d648503f2ec0e5a263578c347e490dcacb4e4359f59d66f12905bb91b9f182d","metadata":{"description":"React App for WalletConnect","url":"https://react-app.walletconnect.com","icons":["https://avatars.githubusercontent.com/u/37784886"],"name":"React App","verifyUrl":"https://verify.walletconnect.com"}}},"verifyContext":{"verified":{"verifyUrl":"https://verify.walletconnect.com","validation":"UNKNOWN","origin":"https://react-app.walletconnect.com"}}}`);
setStatus(`Wait user pair`);
setDetails(
`Pair ID: ${sessionProposal.id} ; Topic: ${sessionProposal.params.pairingTopic}`
);
window
.pairSessionProposal(JSON.stringify(sessionProposal))
.then((success) => {
if (!success) {
goEcho(
`GO.pairSessionProposal call failed ${sessionProposal.id}`
);
setGoStatus(`GO.pairSessionProposal failed`, "red");
return;
}
});
// Waiting for "proposeUserPair" event
})
.catch((error) => {
goEcho(`Pairing error ${JSON.stringify(error)}`);
setStatus(`Pairing error: ${error.message}`, "red");
});
} catch (err) {
goEcho(`Pairing error ${JSON.stringify(err)}`);
setStatus(`Pairing error: ${err.message}`, "red");
}
});
authButton.addEventListener("click", function () {
setStatus("Authenticating...");
window.auth();
});
window.wc.registerForSessionRequest((event) => {
setStatus(`Session topic ${event.topic}`);
window.sessionRequest(event).then((success) => {
if (!success) {
goEcho(`Session request status-go call failed ${event.topic}`);
setGoStatus(`Session ${event.id} rejected`, "purple");
return;
}
// Waiting for userApproveSession event
});
});
}
function goEcho(message) { function goEcho(message) {
window.echo(message); window.echo(message);
} }
function setStatusForElement(element, message, color) { // If not null add to it
const statusText = document.getElementById(element); var logEntries = null;
statusText.textContent = message;
if (color === undefined) color = "green"; var newSessionButton;
statusText.style.color = color; var hashedPasswordInput;
}
function setStatus(message, color) { function addHtmlEntry(htmlContent, color = null, entry = null) {
setStatusForElement("statusText", message, color); const logDiv = document.getElementById("log");
} if (entry) {
function setGoStatus(message, color) { entry.remove();
setStatusForElement("statusGoStatusText", message, color); }
} entry = document.createElement("div");
function setDetails(message) { logDiv.appendChild(entry);
const echoTextArea = document.getElementById("echoTextArea"); entry.innerHTML = htmlContent;
echoTextArea.value = message; if (color) {
entry.style.color = color;
}
entry.scrollIntoView();
if (logEntries) {
logEntries.push(entry);
}
return entry;
} }
function sdkFailLoading() { function addLogEntry(message, color = "black", entry = null) {
setStatus("FAILED loading SDK", "red"); return addHtmlEntry(`${message}`, color, entry);
} }
function logComponentStatusChange(componentName, statusMessage, color = "black", entry = null) {
const componentHtml = `<span style="color: fuchsia;">${componentName}</span>: `;
const statusHtml = `<span style="color: ${color};">${statusMessage}</span>`;
return addHtmlEntry(`${componentHtml}${statusHtml}`, null, entry);
}
const statusGoEntry = logComponentStatusChange("status-go", "Initializing...");
var eventCount = 0;
const readyToPairEventName = "readyToPair";
async function initializeSDK() {
try {
const sdkEntry = logComponentStatusChange("SDK", "Initializing...");
const conf = await window.getConfiguration();
const wc = await window.wc.init(conf.projectId);
logComponentStatusChange("SDK", "Initialized", "green", sdkEntry);
eventCount++;
} catch (error) {
logComponentStatusChange("SDK", "FAIL initializing ${error.message}", "red", sdkEntry);
}
}
var pairLinkInput = null;
var pairButton = null;
function newPairWorkflow() {
if (logEntries) {
for (let i = 0; i < logEntries.length; i++) {
logEntries[i].remove();
}
}
logEntries = [];
eventCount++;
addHtmlEntry(
`<input type="text" id="pairLinkInput" placeholder="Insert pair link" /><button id="pairButton" disabled>Pair</button>`
);
// List existing pairing sessions
const pairings = window.wc.getPairings();
if (pairings.length > 0) {
addHtmlEntry(`Existing pairings:`, "fuchsia");
}
for (let i = 0; i < pairings.length; i++) {
const p = pairings[i];
const disconnectEntry = addHtmlEntry(
`[${i + 1}] <span style="color: ${p.active ? "green" : "orange"};">${
p.active ? "ACTIVE" : "INACTIVE"
}</span> <span class="elide-text">${
p.topic
}</span>; Expires: ${timestampToStr(p.expiry)} <button id="unpairButton${i}">Disconnect</button>`
);
const unpairButton = document.getElementById(`unpairButton${i}`);
unpairButton.addEventListener("click", function () {
window.wc.disconnect(p.topic).then(
() => {
addLogEntry(`Pairing ${p.topic} disconnected`, "green", disconnectEntry);
unpairButton.remove();
},
(err) => {
addLogEntry(`Pairing ${p.topic} disconnect error: ${err.message}`, "red", disconnectEntry);
}
);
});
}
pairLinkInput = document.getElementById(`pairLinkInput`);
pairButton = document.getElementById(`pairButton`);
pairLinkInput.addEventListener("input", function () {
pairButton.disabled = !(pairLinkInput.value.length > 0);
});
pairButton.addEventListener("click", function () {
newSessionButton.style.display = "inline";
pairButton.disabled = true;
pairLinkInput.disabled = true;
const sdkEntry = logComponentStatusChange("SDK", "Pairing...");
window.wc
.pair(pairLinkInput.value)
.then((sessionProposal) => {
logComponentStatusChange("SDK", "got Pair session proposal", "green", sdkEntry);
addLogEntry(`Pair ID: ${sessionProposal.id} ; Topic: ${sessionProposal.params.pairingTopic}`);
const goSession = logComponentStatusChange("GO.pairSessionProposal", "waiting status-go", "pink");
document.addEventListener(`proposeUserPair`, function (event) {
pairProposalEntry = logComponentStatusChange(
"GO.proposeUserPair",
`received "proposeUserPair"`,
"green"
);
addLogEntry(JSON.stringify(event.detail.supportedNamespaces));
addHtmlEntry(
`<button id="acceptPairButton">Accept</button><button id="rejectPairButton">Reject</button>`
);
const acceptPairButton = document.getElementById(`acceptPairButton`);
const rejectPairButton = document.getElementById(`rejectPairButton`);
acceptPairButton.addEventListener("click", function () {
window.wc.approvePairSession(sessionProposal, event.detail.supportedNamespaces).then(
() => {
logComponentStatusChange(
"GO.pairSessionProposal",
`Pair session ${sessionProposal.id} approved`,
"green",
pairProposalEntry
);
acceptPairButton.remove();
rejectPairButton.remove();
},
(err) => {
logComponentStatusChange(
"GO.pairSessionProposal",
`Pair session ${sessionProposal.id} approve error: ${err.message}`,
"red",
pairProposalEntry
);
}
);
});
rejectPairButton.addEventListener("click", function () {
window.wc.rejectPairSession(sessionProposal.id).then(
() => {
logComponentStatusChange(
"GO.pairSessionProposal",
`Pair session ${sessionProposal.id} rejected`,
"green",
pairProposalEntry
);
acceptPairButton.remove();
rejectPairButton.remove();
},
(err) => {
logComponentStatusChange(
"GO.pairSessionProposal",
`Pair session ${sessionProposal.id} reject error: ${err.message}`,
"red",
pairProposalEntry
);
}
);
});
});
window.pairSessionProposal(JSON.stringify(sessionProposal)).then((success) => {
if (!success) {
logComponentStatusChange(
"GO.pairSessionProposal",
`call failed ${sessionProposal.id}`,
"red",
goSession
);
return;
}
logComponentStatusChange("GO.pairSessionProposal", `waiting for "proposeUserPair"`, "black", goSession);
});
})
.catch((error) => {
logComponentStatusChange("SDK", `Pairing error ${error.message}`, "red", sdkEntry);
});
});
}
function sdkReady() {
window.wc.registerForSessionRequest((event) => {
eventCount++;
logComponentStatusChange("SDK", `received "session_request" event`, "green");
addLogEntry(`Event: ${JSON.stringify(event)}`);
addHtmlEntry(
`<button id="acceptSessionButton${eventCount}">Accept</button> <button id="rejectSessionButton${eventCount}">Reject</button>`
);
const acceptSessionButton = document.getElementById(`acceptSessionButton${eventCount}`);
const rejectSessionButton = document.getElementById(`rejectSessionButton${eventCount}`);
acceptSessionButton.addEventListener("click", function () {
const sessionReqEntry = logComponentStatusChange("status-go", `sessionRequest called`, "orange");
window.sessionRequest(JSON.stringify(event), hashedPasswordInput.value).then((success) => {
acceptSessionButton.disabled = true;
rejectSessionButton.disabled = true;
if (success) {
logComponentStatusChange("status-go", `sessionRequest OK`, "green", sessionReqEntry);
// waiting for "sessionRequestResult" event
} else {
logComponentStatusChange(
"status-go",
`sessionRequest call failed for topic ${event.topic}`,
"red",
sessionReqEntry
);
window.wc.rejectSessionRequest(event.topic, event.id, true);
setStatus(`Session ${event.id} rejected, internal error`, "purple");
}
});
});
rejectSessionButton.addEventListener("click", function () {
acceptSessionButton.disabled = true;
rejectSessionButton.disabled = true;
window.wc.rejectSessionRequest(event.topic, event.id).then(
() => {
addLogEntry(`Session ${event.id} rejected`);
},
(err) => {
addLogEntry(`Session ${event.id} reject error: ${err.message}`, "red");
}
);
});
});
}
document.addEventListener("sessionRequestResult", function (event) {
let req = event.detail.sessionRequest;
const res = window.wc.respondSessionRequest(req.topic, req.id, event.detail.signed);
addLogEntry(`Session ${req.topic} approval accepted`);
addHtmlEntry(
`</br><a href="https://goerli.etherscan.io/tx/${event.detail.signed}" target="_blank">${event.detail.signed}</a>`
);
});
// Add start from scratch option
document.addEventListener(readyToPairEventName, function () {
addHtmlEntry(`<button id="newSessionButton" style="display: none;">New Session</button>`);
newSessionButton = document.getElementById("newSessionButton");
newSessionButton.addEventListener("click", function () {
newPairWorkflow();
});
addHtmlEntry(
`<input type="text" id="hashedPasswordInput" placeholder="Insert hashed password" value="0x38301fb0b5fcf3aaa4b97c4771bb6c75546e313b4ce7057c51a8cc6a3ace9d7e"/>`
);
hashedPasswordInput = document.getElementById(`hashedPasswordInput`);
sdkReady();
newPairWorkflow();
});
async function processGoEvents() { async function processGoEvents() {
while (true) { while (true) {
try { try {
const event = await window.popNextEvent(); const event = await window.popNextEvent();
switch (event.name) { switch (event.name) {
case "nodeReady": case "nodeReady":
setGoStatus("ready"); logComponentStatusChange("status-go", "Ready", "green", statusGoEntry);
statusGoReady(); eventCount++;
break;
case "proposeUserPair":
setGoStatus("Session proposed");
setDetails(JSON.stringify(event.payload.supportedNamespaces));
let sessionProposal = event.payload.sessionProposal;
acceptButton.addEventListener("click", function () {
try {
window.wc
.approveSession(
sessionProposal,
event.payload.supportedNamespaces
)
.then(
() => {
goEcho(`Session ${sessionProposal.id} approved`);
setStatus(`Session ${sessionProposal.id} approved`);
acceptButton.style.display = "none";
rejectButton.style.display = "none";
},
(err) => {
goEcho(
`Session ${sessionProposal.id} approve error: ${err}`
);
setStatus(
`Session ${sessionProposal.id} approve error: ${err}`
);
}
);
} catch (err) {
goEcho(`WTF error: ${err.message}`);
setStatus(`WTF error: ${err.message}`);
}
});
rejectButton.addEventListener("click", function () {
try {
window.wc.rejectSession(sessionProposal.id).then(
() => {
goEcho(`Session ${sessionProposal.id} rejected`);
setStatus(`Session ${sessionProposal.id} rejected`);
acceptButton.style.display = "none";
rejectButton.style.display = "none";
},
(err) => {
goEcho(`Session ${sessionProposal.id} reject error`);
setStatus(`Session ${sessionProposal.id} reject error`);
}
);
} catch (err) {
goEcho(
`Session ${sessionProposal.id} reject error: ${err.message}`
);
setStatus(
`Session ${sessionProposal.id} reject error: ${err.message}`
);
}
});
acceptButton.style.display = "inline";
rejectButton.style.display = "inline";
break; break;
default: default:
await new Promise((resolve) => setTimeout(resolve, 100)); // Handle status-go and SDK bootstrap events
if (eventCount == 2) {
eventCount++;
document.dispatchEvent(new CustomEvent(readyToPairEventName, {}));
} else if (event.name != "") {
goEcho(`GO event: ${event.name}`);
document.dispatchEvent(new CustomEvent(event.name, { detail: event.payload }));
} else {
await new Promise((resolve) => setTimeout(resolve, 100));
}
break; break;
} }
} catch (err) { } catch (err) {
@ -231,6 +304,36 @@
} }
processGoEvents(); processGoEvents();
// Call the initializeSDK function on page load
window.addEventListener("DOMContentLoaded", (event) => {
initializeSDK();
});
function timestampToStr(timestamp) {
const date = new Date(timestamp * 1000);
const readableDate = date.toLocaleDateString();
const readableTime = date.toLocaleTimeString();
return `${readableDate} - ${readableTime}`
}
</script> </script>
</body> </body>
<style>
.elide-text {
max-width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: inline-block;
transition: max-width 0.3s ease;
vertical-align: middle;
}
.elide-text:hover {
max-width: none;
background-color: #f0f0f0;
z-index: 1;
position: relative;
}
</style>
</html> </html>

View File

@ -15,6 +15,14 @@ import (
"github.com/status-im/status-go/signal" "github.com/status-im/status-go/signal"
) )
// l is used for local logging
var l log.Logger
func init() {
l = log.New()
l.SetHandler(log.CallerFileHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(false))))
}
type PairResult struct { type PairResult struct {
SessionProposal string `json:"sessionProposal"` SessionProposal string `json:"sessionProposal"`
} }
@ -39,7 +47,7 @@ func signalHandler(jsonEvent string) {
apiResponse := statusgo.APIResponse{} apiResponse := statusgo.APIResponse{}
err = json.Unmarshal([]byte(jsonEvent), &apiResponse) err = json.Unmarshal([]byte(jsonEvent), &apiResponse)
if err != nil { if err != nil {
fmt.Println("@dd Error parsing the event: ", err) log.Error("Error parsing the signal event: ", err)
return return
} }
} }
@ -51,7 +59,7 @@ func signalHandler(jsonEvent string) {
walletEvent := walletevent.Event{} walletEvent := walletevent.Event{}
err := json.Unmarshal([]byte(jsonEvent), &walletEvent) err := json.Unmarshal([]byte(jsonEvent), &walletEvent)
if err != nil { if err != nil {
fmt.Println("@dd Error parsing the wallet event: ", err) log.Error("Error parsing the wallet event: ", err)
return return
} }
// TODO: continue from here // TODO: continue from here
@ -63,7 +71,7 @@ func signalHandler(jsonEvent string) {
func main() { func main() {
// Setup status-go logger // Setup status-go logger
log.Root().SetHandler(log.StdoutHandler) log.Root().SetHandler(log.CallerFileHandler(log.StdoutHandler))
signal.SetDefaultNodeNotificationHandler(signalHandler) signal.SetDefaultNodeNotificationHandler(signalHandler)
config, nodeConfigJson, userFolder, err := processConfigArgs() config, nodeConfigJson, userFolder, err := processConfigArgs()
@ -81,14 +89,14 @@ func main() {
w := webview.New(true) w := webview.New(true)
defer w.Destroy() defer w.Destroy()
w.SetTitle("WC status-go test") w.SetTitle("WC status-go test")
w.SetSize(620, 480, webview.HintNone) w.SetSize(1280, 1024, webview.HintNone)
w.Bind("pairSessionProposal", func(sessionProposalJson string) bool { w.Bind("pairSessionProposal", func(sessionProposalJson string) bool {
sessionReqRes := callPrivateMethod("wallet_wCPairSessionProposal", []interface{}{sessionProposalJson}) sessionProposalRes := callPrivateMethod("wallet_wCPairSessionProposal", []interface{}{sessionProposalJson})
var apiResponse wc.PairSessionResponse var apiResponse wc.PairSessionResponse
err = getRPCAPIResponse(sessionReqRes, &apiResponse) err = getRPCAPIResponse(sessionProposalRes, &apiResponse)
if err != nil { if err != nil {
log.Error("Error parsing the API response", "error", err) l.Error("Error parsing the API response", "error", err)
return false return false
} }
@ -99,13 +107,32 @@ func main() {
return true return true
}) })
w.Bind("sessionRequest", func(sessionRequestJson, hashedPassword string) bool {
sessionReqRes := callPrivateMethod("wallet_wCSessionRequest", []interface{}{sessionRequestJson, hashedPassword})
var apiResponse wc.SessionRequestResponse
err = getRPCAPIResponse(sessionReqRes, &apiResponse)
if err != nil {
l.Error("Error parsing the API response", "error", err)
return false
}
go func() {
eventQueue <- GoEvent{Name: "sessionRequestResult", Payload: apiResponse}
}()
return true
})
w.Bind("getConfiguration", func() Configuration { w.Bind("getConfiguration", func() Configuration {
projectID := os.Getenv("STATUS_BUILD_WALLET_CONNECT_PROJECT_ID") projectID := os.Getenv("STATUS_BUILD_WALLET_CONNECT_PROJECT_ID")
if projectID == "" {
projectID = "87815d72a81d739d2a7ce15c2cfdefb3"
}
return Configuration{ProjectId: projectID} return Configuration{ProjectId: projectID}
}) })
w.Bind("echo", func(message string) bool { w.Bind("echo", func(message string) bool {
fmt.Println("@dd WebView:", message) fmt.Println("<D> WebView:", message)
return true return true
}) })

View File

@ -7,11 +7,17 @@ QtObject {
PairSuccess, PairSuccess,
PairError, PairError,
ApprovePairSuccess, ApprovePairSuccess,
ApprovePairError, ApprovePairError,
RejectPairSuccess, RejectPairSuccess,
RejectPairError RejectPairError,
AcceptSessionSuccess,
AcceptSessionError,
RejectSessionSuccess,
RejectSessionError,
GetPairings,
GetPairingsError
} }
} }

View File

@ -15,6 +15,13 @@ Item {
required property color backgroundColor required property color backgroundColor
property bool sdkReady: state === d.sdkReadyState
function setUriAndPair(wcUri) {
pairLinkInput.text = wcUri
d.sdkView.pair(wcUri)
}
// wallet_connect.Controller \see wallet_section/wallet_connect/controller.nim // wallet_connect.Controller \see wallet_section/wallet_connect/controller.nim
required property var controller required property var controller
@ -42,31 +49,31 @@ Item {
text: "Pair" text: "Pair"
onClicked: { onClicked: {
statusText.text = "Pairing..." statusText.text = "Pairing..."
sdkView.pair(pairLinkInput.text) d.sdkView.pair(pairLinkInput.text)
} }
enabled: pairLinkInput.text.length > 0 && sdkView.sdkReady enabled: pairLinkInput.text.length > 0 && d.sdkView.sdkReady
} }
StatusButton { StatusButton {
text: "Auth" text: "Auth"
onClicked: { onClicked: {
statusText.text = "Authenticating..." statusText.text = "Authenticating..."
sdkView.auth() d.sdkView.auth()
} }
enabled: false && pairLinkInput.text.length > 0 && sdkView.sdkReady enabled: false && pairLinkInput.text.length > 0 && d.sdkView.sdkReady
} }
StatusButton { StatusButton {
text: "Accept" text: "Accept"
onClicked: { onClicked: {
sdkView.approvePairSession(d.sessionProposal, d.supportedNamespaces) d.sdkView.approvePairSession(d.sessionProposal, d.supportedNamespaces)
} }
visible: root.state === d.waitingPairState visible: root.state === d.waitingPairState
} }
StatusButton { StatusButton {
text: "Reject" text: "Reject"
onClicked: { onClicked: {
sdkView.rejectPairSession(d.sessionProposal.id) d.sdkView.rejectPairSession(d.sessionProposal.id)
} }
visible: root.state === d.waitingPairState visible: root.state === d.waitingPairState
} }
@ -77,6 +84,22 @@ Item {
id: statusText id: statusText
text: "-" text: "-"
} }
StatusBaseText {
text: "Pairings"
visible: d.sdkView.pairingsModel.count > 0
}
StatusListView {
Layout.fillWidth: true
Layout.preferredHeight: contentHeight
Layout.maximumHeight: 200
model: d.sdkView.pairingsModel
delegate: StatusBaseText {
text: `${SQUtils.Utils.elideText(topic, 6, 6)} - ${new Date(expiry * 1000).toLocaleString()}`
color: active ? "green" : "orange"
}
}
Flickable { Flickable {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 200 Layout.preferredHeight: 200
@ -97,6 +120,32 @@ Item {
clip: true clip: true
} }
RowLayout {
StatusButton {
text: "Accept"
onClicked: {
root.controller.sessionRequest(JSON.stringify(d.sessionRequest), passwordInput.text)
}
visible: root.state === d.waitingUserResponseToSessionRequest
}
StatusButton {
text: "Reject"
onClicked: {
d.sdkView.rejectSessionRequest(d.sessionRequest.topic, d.sessionRequest.id, false)
}
visible: root.state === d.waitingUserResponseToSessionRequest
}
StatusInput {
id: passwordInput
text: "1234567890"
placeholderText: "Insert account password"
visible: root.state === d.waitingUserResponseToSessionRequest
}
}
ColumnLayout { /* spacer */ }
} }
// TODO: DEBUG JS Loading in DMG // TODO: DEBUG JS Loading in DMG
@ -111,7 +160,7 @@ Item {
// Button { // Button {
// text: "Set URL" // text: "Set URL"
// onClicked: { // onClicked: {
// sdkView.url = urlInput.text // d.sdkView.url = urlInput.text
// } // }
// } // }
// } // }
@ -119,7 +168,7 @@ Item {
// Button { // Button {
// text: "Set HTML" // text: "Set HTML"
// onClicked: { // onClicked: {
// sdkView.loadHtml(htmlContent.text, "http://status.im") // d.sdkView.loadHtml(htmlContent.text, "http://status.im")
// } // }
// } // }
@ -142,67 +191,93 @@ Item {
// Separator // Separator
ColumnLayout {} ColumnLayout {}
WalletConnectSDK { // TODO: use it in tests to load a dummy SDK
id: sdkView Loader {
id: sdkViewLoader
projectId: controller.projectId
backgroundColor: root.backgroundColor
Layout.fillWidth: true Layout.fillWidth: true
// Note that a too smaller height might cause the webview to generate rendering errors // Note that a too smaller height might cause the webview to generate rendering errors
Layout.preferredHeight: 10 Layout.preferredHeight: 10
onSdkInit: function(success, info) { sourceComponent: SdkViewComponent {}
d.setDetailsText(info) }
if (success) { }
d.setStatusText("Ready to pair or auth")
root.state = d.sdkReadyState
} else {
d.setStatusText("SDK Error", "red")
root.state = ""
}
}
onPairSessionProposal: function(success, sessionProposal) { component SdkViewComponent: WalletConnectSDK {
d.setDetailsText(sessionProposal) projectId: controller.projectId
if (success) { backgroundColor: root.backgroundColor
d.setStatusText("Pair ID: " + sessionProposal.id + "; Topic: " + sessionProposal.params.pairingTopic)
root.controller.pairSessionProposal(JSON.stringify(sessionProposal))
// Expecting signal onProposeUserPair from controller
} else {
d.setStatusText("Pairing error", "red")
}
}
onPairAcceptedResult: function(success, result) { onSdkInit: function(success, info) {
d.setDetailsText(result) d.setDetailsText(info)
if (success) { if (success) {
d.setStatusText("Pairing OK") d.setStatusText("Ready to pair or auth")
root.state = d.pairedState
} else {
d.setStatusText("Pairing error", "red")
root.state = d.sdkReadyState
}
}
onPairRejectedResult: function(success, result) {
d.setDetailsText(result)
root.state = d.sdkReadyState root.state = d.sdkReadyState
if (success) { } else {
d.setStatusText("Pairing rejected") d.setStatusText("SDK Error", "red")
} else { root.state = ""
d.setStatusText("Rejecting pairing error", "red")
}
}
onStatusChanged: function(message) {
statusText.text = message
}
onResponseTimeout: {
d.setStatusText(`Timeout waiting for response. Reusing URI?`, "red")
} }
} }
onPairSessionProposal: function(success, sessionProposal) {
d.setDetailsText(sessionProposal)
if (success) {
d.setStatusText("Pair ID: " + sessionProposal.id + "; Topic: " + sessionProposal.params.pairingTopic)
root.controller.pairSessionProposal(JSON.stringify(sessionProposal))
// Expecting signal onProposeUserPair from controller
} else {
d.setStatusText("Pairing error", "red")
}
}
onPairAcceptedResult: function(success, result) {
d.setDetailsText(result)
if (success) {
d.setStatusText("Pairing OK")
root.state = d.pairedState
} else {
d.setStatusText("Pairing error", "red")
root.state = d.sdkReadyState
}
}
onPairRejectedResult: function(success, result) {
d.setDetailsText(result)
root.state = d.sdkReadyState
if (success) {
d.setStatusText("Pairing rejected")
} else {
d.setStatusText("Rejecting pairing error", "red")
}
}
onSessionRequestUserAnswerResult: function(accept, error) {
if (error) {
d.setStatusText(`Session Request ${accept ? "Accept" : "Reject"} error`, "red")
return
}
root.state = d.pairedState
if (accept) {
d.setStatusText(`Session Request accepted`)
} else {
d.setStatusText(`Session Request rejected`)
}
}
onSessionRequestEvent: function(sessionRequest) {
d.setStatusText("Approve session request")
d.setDetailsText(JSON.stringify(sessionRequest, null, 2))
d.sessionRequest = sessionRequest
root.state = d.waitingUserResponseToSessionRequest
}
onResponseTimeout: {
d.setStatusText(`Timeout waiting for response. Reusing URI?`, "red")
}
onStatusChanged: function(message) {
statusText.text = message
}
} }
QtObject { QtObject {
@ -211,10 +286,16 @@ Item {
property var sessionProposal: null property var sessionProposal: null
property var supportedNamespaces: null property var supportedNamespaces: null
property var sessionRequest: null
property var signedData: null
readonly property string sdkReadyState: "sdk_ready" readonly property string sdkReadyState: "sdk_ready"
readonly property string waitingPairState: "waiting_pairing" readonly property string waitingPairState: "waiting_pairing"
readonly property string waitingUserResponseToSessionRequest: "waiting_user_response_to_session_request"
readonly property string pairedState: "paired" readonly property string pairedState: "paired"
property var sdkView: sdkViewLoader.item
function setStatusText(message, textColor) { function setStatusText(message, textColor) {
statusText.text = message statusText.text = message
if (textColor === undefined) { if (textColor === undefined) {
@ -234,6 +315,7 @@ Item {
Connections { Connections {
target: root.controller target: root.controller
function onProposeUserPair(sessionProposalJson, supportedNamespacesJson) { function onProposeUserPair(sessionProposalJson, supportedNamespacesJson) {
d.setStatusText("Waiting user accept") d.setStatusText("Waiting user accept")
@ -245,4 +327,25 @@ Item {
root.state = d.waitingPairState root.state = d.waitingPairState
} }
} }
Connections {
target: root.controller
function onRespondSessionRequest(sessionRequestJson, signedJson, error) {
console.log("@dd respondSessionRequest", sessionRequestJson, signedJson, error)
if (error) {
d.setStatusText("Session Request error", "red")
d.sdkView.rejectSessionRequest(d.sessionRequest.topic, d.sessionRequest.id, true)
return
}
d.sessionRequest = JSON.parse(sessionRequestJson)
d.signedData = JSON.parse(signedJson)
d.sdkView.acceptSessionRequest(d.sessionRequest.topic, d.sessionRequest.id, d.signedData)
d.setStatusText("Session Request accepted")
d.setDetailsText(d.signedData)
}
}
} }

View File

@ -23,11 +23,14 @@ WebView {
required property color backgroundColor required property color backgroundColor
readonly property alias sdkReady: d.sdkReady readonly property alias sdkReady: d.sdkReady
readonly property alias pairingsModel: d.pairingsModel
signal sdkInit(bool success, var result) signal sdkInit(bool success, var result)
signal pairSessionProposal(bool success, var sessionProposal) signal pairSessionProposal(bool success, var sessionProposal)
signal pairAcceptedResult(bool success, var sessionType) signal pairAcceptedResult(bool success, var sessionType)
signal pairRejectedResult(bool success, var result) signal pairRejectedResult(bool success, var result)
signal sessionRequestEvent(var sessionRequest)
signal sessionRequestUserAnswerResult(bool accept, string error)
signal responseTimeout() signal responseTimeout()
// TODO: proper report // TODO: proper report
@ -35,19 +38,31 @@ WebView {
function pair(pairLink) { function pair(pairLink) {
let callStr = d.generateSdkCall("pair", `"${pairLink}"`, RequestCodes.PairSuccess, RequestCodes.PairError) let callStr = d.generateSdkCall("pair", `"${pairLink}"`, RequestCodes.PairSuccess, RequestCodes.PairError)
d.requestSdk(callStr) d.requestSdkAsync(callStr)
} }
function approvePairSession(sessionProposal, supportedNamespaces) { function approvePairSession(sessionProposal, supportedNamespaces) {
let callStr = d.generateSdkCall("approvePairSession", `${JSON.stringify(sessionProposal)}, ${JSON.stringify(supportedNamespaces)}`, RequestCodes.ApprovePairSuccess, RequestCodes.ApprovePairSuccess) let callStr = d.generateSdkCall("approvePairSession", `${JSON.stringify(sessionProposal)}, ${JSON.stringify(supportedNamespaces)}`, RequestCodes.ApprovePairSuccess, RequestCodes.ApprovePairSuccess)
d.requestSdk(callStr) d.requestSdkAsync(callStr)
} }
function rejectPairSession(id) { function rejectPairSession(id) {
let callStr = d.generateSdkCall("rejectPairSession", id, RequestCodes.RejectPairSuccess, RequestCodes.RejectPairError) let callStr = d.generateSdkCall("rejectPairSession", id, RequestCodes.RejectPairSuccess, RequestCodes.RejectPairError)
d.requestSdk(callStr) d.requestSdkAsync(callStr)
}
function acceptSessionRequest(topic, id, signature) {
let callStr = d.generateSdkCall("respondSessionRequest", `"${topic}", ${id}, "${signature}"`, RequestCodes.AcceptSessionSuccess, RequestCodes.AcceptSessionError)
d.requestSdkAsync(callStr)
}
function rejectSessionRequest(topic, id, error) {
let callStr = d.generateSdkCall("rejectSessionRequest", `"${topic}", ${id}, ${error}`, RequestCodes.RejectSessionSuccess, RequestCodes.RejectSessionError)
d.requestSdkAsync(callStr)
} }
// TODO #12434: remove debugging WebEngineView code // TODO #12434: remove debugging WebEngineView code
@ -66,9 +81,6 @@ WebView {
// case WebEngineView.LoadStartedStatus: // case WebEngineView.LoadStartedStatus:
root.statusChanged(`<font color="blue">Loading SDK JS code</font>`) root.statusChanged(`<font color="blue">Loading SDK JS code</font>`)
break break
// case WebEngineView.LoadStoppedStatus:
// root.statusChanged(`<font color="pink">STOPPED loading SDK JS code</font>`)
// break
} }
} }
@ -87,7 +99,7 @@ WebView {
let htmlSrc = `<!DOCTYPE html><html><head><!--<title>TODO: Test</title>--><script type='text/javascript'>${scriptSrc}</script></head><body style='background-color: ${root.backgroundColor.toString()};'></body></html>` let htmlSrc = `<!DOCTYPE html><html><head><!--<title>TODO: Test</title>--><script type='text/javascript'>${scriptSrc}</script></head><body style='background-color: ${root.backgroundColor.toString()};'></body></html>`
console.debug(`@dd WalletConnectSDK.loadHtml; htmlSrc len: ${htmlSrc.length}`) console.debug(`@dd WalletConnectSDK.loadHtml; htmlSrc len: ${htmlSrc.length}`)
root.loadHtml(htmlSrc, "http://status.im") root.loadHtml(htmlSrc, "https://status.app")
} }
Timer { Timer {
@ -110,7 +122,7 @@ WebView {
let done = false let done = false
if (wcResult.error) { if (wcResult.error) {
console.debug(`@dd wcResult - ${JSON.stringify(wcResult)}`) console.debug(`WC JS error response - ${JSON.stringify(wcResult)}`)
done = true done = true
if (!d.sdkReady) { if (!d.sdkReady) {
root.statusChanged(`<font color="red">[${timer.errorCount++}] Failed SDK init; error: ${wcResult.error}</font>`) root.statusChanged(`<font color="red">[${timer.errorCount++}] Failed SDK init; error: ${wcResult.error}</font>`)
@ -124,6 +136,7 @@ WebView {
case RequestCodes.SdkInitSuccess: case RequestCodes.SdkInitSuccess:
d.sdkReady = true d.sdkReady = true
root.sdkInit(true, "") root.sdkInit(true, "")
d.startListeningForEvents()
break break
case RequestCodes.SdkInitError: case RequestCodes.SdkInitError:
d.sdkReady = false d.sdkReady = false
@ -131,15 +144,18 @@ WebView {
break break
case RequestCodes.PairSuccess: case RequestCodes.PairSuccess:
root.pairSessionProposal(true, wcResult.result) root.pairSessionProposal(true, wcResult.result)
d.getPairings()
break break
case RequestCodes.PairError: case RequestCodes.PairError:
root.pairSessionProposal(false, wcResult.error) root.pairSessionProposal(false, wcResult.error)
break break
case RequestCodes.ApprovePairSuccess: case RequestCodes.ApprovePairSuccess:
root.pairAcceptedResult(true, "") root.pairAcceptedResult(true, "")
d.getPairings()
break break
case RequestCodes.ApprovePairError: case RequestCodes.ApprovePairError:
root.pairAcceptedResult(false, wcResult.error) root.pairAcceptedResult(false, wcResult.error)
d.getPairings()
break break
case RequestCodes.RejectPairSuccess: case RequestCodes.RejectPairSuccess:
root.pairRejectedResult(true, "") root.pairRejectedResult(true, "")
@ -147,6 +163,24 @@ WebView {
case RequestCodes.RejectPairError: case RequestCodes.RejectPairError:
root.pairRejectedResult(false, wcResult.error) root.pairRejectedResult(false, wcResult.error)
break break
case RequestCodes.AcceptSessionSuccess:
root.sessionRequestUserAnswerResult(true, "")
break
case RequestCodes.AcceptSessionError:
root.sessionRequestUserAnswerResult(true, wcResult.error)
break
case RequestCodes.RejectSessionSuccess:
root.sessionRequestUserAnswerResult(false, "")
break
case RequestCodes.RejectSessionError:
root.sessionRequestUserAnswerResult(false, wcResult.error)
break
case RequestCodes.GetPairings:
d.populatePairingsModel(wcResult.result)
break
case RequestCodes.GetPairingsError:
console.error(`WalletConnectSDK - getPairings error: ${wcResult.error}`)
break
default: { default: {
root.statusChanged(`<font color="red">[${timer.errorCount++}] Unknown state: ${wcResult.state}</font>`) root.statusChanged(`<font color="red">[${timer.errorCount++}] Unknown state: ${wcResult.state}</font>`)
} }
@ -176,6 +210,29 @@ WebView {
} }
} }
Timer {
id: eventsTimer
interval: 100
repeat: true
running: false
onTriggered: {
root.runJavaScript("window.wcEventResult ? window.wcEventResult.shift() : null", function(event) {
if (event) {
switch(event.name) {
case "session_request":
root.sessionRequestEvent(event.payload)
break
default:
console.error("WC unknown event type: ", event.type)
break
}
}
})
}
}
QtObject { QtObject {
id: d id: d
@ -183,15 +240,34 @@ WebView {
property var sessionType: null property var sessionType: null
property bool sdkReady: false property bool sdkReady: false
property ListModel pairingsModel: pairings
onSdkReadyChanged: {
if (sdkReady) {
d.getPairings()
}
}
function populatePairingsModel(pairList) {
pairings.clear();
for (let i = 0; i < pairList.length; i++) {
pairings.append({
active: pairList[i].active,
topic: pairList[i].topic,
expiry: pairList[i].expiry
});
}
}
function isWaitingForSdk() { function isWaitingForSdk() {
return timer.running return timer.running
} }
function generateSdkCall(methodName, paramsStr, successState, errorState) { function generateSdkCall(methodName, paramsStr, successState, errorState) {
return "wcResult = {error: null}; try { wc." + methodName + "(" + paramsStr + ").then((callRes) => { wcResult = {state: " + successState + ", error: null, result: callRes}; }).catch((error) => { wcResult = {state: " + errorState + ", error: error}; }); } catch (e) { wcResult = {state: " + errorState + ", error: \"Exception: \" + e.message}; }; wcResult" return "wcResult = {}; try { wc." + methodName + "(" + paramsStr + ").then((callRes) => { wcResult = {state: " + successState + ", error: null, result: callRes}; }).catch((error) => { wcResult = {state: " + errorState + ", error: error}; }); } catch (e) { wcResult = {state: " + errorState + ", error: \"Exception: \" + e.message}; }; wcResult"
} }
function requestSdk(jsCode) { function requestSdkAsync(jsCode) {
root.runJavaScript(jsCode, root.runJavaScript(jsCode,
function(result) { function(result) {
timer.restart() timer.restart()
@ -199,9 +275,52 @@ WebView {
) )
} }
function requestSdk(methodName, paramsStr, successState, errorState) {
const jsCode = "wcResult = {}; try { const callRes = wc." + methodName + "(" + (paramsStr ? (paramsStr) : "") + "); wcResult = {state: " + successState + ", error: null, result: callRes}; } catch (e) { wcResult = {state: " + errorState + ", error: \"Exception: \" + e.message}; }; wcResult"
root.runJavaScript(jsCode,
function(result) {
timer.restart()
}
)
}
function startListeningForEvents() {
const jsCode = "
try {
function processWCEvents() {
window.wcEventResult = [];
window.wcEventError = null
window.wc.registerForSessionRequest((event) => {
window.wcEventResult.push({name: 'session_request', payload: event});
});
}
processWCEvents();
} catch (e) {
window.wcEventError = e
}
window.wcEventError"
root.runJavaScript(jsCode,
function(result) {
if (result) {
console.error("startListeningForEvents: processWCEvents error", result)
return
}
}
)
eventsTimer.start()
}
function init(projectId) { function init(projectId) {
console.debug(`@dd WC projectId - ${projectId}`) d.requestSdkAsync(generateSdkCall("init", `"${projectId}"`, RequestCodes.SdkInitSuccess, RequestCodes.SdkInitError))
d.requestSdk(generateSdkCall("init", `"${projectId}"`, RequestCodes.SdkInitSuccess, RequestCodes.SdkInitError)) }
function getPairings(projectId) {
d.requestSdk("getPairings", `null`, RequestCodes.GetPairings, RequestCodes.GetPairingsError)
} }
} }
ListModel {
id: pairings
}
} }

View File

@ -4,7 +4,7 @@
- [ ] test namespaces implementation https://se-sdk-dapp.vercel.app/ - [ ] test namespaces implementation https://se-sdk-dapp.vercel.app/
Design questions ### Design questions
- [ ] Do we report all chains and all accounts combination or let user select? - [ ] Do we report all chains and all accounts combination or let user select?
- Wallet Connect require to report all chainIDs that were requested - Wallet Connect require to report all chainIDs that were requested
@ -12,7 +12,7 @@ Design questions
- [ ] Can't respond to sign messages if the wallet-connect dialog/view is closed (app is minimized) - [ ] Can't respond to sign messages if the wallet-connect dialog/view is closed (app is minimized)
- Only apps that use deep links are expected to work seamlessly - Only apps that use deep links are expected to work seamlessly
- [ ] Do we report **disabled chains**? **Update session** in case of enabled/disabled chains? - [ ] Do we report **disabled chains**? **Update session** in case of enabled/disabled chains?
- [ ] Allow user to **disconnect session**? - [ ] Allow user to **disconnect session**? Manage sessions?
- [ ] Support update session if one account is added/removed? - [ ] Support update session if one account is added/removed?
- [ ] User awareness of session expiration? - [ ] User awareness of session expiration?
- Support extend session? - Support extend session?
@ -37,7 +37,6 @@ Install dependencies steps by executing commands in this directory:
Use the web demo test client https://react-app.walletconnect.com/ for wallet pairing and https://react-auth-dapp.walletconnect.com/ for authentication Use the web demo test client https://react-app.walletconnect.com/ for wallet pairing and https://react-auth-dapp.walletconnect.com/ for authentication
## Log ## Log
Initial setup Initial setup
@ -47,6 +46,7 @@ npm init -y
npm install --save-dev webpack webpack-cli webpack-dev-server npm install --save-dev webpack webpack-cli webpack-dev-server
npm install --save @walletconnect/web3wallet npm install --save @walletconnect/web3wallet
npm run build npm run build
# npm run build:dev # for development
``` ```
## Dev - to be removed ## Dev - to be removed
@ -69,8 +69,7 @@ StatusDialog {
backgroundColor: wcHelperDialog.backgroundColor backgroundColor: wcHelperDialog.backgroundColor
projectId: "<Project ID>" controller: WalletStores.RootStore.walletConnectController
controller: WalletStores.RootStore.wcController
} }
clip: true clip: true

File diff suppressed because one or more lines are too long

View File

@ -11,7 +11,9 @@
"license": "MPL-2.0", "license": "MPL-2.0",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack" "build": "webpack --mode production",
"build:dev": "webpack --mode development",
"start": "webpack serve --mode development --open"
}, },
"dependencies": { "dependencies": {
"@walletconnect/auth-client": "^2.1.2", "@walletconnect/auth-client": "^2.1.2",

View File

@ -5,6 +5,7 @@ import AuthClient from '@walletconnect/auth-client'
// import the builder util // import the builder util
import { buildApprovedNamespaces, getSdkError } from "@walletconnect/utils"; import { buildApprovedNamespaces, getSdkError } from "@walletconnect/utils";
import { formatJsonRpcResult, formatJsonRpcError } from "@walletconnect/jsonrpc-utils";
// "Export" API to window // "Export" API to window
// Workaround, tried using export via output.module: true in webpack.config.js, but it didn't work // Workaround, tried using export via output.module: true in webpack.config.js, but it didn't work
@ -24,7 +25,7 @@ window.wc = {
metadata: { metadata: {
name: "Status", name: "Status",
description: "Status Wallet", description: "Status Wallet",
url: "https://status.app", url: "http://localhost",
icons: ['https://status.im/img/status-footer-logo.svg'], icons: ['https://status.im/img/status-footer-logo.svg'],
}, },
}); });
@ -58,7 +59,6 @@ window.wc = {
let pairPromise = window.wc.web3wallet let pairPromise = window.wc.web3wallet
.pair({ uri: uri }) .pair({ uri: uri })
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
pairPromise pairPromise
.then(() => { .then(() => {
@ -72,6 +72,14 @@ window.wc = {
}); });
}, },
getPairings: function () {
return window.wc.core.pairing.getPairings();
},
disconnect: function (topic) {
return window.wc.core.pairing.disconnect({ topic: topic});
},
registerForSessionRequest: function (callback) { registerForSessionRequest: function (callback) {
window.wc.web3wallet.on("session_request", callback); window.wc.web3wallet.on("session_request", callback);
}, },
@ -158,10 +166,20 @@ window.wc = {
return window.wc.authClient.reject(id); return window.wc.authClient.reject(id);
}, },
respondSessionRequest: function (topic, response) { respondSessionRequest: function (topic, id, signature) {
window.wc.web3wallet.respondSessionRequest({ topic, response }); const response = formatJsonRpcResult(id, signature)
return window.wc.web3wallet.respondSessionRequest({ topic, response });
}, },
rejectSessionRequest: function (topic, id, error = false) {
const errorType = error ? "SESSION_SETTLEMENT_FAILED" : "USER_REJECTED";
return window.wc.web3wallet.respondSessionRequest({
topic: topic,
response: formatJsonRpcError(id, getSdkError(errorType)),
});
},
disconnectAll: function () { disconnectAll: function () {
const pairings = window.wc.core.pairing.getPairings(); const pairings = window.wc.core.pairing.getPairings();
pairings.forEach((p) => { pairings.forEach((p) => {

2
vendor/status-go vendored

@ -1 +1 @@
Subproject commit 5381ec4a767750034722c6611686f69215110366 Subproject commit b994cedfc3980940fef94563ec835a1439d2586e