diff --git a/icon/icmodule/revision.go b/icon/icmodule/revision.go index 3fd68c878..6eb472229 100644 --- a/icon/icmodule/revision.go +++ b/icon/icmodule/revision.go @@ -45,6 +45,7 @@ const ( Revision23 Revision24 Revision25 + Revision26 RevisionReserved ) @@ -120,6 +121,8 @@ const ( RevisionChainScoreEventLog = Revision24 RevisionIISS4R1 = Revision25 + + RevisionFixIssueRegulator = Revision26 ) var revisionFlags []module.Revision diff --git a/icon/iiss/eventlog.go b/icon/iiss/eventlog.go index 90262feda..95e6cb121 100644 --- a/icon/iiss/eventlog.go +++ b/icon/iiss/eventlog.go @@ -41,6 +41,7 @@ const ( EventPRepRegistered = "PRepRegistered(Address)" EventPRepSet = "PRepSet(Address)" EventRewardFundTransferred = "RewardFundTransferred(str,Address,Address,int)" + EventRewardFundTransferFailed = "RewardFundTransferFailed(str,Address,Address,int)" EventRewardFundBurned = "RewardFundBurned(str,Address,int)" EventPRepUnregistered = "PRepUnregistered(Address)" EventBTPNetworkTypeActivated = "BTPNetworkTypeActivated(str,int)" @@ -218,6 +219,18 @@ func EmitRewardFundTransferredEvent(cc icmodule.CallContext, key string, from, t ) } +func EmitRewardFundTransferFailedEvent(cc icmodule.CallContext, key string, from, to module.Address, amount *big.Int) { + cc.OnEvent(state.SystemAddress, + [][]byte{[]byte(EventRewardFundTransferFailed)}, + [][]byte{ + []byte(key), + from.Bytes(), + to.Bytes(), + intconv.BigIntToBytes(amount), + }, + ) +} + func EmitRewardFundBurnedEvent(cc icmodule.CallContext, key string, from module.Address, amount *big.Int) { cc.OnEvent(state.SystemAddress, [][]byte{[]byte(EventRewardFundBurned)}, diff --git a/icon/iiss/extension.go b/icon/iiss/extension.go index 631c0c31d..0eb554b39 100644 --- a/icon/iiss/extension.go +++ b/icon/iiss/extension.go @@ -927,19 +927,39 @@ func (es *ExtensionStateImpl) regulateIssue(iScore *big.Int) error { return err } reward := new(big.Int).Set(iScore) - if prevGlobal != nil && icstate.IISSVersion3 == prevGlobal.GetIISSVersion() { - pg := prevGlobal.GetV2() - multiplier := big.NewInt(int64(prevGlobal.GetTermPeriod() * icmodule.IScoreICXRatio)) - divider := big.NewInt(icmodule.MonthBlock * icmodule.DenomInRate) - rewardCPS := new(big.Int).Mul(pg.GetIGlobal(), pg.GetICps().NumBigInt()) - rewardCPS.Mul(rewardCPS, multiplier) - rewardCPS.Div(rewardCPS, divider) - reward.Add(reward, rewardCPS) - rewardRelay := new(big.Int).Mul(pg.GetIGlobal(), pg.GetIRelay().NumBigInt()) - rewardRelay.Mul(rewardRelay, multiplier) - rewardRelay.Div(rewardRelay, divider) - reward.Add(reward, rewardRelay) - es.logger.Tracef("regulateIssue with cps: %d, relay: %d", rewardCPS, rewardRelay) + if prevGlobal != nil { + switch prevGlobal.GetIISSVersion() { + case icstate.IISSVersion2: + case icstate.IISSVersion3: + pg := prevGlobal.GetV2() + multiplier := big.NewInt(int64(prevGlobal.GetTermPeriod() * icmodule.IScoreICXRatio)) + divider := big.NewInt(icmodule.MonthBlock * icmodule.DenomInRate) + rewardCPS := new(big.Int).Mul(pg.GetIGlobal(), pg.GetICps().NumBigInt()) + rewardCPS.Mul(rewardCPS, multiplier) + rewardCPS.Div(rewardCPS, divider) + reward.Add(reward, rewardCPS) + rewardRelay := new(big.Int).Mul(pg.GetIGlobal(), pg.GetIRelay().NumBigInt()) + rewardRelay.Mul(rewardRelay, multiplier) + rewardRelay.Div(rewardRelay, divider) + reward.Add(reward, rewardRelay) + es.logger.Tracef("regulateIssue with cps: %d, relay: %d", rewardCPS, rewardRelay) + case icstate.IISSVersion4: + if term.Revision() >= icmodule.RevisionFixIssueRegulator { + pg := prevGlobal.GetV3() + multiplier := big.NewInt(int64(pg.GetTermPeriod() * icmodule.IScoreICXRatio)) + + keys := []icstate.RFundKey{icstate.KeyIcps, icstate.KeyIrelay} + for _, key := range keys { + amount := pg.GetRewardFundAmountByKey(key) + amount.Mul(amount, multiplier) + amount.Div(amount, big.NewInt(icmodule.MonthBlock)) + reward.Add(reward, amount) + es.logger.Tracef("regulateIssue with %s: %s", key, amount) + } + } + default: + panic("regulateIssue: unknown IISS version") + } } is, err := es.State.GetIssue() @@ -1703,9 +1723,10 @@ func (es *ExtensionStateImpl) transferRewardFund(cc icmodule.CallContext) error amount.Div(amount, div) if ok { if err := cc.Transfer(from, to, amount, module.Reward); err != nil { - return err + EmitRewardFundTransferFailedEvent(cc, k.key, from, to, amount) + } else { + EmitRewardFundTransferredEvent(cc, k.key, from, to, amount) } - EmitRewardFundTransferredEvent(cc, k.key, from, to, amount) } else { if cc.Revision().Value() >= icmodule.RevisionFixTransferRewardFund { if err := cc.Withdraw(from, amount, module.Burn); err != nil { diff --git a/icon/revision.go b/icon/revision.go index 255953707..97f562d09 100644 --- a/icon/revision.go +++ b/icon/revision.go @@ -17,6 +17,9 @@ package icon import ( + "math/big" + + "github.com/icon-project/goloop/common" "github.com/icon-project/goloop/icon/icmodule" "github.com/icon-project/goloop/icon/iiss" "github.com/icon-project/goloop/icon/iiss/icstate" @@ -42,6 +45,7 @@ var revHandlerTable = []revHandlerItem{ {icmodule.RevisionBlockAccounts2, onRevBlockAccounts2}, {icmodule.RevisionIISS4R0, onRevIISS4R0}, {icmodule.RevisionIISS4R1, onRevIISS4R1}, + {icmodule.RevisionFixIssueRegulator, onRevFixIssueRegulator}, } // DO NOT update revHandlerMap manually @@ -358,3 +362,38 @@ func onRevIISS4R1(s *chainScore, _, _ int) error { return nil } + +func onRevFixIssueRegulator(s *chainScore, _, _ int) error { + if s.cc.ChainID() != CIDForMainNet { + return nil + } + + cc := s.newCallContext(s.cc) + // deposit 6M to treasury + issueAmount := new(big.Int).Mul(icmodule.BigIntICX, big.NewInt(6_000_000)) + if err := cc.Deposit(cc.Treasury(), issueAmount, module.Issue); err != nil { + return err + } + // increase total supply + if _, err := cc.AddTotalSupply(issueAmount); err != nil { + return err + } + + // emit event logs + es := s.cc.GetExtensionState().(*iiss.ExtensionStateImpl) + issue, err := es.State.GetIssue() + if err != nil { + issue = icstate.NewIssue() + } + iiss.EmitICXIssuedEvent( + cc, + &iiss.IssueResultJSON{ + common.HexIntZero, + common.HexIntZero, + common.NewHexInt(0).SetValue(issueAmount), + }, + issue, + ) + + return nil +}