package com.baidu.xuper;
import java.math.BigInteger;
import java.util.Arrays;
import com.baidu.xuper.Context;
import com.baidu.xuper.Contract;
import com.baidu.xuper.ContractMethod;
import com.baidu.xuper.Driver;
import com.baidu.xuper.Response;
/**
* Erc20
*
*/
public class Erc20 implements Contract
{
static final String BALANCEPRE = "balanceOf_";
static final String ALLOWANCEPRE = "allowanceOf_";
static final String MASTERPRE = "owner";
static final String TOTALSUPPLY = "totalSupply";
@Override
@ContractMethod
public Response initialize(Context ctx) {
String caller = ctx.caller();
if (caller.isEmpty()){
return Response.error("missing caller");
}
byte[] totalSupplyByte = ctx.args().get("totalSupply");
if (totalSupplyByte == null) {
return Response.error("missing totalSupply");
}
String totalSupplyStr = new String(totalSupplyByte);
BigInteger totalSupply = new BigInteger(totalSupplyStr);
if (totalSupply.signum() == -1) {
return Response.error("totalSupply must not be negative");
}
String balanceKey = BALANCEPRE + caller;
ctx.putObject(TOTALSUPPLY.getBytes(), totalSupply.toByteArray());
ctx.putObject(balanceKey.getBytes(), totalSupply.toByteArray());
ctx.putObject(MASTERPRE.getBytes(), caller.getBytes());
return Response.ok("initialize success".getBytes());
}
@ContractMethod
public Response mint(Context ctx) {
String caller = ctx.caller();
if (caller.isEmpty()){
return Response.error("missing caller");
}
byte[] ownerByte = ctx.getObject(MASTERPRE.getBytes());
if (ownerByte == null) {
return Response.error("no owner found");
}
if (!Arrays.equals(caller.getBytes(), ownerByte)){
return Response.error("only the person who created the contract can mint");
}
byte[] increaseSupplyByte = ctx.args().get("amount");
if (increaseSupplyByte == null) {
return Response.error("missing increaseSupply");
}
String increaseSupplyStr = new String(increaseSupplyByte);
BigInteger increaseSupply = new BigInteger(increaseSupplyStr);
if (increaseSupply.signum() == -1) {
return Response.error("amount must not be negative");
}
byte[] totalSupplyByte = ctx.getObject(TOTALSUPPLY.getBytes());
if (totalSupplyByte == null) {
return Response.error("no totalSupply found");
}
BigInteger totalSupply = new BigInteger(totalSupplyByte);
BigInteger totalSupplyNow = totalSupply.add(increaseSupply);
ctx.putObject(TOTALSUPPLY.getBytes(), totalSupplyNow.toByteArray());
String balanceKey = BALANCEPRE + caller;
byte[] callerBalanceByte = ctx.getObject(balanceKey.getBytes());
if (callerBalanceByte == null) {
return Response.error("no caller found");
}
BigInteger callerBalance = new BigInteger(callerBalanceByte);
BigInteger callerBalanceNow = callerBalance.add(increaseSupply);
ctx.putObject(balanceKey.getBytes(), callerBalanceNow.toByteArray());
return Response.ok("mint success".getBytes());
}
@ContractMethod
public Response totalSupply(Context ctx) {
byte[] value = ctx.getObject(TOTALSUPPLY.getBytes());
if (value == null) {
return Response.error("key TOTALSUPPLY not found)");
}
BigInteger totalSupply = new BigInteger(value);
return Response.ok(totalSupply.toString().getBytes());
}
@ContractMethod
public Response balance(Context ctx) {
byte[] accountByte = ctx.args().get("account");
if (accountByte == null) {
return Response.error("missing account");
}
String account = new String(accountByte);
String balanceKey = BALANCEPRE + account;
byte[] value = ctx.getObject(balanceKey.getBytes());
if (value == null) {
return Response.error("key " + account + " not found");
}
BigInteger balance = new BigInteger(value);
return Response.ok(balance.toString().getBytes());
}
@ContractMethod
public Response allowance(Context ctx) {
byte[] fromByte = ctx.args().get("from");
if (fromByte == null) {
return Response.error("missing from");
}
String from = new String(fromByte);
byte[] toByte = ctx.args().get("to");
if (toByte == null) {
return Response.error("missing to");
}
String to = new String(toByte);
String allowanceKey = ALLOWANCEPRE + from + "_" + to;
byte[] value = ctx.getObject(allowanceKey.getBytes());
if (value == null) {
return Response.error("key " + allowanceKey + " not found");
}
BigInteger allowance = new BigInteger(value);
return Response.ok(allowance.toString().getBytes());
}
@ContractMethod
public Response owner(Context ctx) {
byte[] ownerByte = ctx.getObject(MASTERPRE.getBytes());
if (ownerByte == null) {
return Response.error("no owner found");
}
return Response.ok(ownerByte);
}
@ContractMethod
public Response transfer(Context ctx) {
String from = ctx.caller();
if (from.isEmpty()){
return Response.error("missing from");
}
byte[] toByte = ctx.args().get("to");
if (toByte == null) {
return Response.error("missing to");
}
String to = new String(toByte);
byte[] tokenByte = ctx.args().get("token");
if (tokenByte == null) {
return Response.error("missing token");
}
String tokenAmountStr = new String(tokenByte);
BigInteger tokenAmount = new BigInteger(tokenAmountStr);
if (tokenAmount.signum() == -1) {
return Response.error("token must not be negative");
}
String fromKey = BALANCEPRE + from;
byte[] fromBalanceByte = ctx.getObject(fromKey.getBytes());
if (fromBalanceByte == null) {
return Response.error("no from found");
}
BigInteger fromBalance = new BigInteger(fromBalanceByte);
if (fromBalance.compareTo(tokenAmount) == -1){
return Response.error("no enough balance");
}
String toKey = BALANCEPRE + to;
byte[] toBalanceByte = ctx.getObject(toKey.getBytes());
BigInteger toBalance;
if (toBalanceByte == null) {
toBalance = BigInteger.valueOf(0);
} else {
toBalance = new BigInteger(toBalanceByte);
}
BigInteger fromBalanceNow = fromBalance.subtract(tokenAmount);
BigInteger toBalanceNow = toBalance.add(tokenAmount);
ctx.putObject(fromKey.getBytes(), fromBalanceNow.toByteArray());
ctx.putObject(toKey.getBytes(), toBalanceNow.toByteArray());
return Response.ok("transfer success".getBytes());
}
@ContractMethod
public Response transferFrom(Context ctx) {
String caller = ctx.caller();
if (caller.isEmpty()){
return Response.error("missing caller");
}
byte[] fromByte = ctx.args().get("from");
if (fromByte == null) {
return Response.error("missing from");
}
String from = new String(fromByte);
byte[] toByte = ctx.args().get("to");
if (toByte == null) {
return Response.error("missing to");
}
String to = new String(toByte);
byte[] tokenByte = ctx.args().get("token");
if (tokenByte == null) {
return Response.error("missing token");
}
String tokenAmountStr = new String(tokenByte);
BigInteger tokenAmount = new BigInteger(tokenAmountStr);
if (toke
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
该项目为XuperChain底层区块链技术的核心源码,采用C++语言编写,并融入Go、C、JavaScript、Java、Shell、Python等多种编程语言,共计980个文件,其中C++源文件101个,Go源文件535个。该源码涵盖了区块链的各个层次,适用于需要深度定制和优化区块链底层架构的开发者。
资源推荐
资源详情
资源评论
收起资源包目录
基于C++核心语言的XuperChain底层区块链技术设计源码 (971个子文件)
address 33B
address 33B
abi_test.bin 34KB
xvm.c 10KB
sum.c 8KB
wasm2c.include.c 7KB
opcode-code-table.c 1KB
resolver.c 501B
malloc.c 164B
extern_func.c 124B
add.c 99B
trap.c 98B
contract.pb.cc 483KB
relayer.pb.cc 286KB
wast-lexer-gen.cc 282KB
wast-lexer-gen.cc 282KB
interp.cc 101KB
binary-reader.cc 78KB
wast-parser.cc 72KB
c-writer.cc 69KB
tf.pb.cc 66KB
binary-reader-interp.cc 60KB
binary-reader-objdump.cc 55KB
wat-writer.cc 53KB
xrc01.pb.cc 53KB
validator.cc 50KB
spectest-interp.cc 41KB
binary-reader-ir.cc 40KB
binary-writer.cc 39KB
binary-reader-logging.cc 30KB
xuper_relayer.cc 26KB
interp-trace.cc 23KB
paillier.pb.cc 22KB
type-checker.cc 22KB
data_auth.pb.cc 21KB
interp-disassemble.cc 19KB
literal.cc 19KB
xrc01.cc 17KB
binary-writer-spec.cc 16KB
ir.cc 16KB
resolve-names.cc 16KB
charity_demo.cc 13KB
generate-names.cc 13KB
anchor.pb.cc 13KB
xrc01_exemple.cc 13KB
apply-names.cc 13KB
emscripten-helpers.cc 13KB
data_auth.cc 12KB
award_manage.cc 12KB
opcode.cc 11KB
expr-visitor.cc 11KB
option-parser.cc 9KB
leb128.cc 9KB
game_assets.cc 9KB
paillier.cc 8KB
unified_check.cc 8KB
binary-reader-opcnt.cc 8KB
xpoa_validates.cc 8KB
erc20.cc 8KB
stream.cc 8KB
wasm-interp.cc 7KB
gas.cc 6KB
string-view.cc 6KB
trust_operators.cc 6KB
source_trace.cc 6KB
wasm-opcodecnt.cc 6KB
wat2wasm.cc 5KB
context_impl.cc 5KB
group_chain.cc 5KB
trust_counter.cc 5KB
wasm2wat.cc 5KB
luck_draw.cc 5KB
wasm2c.cc 5KB
wast2json.cc 5KB
lexer-source-line-finder.cc 5KB
wasm-objdump.cc 5KB
naming.cc 4KB
score_record.cc 4KB
move.cc 4KB
error-formatter.cc 4KB
wat-desugar.cc 4KB
token.cc 4KB
short_content.cc 4KB
hash_deposit.cc 3KB
common.cc 3KB
wasm-strip.cc 3KB
wasm-validate.cc 3KB
anchor.cc 3KB
utf8.cc 3KB
builtin_types.cc 3KB
binding-hash.cc 3KB
identity.cc 3KB
features.cc 2KB
crypto.cc 2KB
basic_iterator.cc 2KB
lexer-source.cc 2KB
syscall.cc 2KB
color.cc 2KB
filenames.cc 2KB
config.cc 1KB
共 971 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
lsx202406
- 粉丝: 1919
- 资源: 5459
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功