Skip to content

Commit

Permalink
v0.1.6
Browse files Browse the repository at this point in the history
  • Loading branch information
Dharitri-org committed Mar 22, 2024
1 parent 367e1b9 commit 734a9fe
Show file tree
Hide file tree
Showing 13 changed files with 740 additions and 463 deletions.
11 changes: 10 additions & 1 deletion builtInFunctions/changeOwnerAddress.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,16 @@ func (c *changeOwnerAddress) ProcessBuiltinFunction(
return nil, err
}

return &vmcommon.VMOutput{GasRemaining: gasRemaining, ReturnCode: vmcommon.Ok}, nil
vmOutput := &vmcommon.VMOutput{GasRemaining: gasRemaining, ReturnCode: vmcommon.Ok}
logEntry := &vmcommon.LogEntry{
Identifier: []byte(vmInput.Function),
Address: vmInput.RecipientAddr,
Topics: [][]byte{vmInput.Arguments[0]},
}
vmOutput.Logs = make([]*vmcommon.LogEntry, 0, 1)
vmOutput.Logs = append(vmOutput.Logs, logEntry)

return vmOutput, nil
}

func computeGasRemaining(snd vmcommon.UserAccountHandler, gasProvided uint64, gasToUse uint64) uint64 {
Expand Down
12 changes: 11 additions & 1 deletion builtInFunctions/changeOwnerAddress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"math/big"
"testing"

"github.com/Dharitri-org/drtg-core/core"
"github.com/Dharitri-org/drtg-core/core/check"
vmcommon "github.com/Dharitri-org/drtg-vm-common"
"github.com/Dharitri-org/drtg-vm-common/mock"
Expand Down Expand Up @@ -42,7 +43,8 @@ func TestChangeOwnerAddress_ProcessBuiltinFunction(t *testing.T) {

acc := mock.NewUserAccount(addr)
vmInput := &vmcommon.ContractCallInput{
VMInput: vmcommon.VMInput{CallerAddr: owner, CallValue: big.NewInt(0)},
Function: core.BuiltInFunctionChangeOwnerAddress,
VMInput: vmcommon.VMInput{CallerAddr: owner, CallValue: big.NewInt(0)},
}

_, err := coa.ProcessBuiltinFunction(nil, acc, vmInput)
Expand All @@ -63,10 +65,18 @@ func TestChangeOwnerAddress_ProcessBuiltinFunction(t *testing.T) {
require.Nil(t, err)
require.Equal(t, vmOutput.GasRemaining, uint64(0))

contractAddress := []byte("contract")
vmInput.RecipientAddr = contractAddress
coa.gasCost = 1
vmInput.GasProvided = 10
acc.OwnerAddress = owner
vmOutput, err = coa.ProcessBuiltinFunction(acc, acc, vmInput)
require.Nil(t, err)
require.Equal(t, vmOutput.GasRemaining, vmInput.GasProvided-coa.gasCost)

require.Equal(t, &vmcommon.LogEntry{
Identifier: []byte(core.BuiltInFunctionChangeOwnerAddress),
Address: contractAddress,
Topics: [][]byte{newAddr},
}, vmOutput.Logs[0])
}
22 changes: 20 additions & 2 deletions builtInFunctions/dctNFTTransfer.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,16 @@ func (e *dctNFTTransfer) ProcessBuiltinFunction(
vmOutput)
}

addDCTEntryInVMOutput(vmOutput, []byte(core.BuiltInFunctionDCTNFTTransfer), vmInput.Arguments[0], nonce, value, vmInput.CallerAddr, acntDst.AddressBytes())
addDCTEntryForTransferInVMOutput(
vmInput, vmOutput,
[]byte(core.BuiltInFunctionDCTNFTTransfer),
acntDst.AddressBytes(),
[]*TopicTokenData{{
vmInput.Arguments[0],
nonce,
value,
}},
)

return vmOutput, nil
}
Expand Down Expand Up @@ -297,7 +306,16 @@ func (e *dctNFTTransfer) processNFTTransferOnSenderShard(
return nil, err
}

addDCTEntryInVMOutput(vmOutput, []byte(core.BuiltInFunctionDCTNFTTransfer), vmInput.Arguments[0], nonce, quantityToTransfer, vmInput.CallerAddr, dstAddress)
addDCTEntryForTransferInVMOutput(
vmInput, vmOutput,
[]byte(core.BuiltInFunctionDCTNFTTransfer),
dstAddress,
[]*TopicTokenData{{
vmInput.Arguments[0],
nonce,
quantityToTransfer,
}},
)

return vmOutput, nil
}
Expand Down
31 changes: 28 additions & 3 deletions builtInFunctions/dctTransfer.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,16 @@ func (e *dctTransfer) ProcessBuiltinFunction(
vmInput.CallType,
vmOutput)

addDCTEntryInVMOutput(vmOutput, []byte(core.BuiltInFunctionDCTTransfer), tokenID, 0, value, vmInput.CallerAddr, acntDst.AddressBytes())
addDCTEntryForTransferInVMOutput(
vmInput, vmOutput,
[]byte(core.BuiltInFunctionDCTTransfer),
acntDst.AddressBytes(),
[]*TopicTokenData{{
tokenID,
0,
value,
}},
)
return vmOutput, nil
}

Expand All @@ -172,7 +181,15 @@ func (e *dctTransfer) ProcessBuiltinFunction(
vmOutput.GasRemaining = vmInput.GasProvided
}

addDCTEntryInVMOutput(vmOutput, []byte(core.BuiltInFunctionDCTTransfer), tokenID, 0, value, vmInput.CallerAddr, acntDst.AddressBytes())
addDCTEntryForTransferInVMOutput(
vmInput, vmOutput,
[]byte(core.BuiltInFunctionDCTTransfer),
acntDst.AddressBytes(),
[]*TopicTokenData{{
tokenID,
0,
value,
}})
return vmOutput, nil
}

Expand All @@ -189,7 +206,15 @@ func (e *dctTransfer) ProcessBuiltinFunction(
vmOutput)
}

addDCTEntryInVMOutput(vmOutput, []byte(core.BuiltInFunctionDCTTransfer), tokenID, 0, value, vmInput.CallerAddr, vmInput.RecipientAddr)
addDCTEntryForTransferInVMOutput(
vmInput, vmOutput,
[]byte(core.BuiltInFunctionDCTTransfer),
vmInput.RecipientAddr,
[]*TopicTokenData{{
tokenID,
0,
value,
}})
return vmOutput, nil
}

Expand Down
36 changes: 36 additions & 0 deletions builtInFunctions/logsAndEvents.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,42 @@ const (
dctRandomSequenceLength = 6
)

// TopicTokenData groups data that will end up in Topics section of LogEntry
type TopicTokenData struct {
TokenID []byte
Nonce uint64
Value *big.Int
}

func addDCTEntryForTransferInVMOutput(
vmInput *vmcommon.ContractCallInput,
vmOutput *vmcommon.VMOutput,
identifier []byte,
destination []byte,
topicTokenData []*TopicTokenData,
) {

topicTokenBytes := make([][]byte, 0)
for _, tokenData := range topicTokenData {
nonceBig := big.NewInt(0).SetUint64(tokenData.Nonce)
topicTokenBytes = append(topicTokenBytes, tokenData.TokenID, nonceBig.Bytes(), tokenData.Value.Bytes())
}
topicTokenBytes = append(topicTokenBytes, destination)

logEntry := &vmcommon.LogEntry{
Identifier: identifier,
Address: vmInput.CallerAddr,
Topics: topicTokenBytes,
Data: vmcommon.FormatLogDataForCall("", vmInput.Function, vmInput.Arguments),
}

if vmOutput.Logs == nil {
vmOutput.Logs = make([]*vmcommon.LogEntry, 0, 1)
}

vmOutput.Logs = append(vmOutput.Logs, logEntry)
}

func addDCTEntryInVMOutput(vmOutput *vmcommon.VMOutput, identifier []byte, tokenID []byte, nonce uint64, value *big.Int, args ...[]byte) {
entry := newEntryForDCT(identifier, tokenID, nonce, value, args...)

Expand Down
54 changes: 52 additions & 2 deletions builtInFunctions/multiDCTNFTTransfer.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ func (e *dctNFTMultiTransfer) ProcessBuiltinFunction(
return nil, err
}

topicTokenData := make([]*TopicTokenData, 0)
for i := uint64(0); i < numOfTransfers; i++ {
tokenStartIndex := startIndex + i*argumentsPerTransfer
tokenID := vmInput.Arguments[tokenStartIndex]
Expand Down Expand Up @@ -204,7 +205,31 @@ func (e *dctNFTMultiTransfer) ProcessBuiltinFunction(
}
}

addDCTEntryInVMOutput(vmOutput, []byte(core.BuiltInFunctionMultiDCTNFTTransfer), tokenID, nonce, value, vmInput.CallerAddr, acntDst.AddressBytes())
if e.enableEpochsHandler.IsScToScEventLogEnabled() {
topicTokenData = append(topicTokenData,
&TopicTokenData{
tokenID,
nonce,
value,
})
} else {
addDCTEntryInVMOutput(vmOutput,
[]byte(core.BuiltInFunctionMultiDCTNFTTransfer),
tokenID,
nonce,
value,
vmInput.CallerAddr,
acntDst.AddressBytes())
}
}

if e.enableEpochsHandler.IsScToScEventLogEnabled() {
addDCTEntryForTransferInVMOutput(
vmInput, vmOutput,
[]byte(core.BuiltInFunctionMultiDCTNFTTransfer),
acntDst.AddressBytes(),
topicTokenData,
)
}

// no need to consume gas on destination - sender already paid for it
Expand Down Expand Up @@ -280,6 +305,7 @@ func (e *dctNFTMultiTransfer) processDCTNFTMultiTransferOnSenderShard(
listDctData := make([]*dct.DCToken, numOfTransfers)
listTransferData := make([]*vmcommon.DCTTransfer, numOfTransfers)

topicTokenData := make([]*TopicTokenData, 0)
for i := uint64(0); i < numOfTransfers; i++ {
tokenStartIndex := startIndex + i*argumentsPerTransfer
if len(vmInput.Arguments[tokenStartIndex+2]) > core.MaxLenForDCTIssueMint && e.enableEpochsHandler.IsConsistentTokensValuesLengthCheckEnabled() {
Expand Down Expand Up @@ -308,7 +334,31 @@ func (e *dctNFTMultiTransfer) processDCTNFTMultiTransferOnSenderShard(
return nil, fmt.Errorf("%w for token %s", err, string(listTransferData[i].DCTTokenName))
}

addDCTEntryInVMOutput(vmOutput, []byte(core.BuiltInFunctionMultiDCTNFTTransfer), listTransferData[i].DCTTokenName, listTransferData[i].DCTTokenNonce, listTransferData[i].DCTValue, vmInput.CallerAddr, dstAddress)
if e.enableEpochsHandler.IsScToScEventLogEnabled() {
topicTokenData = append(topicTokenData,
&TopicTokenData{
listTransferData[i].DCTTokenName,
listTransferData[i].DCTTokenNonce,
listTransferData[i].DCTValue,
})
} else {
addDCTEntryInVMOutput(vmOutput,
[]byte(core.BuiltInFunctionMultiDCTNFTTransfer),
listTransferData[i].DCTTokenName,
listTransferData[i].DCTTokenNonce,
listTransferData[i].DCTValue,
vmInput.CallerAddr,
dstAddress)
}
}

if e.enableEpochsHandler.IsScToScEventLogEnabled() {
addDCTEntryForTransferInVMOutput(
vmInput, vmOutput,
[]byte(core.BuiltInFunctionMultiDCTNFTTransfer),
dstAddress,
topicTokenData,
)
}

if !check.IfNil(acntDst) {
Expand Down
83 changes: 83 additions & 0 deletions builtInFunctions/multiDCTNFTTransfer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ func createAccountsAdapterWithMap() vmcommon.AccountsAdapter {
}

func createDCTNFTMultiTransferWithMockArguments(selfShard uint32, numShards uint32, globalSettingsHandler vmcommon.ExtendedDCTGlobalSettingsHandler) *dctNFTMultiTransfer {
return createDCTNFTMultiTransferWithMockArgumentsWithLogEventFlag(selfShard, numShards, globalSettingsHandler, false)
}

func createDCTNFTMultiTransferWithMockArgumentsWithLogEventFlag(selfShard uint32, numShards uint32, globalSettingsHandler vmcommon.ExtendedDCTGlobalSettingsHandler, isScToScEventLogEnabled bool) *dctNFTMultiTransfer {
marshaller := &mock.MarshalizerMock{}
shardCoordinator := mock.NewMultiShardsCoordinatorMock(numShards)
shardCoordinator.CurrentShard = selfShard
Expand All @@ -79,6 +83,7 @@ func createDCTNFTMultiTransferWithMockArguments(selfShard uint32, numShards uint
IsDCTNFTImprovementV1FlagEnabledField: true,
IsTransferToMetaFlagEnabledField: false,
IsCheckCorrectTokenIDForTransferRoleFlagEnabledField: true,
IsScToScEventLogEnabledField: isScToScEventLogEnabled,
}
multiTransfer, _ := NewDCTNFTMultiTransferFunc(
1,
Expand Down Expand Up @@ -1104,3 +1109,81 @@ func TestComputeInsufficientQuantityDCTError(t *testing.T) {
require.NotNil(t, resErr)
require.Equal(t, errors.New("insufficient quantity for token: my-token-2 nonce 5").Error(), resErr.Error())
}

func TestDCTNFTMultiTransfer_LogEventsEpochActivationTest(t *testing.T) {
t.Parallel()

vmOutput, err := runMultiTransfer(t, false)
require.Nil(t, err)
require.Equal(t, vmcommon.Ok, vmOutput.ReturnCode)

require.Equal(t, 2, len(vmOutput.Logs))
require.Equal(t, []byte("MultiDCTNFTTransfer"), vmOutput.Logs[0].Identifier)
require.Equal(t, 4, len(vmOutput.Logs[0].Topics))
require.Equal(t, []byte("token1"), vmOutput.Logs[0].Topics[0])
require.Equal(t, []byte("MultiDCTNFTTransfer"), vmOutput.Logs[1].Identifier)
require.Equal(t, 4, len(vmOutput.Logs[1].Topics))
require.Equal(t, []byte("token2"), vmOutput.Logs[1].Topics[0])

vmOutput, err = runMultiTransfer(t, true)
require.Nil(t, err)
require.Equal(t, vmcommon.Ok, vmOutput.ReturnCode)

require.Equal(t, 1, len(vmOutput.Logs))
require.Equal(t, []byte("MultiDCTNFTTransfer"), vmOutput.Logs[0].Identifier)
require.Equal(t, 7, len(vmOutput.Logs[0].Topics))
require.Equal(t, []byte("token1"), vmOutput.Logs[0].Topics[0])
require.Equal(t, []byte("token2"), vmOutput.Logs[0].Topics[3])
}

func runMultiTransfer(t *testing.T, isScToScEventLogEnabled bool) (*vmcommon.VMOutput, error) {
payableHandler := &mock.PayableHandlerStub{
IsPayableCalled: func(address []byte) (bool, error) {
return true, nil
},
}

multiTransferSenderShard := createDCTNFTMultiTransferWithMockArgumentsWithLogEventFlag(0, 2, &mock.GlobalSettingsHandlerStub{}, isScToScEventLogEnabled)
_ = multiTransferSenderShard.SetPayableChecker(payableHandler)

multiTransferDestinationShard := createDCTNFTMultiTransferWithMockArgumentsWithLogEventFlag(1, 2, &mock.GlobalSettingsHandlerStub{}, isScToScEventLogEnabled)
_ = multiTransferDestinationShard.SetPayableChecker(payableHandler)

senderAddress := bytes.Repeat([]byte{2}, 32) // sender is in the same shard
destinationAddress := bytes.Repeat([]byte{1}, 32)
sender, err := multiTransferSenderShard.accounts.LoadAccount(senderAddress)
require.Nil(t, err)

token1 := []byte("token1")
token2 := []byte("token2")
tokenNonce := uint64(1)
token2Nonce := uint64(2)

initialTokens := big.NewInt(3)
createDCTNFTToken(token1, core.NonFungible, tokenNonce, initialTokens, multiTransferSenderShard.marshaller, sender.(vmcommon.UserAccountHandler))
createDCTNFTToken(token2, core.NonFungible, token2Nonce, initialTokens, multiTransferSenderShard.marshaller, sender.(vmcommon.UserAccountHandler))

_ = multiTransferSenderShard.accounts.SaveAccount(sender)
_, _ = multiTransferSenderShard.accounts.Commit()

// reload sender account
sender, err = multiTransferSenderShard.accounts.LoadAccount(senderAddress)
require.Nil(t, err)

nonceBytes := big.NewInt(int64(tokenNonce)).Bytes()
nonce2Bytes := big.NewInt(int64(token2Nonce)).Bytes()
quantityBytes := big.NewInt(1).Bytes()
vmInput := &vmcommon.ContractCallInput{
VMInput: vmcommon.VMInput{
CallValue: big.NewInt(0),
CallerAddr: senderAddress,
Arguments: [][]byte{destinationAddress, big.NewInt(2).Bytes(),
token1, nonceBytes, quantityBytes,
token2, nonce2Bytes, quantityBytes},
GasProvided: 100000,
},
RecipientAddr: senderAddress,
}

return multiTransferSenderShard.ProcessBuiltinFunction(sender.(vmcommon.UserAccountHandler), nil, vmInput)
}

0 comments on commit 734a9fe

Please sign in to comment.