diff --git a/sql/2016-05-23-bookmarks.sql b/sql/2016-05-23-bookmarks.sql
new file mode 100644
index 0000000..ab5ab19
--- /dev/null
+++ b/sql/2016-05-23-bookmarks.sql
@@ -0,0 +1,18 @@
+-- Recent additions to add after db init (.gz)
+-- mysql yaamp -p < file.sql
+
+CREATE TABLE `bookmarks` (
+ `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ `idcoin` int(11) NOT NULL,
+ `label` varchar(32) NULL,
+ `address` varchar(128) NOT NULL,
+ `lastused` int(10) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- KEYS
+
+ALTER TABLE `bookmarks`
+ ADD KEY `bookmarks_coin` (`idcoin`);
+
+ALTER TABLE `bookmarks` ADD CONSTRAINT fk_bookmarks_coin FOREIGN KEY (`idcoin`)
+ REFERENCES coins (`id`) ON DELETE CASCADE;
diff --git a/web/yaamp/models/db_bookmarksModel.php b/web/yaamp/models/db_bookmarksModel.php
new file mode 100644
index 0000000..7443f84
--- /dev/null
+++ b/web/yaamp/models/db_bookmarksModel.php
@@ -0,0 +1,33 @@
+admin) return;
$market = getdbo('db_markets', getiparam('id'));
+ if(!$market) {
+ user()->setFlash('error', "invalid market");
+ $this->goback();
+ return;
+ }
$coin = getdbo('db_coins', $market->coinid);
if(isset($_POST['db_markets']))
@@ -46,6 +51,11 @@ class MarketController extends CommonController
if(!$this->admin) return;
$market = getdbo('db_markets', getiparam('id'));
+ if(!$market) {
+ user()->setFlash('error', "invalid market");
+ $this->goback();
+ return;
+ }
$coin = getdbo('db_coins', $market->coinid);
$amount = getparam('amount');
@@ -72,6 +82,9 @@ class MarketController extends CommonController
{
user()->setFlash('error', $remote->error);
$this->redirect(array('site/coin', 'id'=>$coin->id));
+ } else {
+ $market->lastsent = time();
+ $market->save();
}
$exchange = new db_exchange;
diff --git a/web/yaamp/modules/site/SiteController.php b/web/yaamp/modules/site/SiteController.php
index 5dbaa6c..ad01f8a 100644
--- a/web/yaamp/modules/site/SiteController.php
+++ b/web/yaamp/modules/site/SiteController.php
@@ -172,6 +172,94 @@ class SiteController extends CommonController
/////////////////////////////////////////////////
+ public function actionBookmarkAdd()
+ {
+ if(!$this->admin) return;
+ $coin = getdbo('db_coins', getiparam('id'));
+ if ($coin) {
+ $bookmark = new db_bookmarks;
+ $bookmark->isNewRecord = true;
+ $bookmark->idcoin = $coin->id;
+ if (isset($_POST['db_bookmarks'])) {
+ $bookmark->setAttributes($_POST['db_bookmarks'], false);
+ if($bookmark->save())
+ $this->redirect(array('/site/coin', 'id'=>$coin->id));
+ }
+ $this->render('bookmark', array('bookmark'=>$bookmark, 'coin'=>$coin));
+ } else {
+ $this->goback();
+ }
+ }
+
+ public function actionBookmarkDel()
+ {
+ if(!$this->admin) return;
+ $bookmark = getdbo('db_bookmarks', getiparam('id'));
+ if ($bookmark) {
+ $bookmark->delete();
+ }
+ $this->goback();
+ }
+
+ public function actionBookmarkEdit()
+ {
+ if(!$this->admin) return;
+ $bookmark = getdbo('db_bookmarks', getiparam('id'));
+ if($bookmark) {
+ $coin = getdbo('db_coins', $bookmark->idcoin);
+ if ($coin && isset($_POST['db_bookmarks'])) {
+ $bookmark->setAttributes($_POST['db_bookmarks'], false);
+ if($bookmark->save())
+ $this->redirect(array('/site/coin', 'id'=>$coin->id));
+ }
+ $this->render('bookmark', array('bookmark'=>$bookmark, 'coin'=>$coin));
+ } else {
+ user()->setFlash('error', "invalid bookmark");
+ $this->goback();
+ }
+ }
+
+ public function actionBookmarkSend()
+ {
+ if(!$this->admin) return;
+
+ $bookmark = getdbo('db_bookmarks', getiparam('id'));
+ if($bookmark) {
+ $coin = getdbo('db_coins', $bookmark->idcoin);
+ $amount = getparam('amount');
+
+ $remote = new Bitcoin($coin->rpcuser, $coin->rpcpasswd, $coin->rpchost, $coin->rpcport);
+
+ $info = $remote->getinfo();
+ if(!$info || !$info['balance']) return false;
+
+ $deposit_info = $remote->validateaddress($bookmark->address);
+ if(!$deposit_info || !isset($deposit_info['isvalid']) || !$deposit_info['isvalid']) {
+ user()->setFlash('error', "invalid address for {$coin->name}, {$bookmark->address}");
+ $this->redirect(array('site/coin', 'id'=>$coin->id));
+ }
+
+ $amount = min($amount, $info['balance'] - $info['paytxfee']);
+ $amount = round($amount, 8);
+
+ $tx = $remote->sendtoaddress($bookmark->address, $amount);
+ if(!$tx) {
+ debuglog("unable to send $amount {$coin->symbol} to bookmark {$bookmark->address}");
+ debuglog($remote->error);
+ user()->setFlash('error', $remote->error);
+ $this->redirect(array('site/coin', 'id'=>$coin->id));
+ } else {
+ debuglog("sent $amount {$coin->symbol} to bookmark {$bookmark->address}");
+ $bookmark->lastused = time();
+ $bookmark->save();
+ }
+ }
+
+ $this->redirect(array('site/coin', 'id'=>$coin->id));
+ }
+
+ /////////////////////////////////////////////////
+
public function actionConsole()
{
if(!$this->admin) return;
diff --git a/web/yaamp/modules/site/bookmark.php b/web/yaamp/modules/site/bookmark.php
new file mode 100644
index 0000000..03b8cb6
--- /dev/null
+++ b/web/yaamp/modules/site/bookmark.php
@@ -0,0 +1,28 @@
+id}'>{$coin->name} ";
+echo "Bookmark: $bookmark->label
";
+
+$this->widget('UniForm');
+
+echo CUFHtml::beginForm();
+echo CUFHtml::errorSummary($bookmark);
+echo CUFHtml::openTag('fieldset', array('class'=>'inlineLabels'));
+
+echo CUFHtml::openActiveCtrlHolder($bookmark, 'label');
+echo CUFHtml::activeLabelEx($bookmark, 'label');
+echo CUFHtml::activeTextField($bookmark, 'label', array('maxlength'=>32));
+echo "
.
"; +echo CUFHtml::closeCtrlHolder(); + +echo CUFHtml::openActiveCtrlHolder($bookmark, 'address'); +echo CUFHtml::activeLabelEx($bookmark, 'address'); +echo CUFHtml::activeTextField($bookmark, 'address', array('maxlength'=>128)); +echo ".
"; +echo CUFHtml::closeCtrlHolder(); + +echo CUFHtml::closeTag('fieldset'); +showSubmitButton('Save'); +echo CUFHtml::endForm(); diff --git a/web/yaamp/modules/site/coin.php b/web/yaamp/modules/site/coin.php index 02939b5..1a9ecc3 100644 --- a/web/yaamp/modules/site/coin.php +++ b/web/yaamp/modules/site/coin.php @@ -114,7 +114,7 @@ function main_error() main_timeout = setTimeout(main_refresh, main_delay*2); } -function showSellAmountDialog(marketid, marketname, address) +function showSellAmountDialog(marketname, address, marketid, bookmarkid) { $("#dlgaddr").html(address); $("#sell-amount-dialog").dialog( @@ -130,7 +130,10 @@ function showSellAmountDialog(marketid, marketname, address) "Send / Sell": function() { amount = $('#input_sell_amount').val(); - window.location.href = '/market/sellto?id='+marketid+'&amount='+amount; + if (marketid > 0) + window.location.href = '/market/sellto?id='+marketid+'&amount='+amount; + else + window.location.href = '/site/bookmarkSend?id='+bookmarkid+'&amount='+amount; }, } }); diff --git a/web/yaamp/modules/site/coin_results.php b/web/yaamp/modules/site/coin_results.php index 3e26edc..450002c 100644 --- a/web/yaamp/modules/site/coin_results.php +++ b/web/yaamp/modules/site/coin_results.php @@ -34,6 +34,8 @@ echo ", ".CHtml::link($reserved1, "/site/payments?id=".$coin->id)." $symbol clea ////////////////////////////////////////////////////////////////////////////////////// +$bookmarkAdd = CHtml::link('+', "/site/bookmarkAdd?id=".$coin->id, array('title'=>'Add a bookmark')); + echo <<Late | Message | -Actions | +{$bookmarkAdd} Actions | end; @@ -84,7 +86,7 @@ foreach($list as $market) echo CHtml::link( YAAMP_ALLOW_EXCHANGE ? "sell" : "send", "javascript:;", array( - 'onclick'=>"return showSellAmountDialog({$market->id}, $name, $addr);" + 'onclick'=>"return showSellAmountDialog($name, $addr, {$market->id});" ) ); echo ' '.$market->deposit_address; @@ -120,6 +122,49 @@ foreach($list as $market) echo ""; } +// in the list after the markets, made for quick send between wallets +$list = getdbolist('db_bookmarks', "idcoin={$coin->id} ORDER BY lastused DESC"); + +foreach($list as $bookmark) +{ + echo '|||||||
---|---|---|---|---|---|---|---|---|---|---|
'.$bookmark->label.' | '; + echo ''; + echo ' | '; + + echo ' | '; + if (!empty($bookmark->address)) { + $name = CJavaScript::encode($bookmark->label); + $addr = CJavaScript::encode($bookmark->address); + echo CHtml::link( + "send", + "javascript:;", array( + 'onclick'=>"return showSellAmountDialog($name, $addr, 0, {$bookmark->id});" + ) + ); + echo ' '.$bookmark->address; + } + echo ' edit'; + echo ' | '; + + echo ''; + echo ' | '; + + $sent = datetoa2($bookmark->lastused); + echo ' | '.(empty($sent) ? "" : "$sent ago").' | '; + echo ''; + echo ' | '; + + echo ' | '; + + echo ' | '; + echo 'delete'; + echo ' | '; + + echo "