Skip to content

Commit 50946aa

Browse files
authored
Merge pull request #61 from WeBankBlockchain/dev
智能合约代码贡献第二期
2 parents 1420c93 + a8a05a1 commit 50946aa

File tree

153 files changed

+6398
-88
lines changed

Some content is hidden

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

153 files changed

+6398
-88
lines changed

.gitignore

100644100755
File mode changed.

LICENSE

100644100755
File mode changed.

README.md

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
| 依赖软件 | 说明 |备注|
1313
| --- | --- | --- |
14-
| Solidity | 0.4.25 | |
14+
| Solidity | 0.4.25-0.6.10 | |
1515
| Git | 下载需要使用Git | |
1616

1717
## 文档

contracts/base_type/BasicDemo.sol

100644100755
File mode changed.

contracts/base_type/LibAddress.sol

100644100755
File mode changed.

contracts/base_type/LibConverter.sol

100644100755
File mode changed.
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
pragma solidity^0.4.25;
2+
import "./LibSafeMathForUint256Utils.sol";
3+
4+
library LibSafeMathForFloatUtils {
5+
using LibSafeMathForUint256Utils for uint256;
6+
7+
/*
8+
fmul:浮点数乘法
9+
a:被乘数
10+
dA:被乘数a的精度,若a = 1234,dA=2,实际表示浮点型数为12.34
11+
b:乘数
12+
dB:乘数的精度
13+
返回值:乘法后的结果,精度值(以被乘数精度为准)
14+
100.01 * 100.01 = 10000.0001 => 10000.00
15+
*/
16+
function fmul(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
17+
decimals = dA;
18+
c = a.mul(b).div(10 ** uint256(dB));
19+
}
20+
21+
/*
22+
fdiv:浮点数除法
23+
a:被除数
24+
dA:被除数a的精度,若a = 1234,decimalsA=2,实际表示浮点型数为12.34
25+
b:除数
26+
dB:除数的精度
27+
返回值:除法后的结果,精度值(以被除数精度为准)
28+
10000.00 / 100.00 = 100.00
29+
*/
30+
function fdiv(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
31+
decimals = dA;
32+
if(dA == dB) {
33+
c = a.mul(10 ** uint256(dA)).div(b);
34+
}
35+
else if(dA > dB) {
36+
//第一个参数精度更大
37+
b = b.mul(10 **uint256(dA - dB) );
38+
c = a.mul(10 ** uint256(dA)).div(b);
39+
} else {
40+
//第2个参数精度更大
41+
b = b.div(10 ** uint256(dB - dA) );
42+
c = a.mul(10 ** uint256(dA)).div(b);
43+
}
44+
}
45+
46+
/*
47+
fadd:浮点数加法
48+
a:加数a
49+
dA:加数a的精度,若a = 1234,decimalsA=2,实际表示浮点型数为12.34
50+
b:加数b
51+
dB:加数b的精度
52+
返回值:加法后的结果,精度值(以第1个参数精度为准)
53+
*/
54+
function fadd(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
55+
decimals = dA;
56+
if(dA == dB) {
57+
c = a.add(b);
58+
}
59+
else if(dA > dB) {
60+
//第一个参数精度更大
61+
b = b.mul(10 **uint256(dA - dB) );
62+
c = a.add(b);
63+
} else {
64+
//第2个参数精度更大
65+
b = b.div(10 ** uint256(dB - dA) );
66+
c = a.add(b);
67+
}
68+
}
69+
70+
/*
71+
fsub:浮点数减法
72+
a:被减数
73+
dA:被减数a的精度,若a = 1234,decimalsA=2,实际表示浮点型数为12.34
74+
b:减数
75+
dB:减数b的精度
76+
返回值:减法后的结果,精度值(以第1个参数精度为准)
77+
*/
78+
function fsub(uint256 a, uint8 dA, uint256 b, uint8 dB) internal pure returns (uint256 c, uint8 decimals) {
79+
decimals = dA;
80+
if(dA == dB) {
81+
c = a.sub(b);
82+
} else if (dA > dB) {
83+
c = a.sub(b.mul(10 ** uint256(dA - dB)));
84+
} else {
85+
c = a.sub(b.div(10 ** uint256(dB - dA)));
86+
}
87+
88+
}
89+
90+
91+
}
92+
93+
94+

contracts/base_type/LibSafeMathForUint256Utils.sol

100644100755
File mode changed.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
pragma solidity ^0.4.25;
2+
/**
3+
* @author wpzczbyqy <[email protected]>
4+
* @title uint256类型 二维数组操作
5+
* 提供二维数组的操作,增加新元素,删除元素,修改值,查找值,合并扩展数组等
6+
**/
7+
8+
library Lib2DArrayForUint256 {
9+
/**
10+
*@dev 二维数组中增加一个数组元素
11+
*@param array uint256类型二维数组
12+
*@param value uint256类型一维数组
13+
**/
14+
function addValue(uint256[][] storage array,uint256[] value) internal{
15+
require(value.length > 0, "Empty Array: can not add empty array");
16+
array.push(value);
17+
}
18+
19+
/**
20+
*@dev 查找二维数组中指定位置的值
21+
*@param array uint256类型二维数组
22+
*@param row 值所在的行
23+
*@param col 值所在的列
24+
*@return uint256 返回查找的值
25+
**/
26+
function getValue(uint256[][] storage array, uint256 row, uint256 col) internal returns (uint256) {
27+
if(array.length == 0){
28+
return 0;
29+
}
30+
require(row < array.length,"Row: index out of bounds");
31+
require(col < array[row].length, "Col: index out of bounds");
32+
return array[row][col];
33+
}
34+
35+
/**
36+
*@dev 修改二维数组中指定位置的值
37+
*@param array uint256类型二维数组
38+
*@param row 值所在的行
39+
*@param col 值所在的列
40+
*@param val 修改指定位置的值为val
41+
*@return uint256[][] 返回修改后的数组
42+
**/
43+
function setValue(uint256[][] storage array, uint256 row, uint256 col, uint256 val) internal returns (uint256[][]) {
44+
if(array.length == 0){
45+
return;
46+
}
47+
48+
require(row < array.length,"Row: index out of bounds");
49+
require(col < array[row].length, "Col: index out of bounds");
50+
array[row][col] = val;
51+
return array;
52+
}
53+
54+
/**
55+
*@dev 修改二维数组中指定位置的值
56+
*@param array uint256类型二维数组
57+
*@param row 值所在的行
58+
*@param col 值所在的列
59+
*@param val 修改指定位置的值为val
60+
*@return uint256[][] 返回修改后的数组
61+
**/
62+
function firstIndexOf(uint256[][] storage array, uint256 val) internal returns (bool, uint256, uint256) {
63+
uint256 row;
64+
uint256 col;
65+
if (array.length == 0) {
66+
return (false, 0, 0);
67+
}
68+
for(uint256 i = 0; i < array.length; i++) {
69+
for(uint256 j = 0; j < array[i].length; j++) {
70+
if(array[i][j] == val){
71+
row = i;
72+
col = j;
73+
return (true, row, col);
74+
}
75+
}
76+
}
77+
return (false, 0, 0);
78+
}
79+
80+
/**
81+
*@dev 删除二维数组中的某个数组元素
82+
*@param array uint256类型二维数组
83+
*@param index 删除第index个数组元素
84+
*@return uint256[][] 返回修改后的数组
85+
**/
86+
function removeByIndex(uint256[][] storage array, uint256 index) internal returns(uint256[][]) {
87+
require(index < array.length, "Index: index out of bounds");
88+
delete array[index];
89+
90+
while(index < array.length -1) {
91+
delete array[index];
92+
for(uint256 i = 0; i < array[index + 1].length; i++){
93+
array[index].push(array[index + 1][i]);
94+
}
95+
index++;
96+
}
97+
array.length--;
98+
return array;
99+
}
100+
101+
/**
102+
*@dev 合并两个二维数组
103+
*@param array1 uint256类型二维数组
104+
*@param array2 uint256类型二维数组
105+
*@return uint256[][] 返回合并后的数组
106+
**/
107+
function extend(uint256[][] storage array1, uint256[][] storage array2) internal returns(uint256[][]){
108+
require(array2.length > 0, "Extend: can not extend empty array");
109+
110+
for(uint256 i = 0; i < array2.length; i++){
111+
array1.push(array2[i]);
112+
}
113+
return array1;
114+
}
115+
}

0 commit comments

Comments
 (0)