Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
5ea2ab87
Y
YTBP
项目概览
YottaChain
/
YTBP
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YTBP
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
5ea2ab87
编写于
5月 03, 2018
作者:
K
Khaled Al-Hassanieh
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix for #2322 - decimal digits count in transfer input
上级
20b1d5e3
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
74 addition
and
1 deletion
+74
-1
contracts/eosio.token/eosio.token.cpp
contracts/eosio.token/eosio.token.cpp
+3
-0
contracts/eosiolib/asset.hpp
contracts/eosiolib/asset.hpp
+12
-0
unittests/currency_tests.cpp
unittests/currency_tests.cpp
+59
-1
未找到文件。
contracts/eosio.token/eosio.token.cpp
浏览文件 @
5ea2ab87
...
...
@@ -75,6 +75,9 @@ void token::transfer( account_name from,
require_recipient
(
from
);
require_recipient
(
to
);
if
(
quantity
.
symbol
.
precision
()
!=
st
.
supply
.
symbol
.
precision
()
)
quantity
.
adjust_precision
(
st
.
supply
.
symbol
);
eosio_assert
(
quantity
.
is_valid
(),
"invalid quantity"
);
eosio_assert
(
quantity
.
amount
>
0
,
"must transfer positive quantity"
);
...
...
contracts/eosiolib/asset.hpp
浏览文件 @
5ea2ab87
...
...
@@ -251,6 +251,18 @@ namespace eosio {
symbol
.
print
(
false
);
}
void
adjust_precision
(
const
symbol_type
&
ref_sym
)
{
eosio_assert
(
this
->
symbol
.
name
()
==
ref_sym
.
name
(),
"comparison of symbols with different names is not allowed"
);
if
(
this
->
symbol
.
precision
()
==
ref_sym
.
precision
())
return
;
eosio_assert
(
ref_sym
.
precision
()
>=
this
->
symbol
.
precision
(),
"asset symbol has higher precision than expected"
);
for
(
uint8_t
i
=
0
;
i
<
ref_sym
.
precision
()
-
this
->
symbol
.
precision
();
++
i
)
{
printi
(
amount
);
this
->
amount
*=
10
;
}
this
->
symbol
.
value
=
ref_sym
.
value
;
}
EOSLIB_SERIALIZE
(
asset
,
(
amount
)(
symbol
)
)
};
...
...
unittests/currency_tests.cpp
浏览文件 @
5ea2ab87
...
...
@@ -52,7 +52,17 @@ class currency_tester : public TESTER {
return
get_currency_balance
(
N
(
eosio
.
token
),
symbol
(
SY
(
4
,
CUR
)),
account
);
}
auto
transfer
(
const
account_name
&
from
,
const
account_name
&
to
,
const
std
::
string
&
quantity
,
const
std
::
string
&
memo
=
""
)
{
auto
trace
=
push_action
(
from
,
N
(
transfer
),
mutable_variant_object
()
(
"from"
,
from
)
(
"to"
,
to
)
(
"quantity"
,
quantity
)
(
"memo"
,
memo
)
);
produce_block
();
return
trace
;
}
currency_tester
()
:
TESTER
(),
abi_ser
(
json
::
from_string
(
eosio_token_abi
).
as
<
abi_def
>
())
{
...
...
@@ -523,4 +533,52 @@ BOOST_FIXTURE_TEST_CASE( test_deferred_failure, currency_tester ) try {
}
FC_LOG_AND_RETHROW
()
/// test_currency
BOOST_FIXTURE_TEST_CASE
(
test_input_quantity
,
currency_tester
)
try
{
produce_blocks
(
2
);
create_accounts
(
{
N
(
alice
),
N
(
bob
),
N
(
carl
)}
);
// transfer to alice using right precision
{
auto
trace
=
transfer
(
eosio_token
,
N
(
alice
),
"100.0000 CUR"
);
BOOST_CHECK_EQUAL
(
true
,
chain_has_transaction
(
trace
->
id
));
BOOST_CHECK_EQUAL
(
asset
::
from_string
(
"100.0000 CUR"
),
get_balance
(
N
(
alice
)));
BOOST_CHECK_EQUAL
(
1000000
,
get_balance
(
N
(
alice
)).
amount
);
}
// transfer from alice to bob using no decimal point
{
auto
trace
=
transfer
(
N
(
alice
),
N
(
bob
),
"13 CUR"
);
BOOST_CHECK_EQUAL
(
true
,
chain_has_transaction
(
trace
->
id
));
BOOST_CHECK_EQUAL
(
asset
::
from_string
(
"13.0000 CUR"
),
get_balance
(
N
(
bob
)));
BOOST_CHECK_EQUAL
(
asset
::
from_string
(
"87.0000 CUR"
),
get_balance
(
N
(
alice
)));
}
// transfer from bob to carl using lower precision
{
auto
trace
=
transfer
(
N
(
bob
),
N
(
carl
),
"2.01 CUR"
);
BOOST_CHECK_EQUAL
(
true
,
chain_has_transaction
(
trace
->
id
));
BOOST_CHECK_EQUAL
(
asset
::
from_string
(
"2.0100 CUR"
),
get_balance
(
N
(
carl
)));
BOOST_CHECK_EQUAL
(
asset
::
from_string
(
"10.9900 CUR"
),
get_balance
(
N
(
bob
)));
}
// transfer using higher precision fails
{
BOOST_REQUIRE_EXCEPTION
(
transfer
(
N
(
alice
),
N
(
carl
),
"5.34567 CUR"
),
assert_exception
,
[](
const
assert_exception
&
e
)
->
bool
{
return
e
.
get_log
().
at
(
0
).
get_message
()
==
"condition: assertion failed: asset symbol has higher precision than expected"
;
});
}
// transfer using different symbol name fails
{
BOOST_REQUIRE_THROW
(
transfer
(
N
(
alice
),
N
(
carl
),
"20.50 USD"
),
assert_exception
);
}
}
FC_LOG_AND_RETHROW
()
/// test_currency
BOOST_AUTO_TEST_SUITE_END
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录