chunks: ['options']
}),
page({
- title: '转账',
+ title: 'Byone notification',
name: 'prompt',
chunks: ['prompt']
}),
view:'展示全部',
hide:'隐藏全部'
},
+ signMessage:{
+ title:'请求签名',
+ address: '签名地址',
+ message:'签名消息',
+ confirmSignature:'确认签名'
+ },
receive:{
address: '地址',
tips:'提示:点击地址进行拷贝。'
view:'View All',
hide:'Hide All'
},
+ signMessage:{
+ title:'Request Signature',
+ address: 'Sign Address',
+ message:'Sign Message',
+ confirmSignature:'Sign'
+ },
receive:{
address: 'Address',
tips:'Tips: Click address to copy directly.'
case MsgTypes.SEND:
this.send(sendResponse, message.payload)
break
+ case MsgTypes.SIGNMESSAGE:
+ this.signMessage(sendResponse, message.payload)
+ break
case MsgTypes.REQUEST_CURRENT_ACCOUNT:
this.requestCurrentAccount(sendResponse)
break
}
}
+ signMessage(sendResponse, payload) {
+ var promptURL = chrome.extension.getURL('pages/prompt.html')
+ var requestBody = payload
+ var queryString = new URLSearchParams(requestBody).toString()
+ console.log(promptURL, queryString)
+
+ if(requestBody.address === undefined){
+ sendResponse(Error.typeMissed('address'));
+ return false;
+ }
+ if(requestBody.message === undefined){
+ sendResponse(Error.typeMissed('message'));
+ return false;
+ }
+
+ chrome.windows.create(
+ {
+ url: `${promptURL}#signMessage?${queryString}`,
+ type: 'popup',
+ width: 360,
+ height: 623,
+ top: 0,
+ left: 0
+ },
+ (window) => {
+ chrome.runtime.onMessage.addListener(function(request, sender) {
+ if(sender.tab.windowId === window.id){
+ switch (request.method){
+ case 'sign-message':
+ if (request.action === 'success'){
+ sendResponse(request.message);
+ return true;
+ } else if (request.action === 'reject'){
+ sendResponse(request.message);
+ return false;
+ }
+ }
+ }
+ });
+
+ chrome.windows.onRemoved.addListener(function(windowId){
+ if(windowId === window.id) {
+ sendResponse(Error.promptClosedWithoutAction());
+ return false;
+ }
+ });
+ }
+ )
+ }
+
transfer(sendResponse, payload) {
var promptURL = chrome.extension.getURL('pages/prompt.html')
var requestBody = payload
requestBody.type = "popup"
var queryString = new URLSearchParams(requestBody).toString()
console.log(promptURL, queryString)
- payload.asset
if(requestBody.from === undefined){
sendResponse(Error.typeMissed('from'));
sendResponse(Error.typeMissed('gas'));
return false;
}
- if(payload.args === undefined){
- sendResponse(Error.typeMissed('args'));
- return false;
- }
+
chrome.windows.create(
{
url: `${promptURL}#advancedTransfer?${queryString}`,
if (!isReady) return
if (!msg) return
+ if(!stream.synced && (!msg.hasOwnProperty('type') || msg.type !== 'sync')) {
+ stream.send(new Error('inject Error'), PairingTags.INJECTED);
+ return;
+ }
let networkMessage = NetworkMessage.fromJson(msg)
switch (msg.type) {
break
case MsgTypes.TRANSFER:
case MsgTypes.ADVTRANSFER:
+ case MsgTypes.SIGNMESSAGE:
case MsgTypes.SEND:
this.transfer(msg.type, networkMessage)
break
export default class Bytomdapp {
constructor(_stream, _options) {
- currentVersion = parseFloat(_options.version)
- // this.useIdentity(_options.identity)
+ // currentVersion = parseFloat(_options.version)
stream = _stream
resolvers = []
this.default_account = _options.defaultAccount
send_advanced_transaction(params) {
return _send(MsgTypes.ADVTRANSFER, params)
}
+
+ sign_message(params) {
+ return _send(MsgTypes.SIGNMESSAGE, params)
+ }
}
export const AUTHENTICATE = 'authenticate'
export const TRANSFER = 'transfer'
export const ADVTRANSFER = 'advTransfer'
+export const SIGNMESSAGE = 'signMessage'
export const SEND = 'send'
return retPromise;
};
+
+transaction.signMessage = function(message, password, address) {
+ return bytom.keys.signMessage(message, password,address);
+};
+
transaction.advancedTransfer = function(guid, transaction, password, arrayData) {
let retPromise = new Promise((resolve, reject) => {
bytom.transaction
}
},
{
+ path: '/signMessage',
+ name: 'sign-message',
+ meta: { title: '请求签名' },
+ component: resolve => {
+ require(['@/views/sendTransaction/signMessage.vue'], resolve)
+ }
+ },
+ {
path: '/received',
name: 'received',
meta: { title: '接收' },
--- /dev/null
+<style lang="" scoped>
+ .warp {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 600px;
+ z-index: 2;
+ overflow: scroll;
+ }
+ .header {
+ display: flex;
+ }
+ .header p{
+ text-align: center;
+ width: 280px;
+ padding-top: 17px;
+ }
+
+ .balance {
+ width: 280px;
+ height: 40px;
+ margin: 20px;
+ padding: 20px;
+ display: flex;
+ }
+ .balance .token-amount {
+ display: inline-block;
+ }
+ .balance .token-amount .asset {
+ font-size: 18px;
+ }
+ .small{
+ font-size: 12px;
+ }
+ .transfer-header{
+ background-image: url("../../assets/img/backgroundHead/transfer.svg");
+ background-size: 320px 80px;
+ }
+ .wallet{
+ width: 40px;
+ height: 40px;
+ background: rgba(255,255,255,0.1);
+ border-radius: 50%;
+ color: white;
+ margin-right: 20px;
+ line-height: 40px;
+ text-align: center;
+ }
+ .content {
+ margin: 20px;
+ padding: 20px;
+ overflow: hidden;
+ border-radius:4px;
+ width: 280px;
+ }
+ .divider {
+ margin: 12px 0;
+ }
+
+ .value .uint {
+ font-size: 12px;
+ margin-left: 3px;
+ }
+ .btn-inline .btn {
+ margin: 10px 15px;
+ }
+ .row{
+ word-break: break-all;
+ }
+ .col{
+ font-size: 14px;
+ width: 35%;
+ }
+ .label{
+ color: #7B7B7B;
+ }
+ .value{
+ color: #282828;
+ width: 60%;
+ }
+ table{
+ width: 100%;
+ }
+ .form-item{
+ padding:0;
+ margin:0;
+ margin-bottom: 10px;
+ }
+ .btn-container .btn{
+ height: 48px;
+ bottom: 20px;
+ position: absolute;
+ width: 320px;
+ }
+</style>
+
+<template>
+ <div class="warp bg-gray">
+ <section class="header bg-header">
+ <i class="iconfont icon-back" @click="close"></i>
+ <p>{{$t('signMessage.title')}}</p>
+ </section>
+
+ <section class="balance transfer-header">
+ <div class="wallet">
+ <i class="iconfont icon-wallet"></i>
+ </div>
+ <div>
+ <div class="token-amount">
+ {{account.balance}}
+ <span class="asset">BTM</span>
+ </div>
+ <div class="small color-grey">
+ {{account.alias}}
+ </div>
+ </div>
+ </section>
+
+ <section class="content bg-white">
+ <table>
+ <tbody>
+ <tr class="row">
+ <td class="col label">{{ $t('signMessage.address') }}</td>
+ <td class="col value">{{address}}</td>
+ </tr>
+
+ <div class="divider"></div>
+
+ <tr class="row">
+ <td class="col label">{{ $t('signMessage.message') }}</td>
+ <td class="col value">{{message}}</td>
+ </tr>
+ </tbody>
+ </table>
+ </section>
+ <section class="content bg-white">
+ <div class="form">
+ <div class="form-item">
+ <label class="form-item-label">{{ $t('transfer.confirmPassword') }}</label>
+ <div class="form-item-content">
+ <input type="password" v-model="password" autofocus>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ <div class="row btn-container" style="margin: 20px; position: static;">
+ <div class="btn bg-green" @click="sign">{{ $t('signMessage.confirmSignature') }}</div>
+ </div>
+
+ </div>
+</template>
+
+<script>
+import transaction from "@/models/transaction";
+import account from "@/models/account";
+import getLang from "@/assets/language/sdk";
+import { LocalStream } from 'extension-streams';
+
+export default {
+ data() {
+ return {
+ full: false,
+ accounts:{},
+ account: {},
+ address: '',
+ message: '',
+ password:''
+ };
+ },
+ computed: {
+ },
+ watch: {
+ },
+ methods: {
+ close: function () {
+ window.close();
+ },
+ sign: function () {
+ let loader = this.$loading.show({
+ container: null,
+ canCancel: true,
+ onCancel: this.onCancel
+ });
+
+ transaction.signMessage(this.message, this.password, this.address).then((resp) => {
+ loader.hide();
+ LocalStream.send({method:'sign-message',action:'success', message:resp});
+ this.$dialog.show({
+ type: 'success',
+ body: this.$t("transfer.success")
+ });
+ window.close();
+ }).catch(error => {
+ loader.hide();
+
+ this.$dialog.show({
+ body: getLang(error.message)
+ });
+ });
+ }
+ }, mounted() {
+ const object = this.$route.query
+ if(object.address !== undefined){
+ this.address = object.address
+ }
+ if(object.message !== undefined){
+ this.message = object.message
+ }
+
+ account.setupNet(localStorage.bytomNet);
+ account.list().then(accounts => {
+ const account = accounts.filter(a => a.address === this.address)[0]
+ this.account = account
+ });
+ }
+};
+</script>